Google मानचित्र: देश, राज्य / प्रांत / क्षेत्र, शहर को कैसे प्राप्त करें?


107

मुझे उन देशों, राज्यों और शहरों की सूची की आवश्यकता है जो मेरे पास लम्बे / लंबे मूल्यों के संग्रह के आधार पर हैं। मुझे इस जानकारी को इस तरीके से संग्रहीत करने की आवश्यकता है कि पदानुक्रम संरक्षित है और डुप्लिकेट के बिना (जैसे "यूएसए" और "संयुक्त राज्य अमेरिका" और "संयुक्त राज्य अमेरिका" एक ही देश हैं; मैं केवल अपने डेटाबेस में इस देश का एक उदाहरण चाहता हूं) ।

क्या Google Map API से ऐसा करना संभव है?


क्या आपको प्रांत मिला?
दीपक ढोलियान

जवाबों:


135

आप जो खोज रहे हैं उसे रिवर्स जियोकोडिंग कहा जाता है । Google Google जियोकोडिंग एपीआई के माध्यम से सर्वर-साइड रिवर्स जियोकोडिंग सेवा प्रदान करता है , जिसे आपको अपनी परियोजना के लिए उपयोग करने में सक्षम होना चाहिए।

यह निम्न अनुरोध की प्रतिक्रिया कैसी होगी:

http://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452&sensor=false

उत्तर:

{
  "status": "OK",
  "results": [ {
    "types": [ "street_address" ],
    "formatted_address": "275-291 Bedford Ave, Brooklyn, NY 11211, USA",
    "address_components": [ {
      "long_name": "275-291",
      "short_name": "275-291",
      "types": [ "street_number" ]
    }, {
      "long_name": "Bedford Ave",
      "short_name": "Bedford Ave",
      "types": [ "route" ]
    }, {
      "long_name": "New York",
      "short_name": "New York",
      "types": [ "locality", "political" ]
    }, {
      "long_name": "Brooklyn",
      "short_name": "Brooklyn",
      "types": [ "administrative_area_level_3", "political" ]
    }, {
      "long_name": "Kings",
      "short_name": "Kings",
      "types": [ "administrative_area_level_2", "political" ]
    }, {
      "long_name": "New York",
      "short_name": "NY",
      "types": [ "administrative_area_level_1", "political" ]
    }, {
      "long_name": "United States",
      "short_name": "US",
      "types": [ "country", "political" ]
    }, {
      "long_name": "11211",
      "short_name": "11211",
      "types": [ "postal_code" ]
    } ],
    "geometry": {
      "location": {
        "lat": 40.7142298,
        "lng": -73.9614669
      },
      "location_type": "RANGE_INTERPOLATED",
      "viewport": {
        "southwest": {
          "lat": 40.7110822,
          "lng": -73.9646145
        },
        "northeast": {
          "lat": 40.7173774,
          "lng": -73.9583193
        }
      }
    }
  },

  ... Additional results[] ...

आप केवल अनुरोध के रूप में xml के लिए json को प्रतिस्थापित करके, json के बजाय xml में प्रतिक्रिया प्राप्त करने का विकल्प चुन सकते हैं।

http://maps.googleapis.com/maps/api/geocode/xml?latlng=40.714224,-73.961452&sensor=false

जहां तक ​​मुझे पता है, Google भी पता घटकों के लिए एक ही नाम लौटाएगा, विशेष रूप से देश के नाम और शहर के नाम जैसे उच्च-स्तरीय नामों के लिए। फिर भी, ध्यान रखें कि अधिकांश अनुप्रयोगों के लिए परिणाम बहुत सटीक हैं, फिर भी आप कभी-कभी वर्तनी की गलती या अस्पष्ट परिणाम पा सकते हैं।


धन्यवाद! मेरे पास लाट / लंबे समय का यह संग्रह वास्तव में मेरे डेटाबेस में उपयोगकर्ता प्रोफाइल के साथ जुड़ा हुआ है। क्या आप जानते हैं कि मैं एक खोज सुविधा कैसे लागू कर सकता हूं जो उपयोगकर्ताओं को एक निर्दिष्ट स्थान के भीतर अन्य उपयोगकर्ताओं को खोजने की अनुमति देगा (जैसे ब्रुकलिन, एनवाई में सभी उपयोगकर्ता खोजें)? याद रखें, मेरे पास सभी अक्षांश / देशांतर हैं।
StackOverflowNewbie 11

1
@StackOverflowNewbie: आप अपने सभी लाट / लोंगों को जियोकोड को उल्टा करना चाहते हैं, और अपने डेटाबेस में "शहर", "राज्य", "देश" फ़ील्ड भर सकते हैं। तो बस अपने डेटाबेस में इन क्षेत्रों पर एक फिल्टर करते हैं।
डैनियल वेसलो

1
या आप भूगोल जैसे स्थानिक डेटाटाइप का उपयोग कर सकते हैं यदि आप एमएस एसक्यूएल 2008 पर मुकदमा कर रहे हैं और एक बिंदु के पास स्थान खोजने की आवश्यकता है
गिब्बो

1
प्रतिक्रिया में शहर और देश की सूचकांक संख्या के बारे में आप कैसे सुनिश्चित हो सकते हैं? यह बदलता रहता है, जैसे कि यदि किसी क्षेत्र में उप क्षेत्र है तो सूचकांक कुंजियाँ बदल जाती हैं
खान शाहरुख

4
क्या करता sensor=falseहै
CENT1PEDE

21

आपके पास यहां एक मूल उत्तर है: जियोलोकेशन का उपयोग करके शहर का नाम प्राप्त करें

लेकिन आप जिस चीज की तलाश कर रहे हैं, उसके लिए मैं इस तरह की सलाह दूंगा।

यदि आपको पेरिस, टेक्सास, यूएस और पेरिस, इले-डी-फ्रांस, फ्रांस के लिए अलग-अलग चीजों को स्टोर करने और मैन्युअल कमबैक प्रदान करने के लिए केवल व्यवस्थापकीय_रेल_लेवल_1 की आवश्यकता है:

-

मीकल के तरीके में एक समस्या है, जिसमें यह पहला परिणाम लेता है, विशेष रूप से नहीं। वह परिणामों का उपयोग करता है [को ०]। जिस तरह से मैं फिट दिख रहा हूं (मैंने उसके कोड को संशोधित किया है) केवल उसी परिणाम को लेने के लिए है जिसका प्रकार "स्थानीयता" है, जो हमेशा मौजूद रहता है, यहां तक ​​कि एक मामले में भी जब ब्राउज़र भू-स्थान का समर्थन नहीं करता है, तो एक मैनुअल मैनुअल कमबैक में।

अपने तरीके से: प्राप्त किए गए परिणामों का उपयोग से अलग हैं http://maps.googleapis.com/maps/api/geocode/json?address=bucharest&sensor=false का उपयोग करने से से http://maps.googleapis.com/maps/api/geocode /json?latlng=44.42514,26.10540&sensor=false (नाम से खोज / lat और lng द्वारा खोज)

इस तरह: समान परिणाम मिले।

<!DOCTYPE html> 
<html> 
<head> 
<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
<title>Reverse Geocoding</title> 

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript"> 
  var geocoder;

  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(successFunction, errorFunction);
} 
//Get the latitude and the longitude;
function successFunction(position) {
    var lat = position.coords.latitude;
    var lng = position.coords.longitude;
    codeLatLng(lat, lng)
}

function errorFunction(){
    alert("Geocoder failed");
}

  function initialize() {
    geocoder = new google.maps.Geocoder();



  }

  function codeLatLng(lat, lng) {

    var latlng = new google.maps.LatLng(lat, lng);
    geocoder.geocode({'latLng': latlng}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
      //console.log(results);
        if (results[1]) {
        var indice=0;
        for (var j=0; j<results.length; j++)
        {
            if (results[j].types[0]=='locality')
                {
                    indice=j;
                    break;
                }
            }
        alert('The good number is: '+j);
        console.log(results[j]);
        for (var i=0; i<results[j].address_components.length; i++)
            {
                if (results[j].address_components[i].types[0] == "locality") {
                        //this is the object you are looking for City
                        city = results[j].address_components[i];
                    }
                if (results[j].address_components[i].types[0] == "administrative_area_level_1") {
                        //this is the object you are looking for State
                        region = results[j].address_components[i];
                    }
                if (results[j].address_components[i].types[0] == "country") {
                        //this is the object you are looking for
                        country = results[j].address_components[i];
                    }
            }

            //city data
            alert(city.long_name + " || " + region.long_name + " || " + country.short_name)


            } else {
              alert("No results found");
            }
        //}
      } else {
        alert("Geocoder failed due to: " + status);
      }
    });
  }
</script> 
</head> 
<body onload="initialize()"> 

</body> 
</html> 

यह मेरा दिन बचाता है
एंडी एआर

4

मैंने इस प्रश्न का उपयोग अपने स्वयं के समाधान के लिए एक प्रारंभिक बिंदु के रूप में किया। सोचा था कि टैबेकिटू की तुलना में छोटे होने के बाद से मेरे कोड को वापस योगदान देना उचित था

निर्भरता:

कोड:

if(geoPosition.init()){  

    var foundLocation = function(city, state, country, lat, lon){
        //do stuff with your location! any of the first 3 args may be null
        console.log(arguments);
    }

    var geocoder = new google.maps.Geocoder(); 
    geoPosition.getCurrentPosition(function(r){
        var findResult = function(results, name){
            var result =  _.find(results, function(obj){
                return obj.types[0] == name && obj.types[1] == "political";
            });
            return result ? result.short_name : null;
        };
        geocoder.geocode({'latLng': new google.maps.LatLng(r.coords.latitude, r.coords.longitude)}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK && results.length) {
                results = results[0].address_components;
                var city = findResult(results, "locality");
                var state = findResult(results, "administrative_area_level_1");
                var country = findResult(results, "country");
                foundLocation(city, state, country, r.coords.latitude, r.coords.longitude);
            } else {
                foundLocation(null, null, null, r.coords.latitude, r.coords.longitude);
            }
        });
    }, { enableHighAccuracy:false, maximumAge: 1000 * 60 * 1 });
}

3

जब मैंने इसे अपनी जेएसपी फाइलों में शामिल किया तो मुझे जियोकोडर जावास्क्रिप्ट थोड़ी छोटी लगी।

आप यह भी आज़मा सकते हैं:



    var lat = "43.7667855" ;
    var long = "-79.2157321" ;
    var url = "https://maps.googleapis.com/maps/api/geocode/json?latlng="
       +lat+","+long+"&sensor=false";
    $.get(url).success(function(data) {
       var loc1 = data.results[0];
       var county, city;
         $.each(loc1, function(k1,v1) {
            if (k1 == "address_components") {
               for (var i = 0; i < v1.length; i++) {
                  for (k2 in v1[i]) {
                     if (k2 == "types") {
                        var types = v1[i][k2];
                        if (types[0] =="sublocality_level_1") {
                            county = v1[i].long_name;
                            //alert ("county: " + county);
                        } 
                        if (types[0] =="locality") {
                           city = v1[i].long_name;
                           //alert ("city: " + city);
                       } 
                     }

                  }          

               }

            }

         });
         $('#city').html(city); 
    }); 


एक छोटी सी ठीक, परिवर्तन $.get(url).success(function(data)करने के लिए $.get(url, function(data)और यह अच्छी तरह काम कर रहा है
कीमती टॉम

3

मैंने यह फ़ंक्शन लिखा है कि address_componentsgmaps API से दिए गए रिटर्न के आधार पर आप जो भी ढूंढ रहे हैं वह निकालता है। यह शहर है (उदाहरण के लिए)।

export const getAddressCity = (address, length) => {
  const findType = type => type.types[0] === "locality"
  const location = address.map(obj => obj)
  const rr = location.filter(findType)[0]

  return (
    length === 'short'
      ? rr.short_name
      : rr.long_name
  )
}

बदलें localityकरने के लिए administrative_area_level_1राज्य के लिए आदि

मेरे जेएस कोड में मैं ऐसा उपयोग कर रहा हूं:

const location =`${getAddressCity(address_components, 'short')}, ${getAddressState(address_components, 'short')}`

वापस होगा: Waltham, MA


0

बस इस कोड की कोशिश करो यह कोड मेरे साथ काम करता है

var posOptions = {timeout: 10000, enableHighAccuracy: false};
$cordovaGeolocation.getCurrentPosition(posOptions).then(function (position) {
var lat = position.coords.latitude;
var long = position.coords.longitude;
 //console.log(lat +"          "+long);
$http.get('https://maps.googleapis.com/maps/api/geocode/json?latlng=' + lat + ',' + long + '&key=your key here').success(function (output) {
//console.log( JSON.stringify(output.results[0]));
//console.log( JSON.stringify(output.results[0].address_components[4].short_name));
var results = output.results;
if (results[0]) {
//console.log("results.length= "+results.length);
//console.log("hi "+JSON.stringify(results[0],null,4));
for (var j = 0; j < results.length; j++){
 //console.log("j= "+j);
//console.log(JSON.stringify(results[j],null,4));
for (var i = 0; i < results[j].address_components.length; i++){
 if(results[j].address_components[i].types[0] == "country") {
 //this is the object you are looking for
  country = results[j].address_components[i];
 }
 }
 }
 console.log(country.long_name);
 console.log(country.short_name);
 } else {
 alert("No results found");
 console.log("No results found");
 }
 });
 }, function (err) {
 });

0

मैंने एक छोटा सा मैपर फ़ंक्शन बनाया है:

private getAddressParts(object): Object {
    let address = {};
    const address_components = object.address_components;
    address_components.forEach(element => {
        address[element.types[0]] = element.short_name;
    });
    return address;
}

यह कोणीय 4 के लिए एक समाधान है, लेकिन मुझे लगता है कि आपको विचार मिलेगा।

उपयोग:

geocoder.geocode({ 'location' : latlng }, (results, status) => {
    if (status === google.maps.GeocoderStatus.OK) {
        const address = {
            formatted_address: results[0].formatted_address,
            address_parts: this.getAddressParts(results[0])
        };
        (....)
    }

इस तरह addressवस्तु कुछ इस तरह होगी:

address: {
    address_parts: {
        administrative_area_level_1: "NY",
        administrative_area_level_2: "New York County",
        country: "US",
        locality: "New York",
        neighborhood: "Lower Manhattan",
        political: "Manhattan",
        postal_code: "10038",
        route: "Beekman St",
        street_number: "90",
    },
    formatted_address: "90 Beekman St, New York, NY 10038, USA"
}

आशा करता हूँ की ये काम करेगा!


0
 <div id="location"></div>
        <script>
            window.onload = function () {
                var startPos;
                var geoOptions = {
                    maximumAge: 5 * 60 * 1000,
                    timeout: 10 * 1000,
                    enableHighAccuracy: true
                }


                var geoSuccess = function (position) {
                    startPos = position;
                    geocodeLatLng(startPos.coords.latitude, startPos.coords.longitude);

                };
                var geoError = function (error) {
                    console.log('Error occurred. Error code: ' + error.code);
                    // error.code can be:
                    //   0: unknown error
                    //   1: permission denied
                    //   2: position unavailable (error response from location provider)
                    //   3: timed out
                };

                navigator.geolocation.getCurrentPosition(geoSuccess, geoError, geoOptions);
            };
            function geocodeLatLng(lat, lng) {
                var geocoder = new google.maps.Geocoder;
                var latlng = {lat: parseFloat(lat), lng: parseFloat(lng)};
                geocoder.geocode({'location': latlng}, function (results, status) {
                    if (status === 'OK') {
                        console.log(results)
                        if (results[0]) {
                            document.getElementById('location').innerHTML = results[0].formatted_address;
                            var street = "";
                            var city = "";
                            var state = "";
                            var country = "";
                            var zipcode = "";
                            for (var i = 0; i < results.length; i++) {
                                if (results[i].types[0] === "locality") {
                                    city = results[i].address_components[0].long_name;
                                    state = results[i].address_components[2].long_name;

                                }
                                if (results[i].types[0] === "postal_code" && zipcode == "") {
                                    zipcode = results[i].address_components[0].long_name;

                                }
                                if (results[i].types[0] === "country") {
                                    country = results[i].address_components[0].long_name;

                                }
                                if (results[i].types[0] === "route" && street == "") {

                                    for (var j = 0; j < 4; j++) {
                                        if (j == 0) {
                                            street = results[i].address_components[j].long_name;
                                        } else {
                                            street += ", " + results[i].address_components[j].long_name;
                                        }
                                    }

                                }
                                if (results[i].types[0] === "street_address") {
                                    for (var j = 0; j < 4; j++) {
                                        if (j == 0) {
                                            street = results[i].address_components[j].long_name;
                                        } else {
                                            street += ", " + results[i].address_components[j].long_name;
                                        }
                                    }

                                }
                            }
                            if (zipcode == "") {
                                if (typeof results[0].address_components[8] !== 'undefined') {
                                    zipcode = results[0].address_components[8].long_name;
                                }
                            }
                            if (country == "") {
                                if (typeof results[0].address_components[7] !== 'undefined') {
                                    country = results[0].address_components[7].long_name;
                                }
                            }
                            if (state == "") {
                                if (typeof results[0].address_components[6] !== 'undefined') {
                                    state = results[0].address_components[6].long_name;
                                }
                            }
                            if (city == "") {
                                if (typeof results[0].address_components[5] !== 'undefined') {
                                    city = results[0].address_components[5].long_name;
                                }
                            }

                            var address = {
                                "street": street,
                                "city": city,
                                "state": state,
                                "country": country,
                                "zipcode": zipcode,
                            };

                            document.getElementById('location').innerHTML = document.getElementById('location').innerHTML + "<br/>Street : " + address.street + "<br/>City : " + address.city + "<br/>State : " + address.state + "<br/>Country : " + address.country + "<br/>zipcode : " + address.zipcode;
                            console.log(address);
                        } else {
                            window.alert('No results found');
                        }
                    } else {
                        window.alert('Geocoder failed due to: ' + status);
                    }
                });
            }
        </script>

        <script async defer
                src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY">
        </script>

0

@ स्ज़िकता के पास एक फ़ंक्शन बनाने के द्वारा एक महान समाधान था जिसे एक नामित सरणी में पता भागों मिलता है। यहाँ उन लोगों के लिए एक संकलित समाधान है जो सादे जावास्क्रिप्ट का उपयोग करना चाहते हैं।

नामित सरणी में परिणाम परिवर्तित करने का कार्य:

function getAddressParts(obj) {

    var address = [];

    obj.address_components.forEach( function(el) {
        address[el.types[0]] = el.short_name;
    });

    return address;

} //getAddressParts()

जियोटोड द लाट / एलएनजी मूल्य:

geocoder.geocode( { 'location' : latlng }, function(results, status) {

    if (status == google.maps.GeocoderStatus.OK) {
        var addressParts =  getAddressParts(results[0]);

        // the city
        var city = addressParts.locality;

        // the state
        var state = addressParts.administrative_area_level_1;
    }

});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.