Google Maps: วิธีรับประเทศรัฐ / จังหวัด / ภูมิภาคเมืองให้เป็นค่า lat / long


107

ฉันต้องการรายชื่อประเทศรัฐและเมืองตามชุดค่า lat / long ที่ฉันมี ฉันต้องการจัดเก็บข้อมูลนี้ในลักษณะที่มีการรักษาลำดับชั้นไว้และไม่มีข้อมูลซ้ำกัน (เช่น "USA" และ "United States" และ "United States of America" ​​เป็นประเทศเดียวกันฉันต้องการเพียงตัวอย่างเดียวของประเทศนี้ในฐานข้อมูลของฉัน) .

สามารถใช้ Google Map API ได้หรือไม่


ได้จังหวัดหรือเปล่า?
Deepak Dholiyan

คำตอบ:


135

สิ่งที่คุณกำลังมองหาที่เรียกว่าReverse Geocoding Google ให้บริการ geocoding ย้อนกลับฝั่งเซิร์ฟเวอร์ผ่านGoogle Geocoding APIซึ่งคุณควรจะใช้สำหรับโครงการของคุณได้

นี่คือลักษณะการตอบสนองต่อคำขอต่อไปนี้:

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 ใน URI คำขอ:

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

เท่าที่ฉันทราบ Google จะส่งคืนชื่อเดิมสำหรับส่วนประกอบที่อยู่โดยเฉพาะสำหรับชื่อระดับสูงเช่นชื่อประเทศและชื่อเมือง อย่างไรก็ตามโปรดทราบว่าแม้ว่าผลลัพธ์จะแม่นยำมากสำหรับแอปพลิเคชันส่วนใหญ่ แต่คุณยังคงพบว่ามีการสะกดผิดหรือผลลัพธ์ที่ไม่ชัดเจนในบางครั้ง


ขอบคุณ! คอลเลกชันของ lat / long ที่ฉันมีจริงเกี่ยวข้องกับโปรไฟล์ผู้ใช้ในฐานข้อมูลของฉัน คุณรู้หรือไม่ว่าฉันจะใช้คุณลักษณะการค้นหาที่ช่วยให้ผู้ใช้สามารถค้นหาผู้ใช้รายอื่นภายในตำแหน่งที่ระบุได้อย่างไร (เช่นค้นหาผู้ใช้ทั้งหมดใน Brooklyn, NY) จำไว้ว่าทั้งหมดที่ฉันมีคือ lat / longs
StackOverflowNewbie

1
@StackOverflowNewbie: คุณอาจต้องการย้อนรหัสพิกัดทางภูมิศาสตร์ย้อนกลับ lat / longs ทั้งหมดของคุณและกรอกฟิลด์ "เมือง" "รัฐ" "ประเทศ" ในฐานข้อมูลของคุณ จากนั้นทำการกรองฟิลด์เหล่านี้ในฐานข้อมูลของคุณ
Daniel Vassallo

1
หรือคุณสามารถใช้ประเภทข้อมูลเชิงพื้นที่เช่นภูมิศาสตร์หากคุณกำลังฟ้อง MS Sql 2008 และต้องการค้นหาตำแหน่งใกล้จุด
GibboK

1
คุณจะแน่ใจได้อย่างไรเกี่ยวกับหมายเลขดัชนีของเมืองและประเทศในการตอบกลับ มันเปลี่ยนไปเรื่อย ๆ เช่นถ้าบางพื้นที่มีพื้นที่ย่อยแล้วปุ่มดัชนีก็เปลี่ยนไป
Khan Shahrukh

4
สิ่งที่ไม่sensor=falseทำอะไร?
CENT1PEDE

21

คุณมีคำตอบพื้นฐานที่นี่: ชื่อเมืองโดยใช้ตำแหน่งทางภูมิศาสตร์

แต่สำหรับสิ่งที่คุณกำลังมองหาฉันขอแนะนำวิธีนี้

เฉพาะในกรณีที่คุณต้องการแอดมิน _area_level_1 เพื่อจัดเก็บสิ่งต่างๆสำหรับปารีสเท็กซัสสหรัฐอเมริกาและปารีสอิล - เดอ - ฟรองซ์ฝรั่งเศสและให้ข้อมูลสำรองด้วยตนเอง:

-

มีปัญหาในทางของมิคาลคือต้องใช้ผลลัพธ์แรกไม่ใช่ผลลัพธ์ที่เฉพาะเจาะจง เขาใช้ผลลัพธ์ [0] วิธีที่ฉันเห็นว่าเหมาะสม (ฉันเพิ่งแก้ไขรหัสของเขา) คือรับเฉพาะผลลัพธ์ที่มีประเภท "ท้องที่" ซึ่งจะปรากฏอยู่เสมอแม้ในทางเลือกสำรองด้วยตนเองในที่สุดในกรณีที่เบราว์เซอร์ไม่รองรับการระบุตำแหน่งทางภูมิศาสตร์

วิธีของเขา: ผลลัพธ์ที่ดึงมานั้นแตกต่างจากการใช้ 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> 

นี่ช่วยประหยัดวันของฉัน
Andi AR

4

ฉันใช้คำถามนี้เป็นจุดเริ่มต้นสำหรับการแก้ปัญหาของตัวเอง คิดว่าเหมาะสมที่จะให้รหัสของฉันกลับมาเนื่องจากมีขนาดเล็กกว่าของ tabacitu

การพึ่งพา:

รหัส:

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

ฉันพบจาวาสคริปต์ GeoCoder มีข้อผิดพลาดเล็กน้อยเมื่อรวมไว้ในไฟล์ jsp

คุณยังสามารถลองสิ่งนี้:



    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)และใช้งานได้ดี
Precious Tom

3

ฉันเขียนฟังก์ชั่นนี้ที่ดึงสิ่งที่คุณกำลังมองหาโดยอิงจากสิ่งที่address_componentsส่งคืนจาก gmaps 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สำหรับรัฐเป็นต้น

ในรหัส js ของฉันฉันใช้ดังนี้:

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

ฉันได้สร้างฟังก์ชัน mapper ขนาดเล็ก:

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;
}

เป็นวิธีแก้ปัญหาสำหรับ Angular 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

@ Szkítaมีโซลูชันที่ยอดเยี่ยมโดยการสร้างฟังก์ชันที่รับส่วนที่อยู่ในอาร์เรย์ที่มีชื่อ นี่คือโซลูชันที่รวบรวมไว้สำหรับผู้ที่ต้องการใช้ JavaScript ธรรมดา

ฟังก์ชั่นแปลงผลลัพธ์เป็นอาร์เรย์ที่ตั้งชื่อ:

function getAddressParts(obj) {

    var address = [];

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

    return address;

} //getAddressParts()

Geocode ค่า LAT / LNG:

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;
    }

});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.