위도 및 경도 지점에서 도시 이름을 얻으려면 어떻게해야합니까?


답변:


118

이를 역 지오 코딩 이라고합니다.


대박! 나는 이것에 대해 읽었고 이제 너무 많은 쿼리가 올 것입니다.) 감사합니다.
Dennis Martinez

javascript API를 사용하는 경우 IP 주소 및 단일 사용자 당은 동일하지만 예를 들어 PHP를 사용하고 이러한 제한에 도달 할 것이라고 생각하는 경우 요청을 초당 1로 제한하거나 사용해야합니다. 프록시 서버이지만 프록시에주의하십시오 .Google은 어리석지 않으며 망치질 수 없습니다. 여기에 더 많은 정보 : developers.google.com/maps/documentation/business/articles/...
앤디 지

26

다음은 전체 샘플입니다.

<!DOCTYPE html>
<html>
  <head>
    <title>Geolocation API with Google Maps API</title>
    <meta charset="UTF-8" />
  </head>
  <body>
    <script>
      function displayLocation(latitude,longitude){
        var request = new XMLHttpRequest();

        var method = 'GET';
        var url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='+latitude+','+longitude+'&sensor=true';
        var async = true;

        request.open(method, url, async);
        request.onreadystatechange = function(){
          if(request.readyState == 4 && request.status == 200){
            var data = JSON.parse(request.responseText);
            var address = data.results[0];
            document.write(address.formatted_address);
          }
        };
        request.send();
      };

      var successCallback = function(position){
        var x = position.coords.latitude;
        var y = position.coords.longitude;
        displayLocation(x,y);
      };

      var errorCallback = function(error){
        var errorMessage = 'Unknown error';
        switch(error.code) {
          case 1:
            errorMessage = 'Permission denied';
            break;
          case 2:
            errorMessage = 'Position unavailable';
            break;
          case 3:
            errorMessage = 'Timeout';
            break;
        }
        document.write(errorMessage);
      };

      var options = {
        enableHighAccuracy: true,
        timeout: 1000,
        maximumAge: 0
      };

      navigator.geolocation.getCurrentPosition(successCallback,errorCallback,options);
    </script>
  </body>
</html>

사용자 승인없이 위도와 경도에서 사용자 위치를 찾을 수있는 방법이 있습니까?
Vikas Verma 2014 년

8
@VikasVerma의 동의없이 사용자 위치를 찾을 수있는 경우 심각한 개인 정보 침해가 될 수 있습니다.
omerio

@omerio 고맙지 만 계속 진행하려면 사용자가 허용을 클릭하도록 코드를 작성했습니다.
Vikas Verma 2014 년

1
이것은 실제로 정확한 집 주소를 제공했습니다. 정확히 내가 원하는 것. 시 /도 또는 우편 번호를 어떻게 추출합니까?
ydobonebi 2015

6

node.js에서는 node-geocoder npm 모듈을 사용할 수 있습니다. 을 하여 lat, lng.,

geo.js

var NodeGeocoder = require('node-geocoder');

var options = {
  provider: 'google',
  httpAdapter: 'https', // Default
  apiKey: ' ', // for Mapquest, OpenCage, Google Premier
  formatter: 'json' // 'gpx', 'string', ...
};

var geocoder = NodeGeocoder(options);

geocoder.reverse({lat:28.5967439, lon:77.3285038}, function(err, res) {
  console.log(res);
});

산출:

노드 geo.js

[ { formattedAddress: 'C-85B, C Block, Sector 8, Noida, Uttar Pradesh 201301, India',
    latitude: 28.5967439,
    longitude: 77.3285038,
    extra: 
     { googlePlaceId: 'ChIJkTdx9vzkDDkRx6LVvtz1Rhk',
       confidence: 1,
       premise: 'C-85B',
       subpremise: null,
       neighborhood: 'C Block',
       establishment: null },
    administrativeLevels: 
     { level2long: 'Gautam Buddh Nagar',
       level2short: 'Gautam Buddh Nagar',
       level1long: 'Uttar Pradesh',
       level1short: 'UP' },
    city: 'Noida',
    country: 'India',
    countryCode: 'IN',
    zipcode: '201301',
    provider: 'google' } ]

매우 명확하고 작동하는 피드백에 감사드립니다. 'node-geocoder'와 '@ google / maps'를 선택하는 데 차이가 있습니까? 그래도 동일한 작업을 수행하는 것으로 보입니다
Ade

1
두 출력 모두 동일하지만 node-geocoder는 주소를 가져 오는 단순화 된 모듈이고 @ google / maps는 구성해야하는 주소를 가져 오는 api입니다.
KARTHIKEYAN.A


4

다음은 promise를 사용하는 최신 솔루션입니다.

function getAddress (latitude, longitude) {
    return new Promise(function (resolve, reject) {
        var request = new XMLHttpRequest();

        var method = 'GET';
        var url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' + latitude + ',' + longitude + '&sensor=true';
        var async = true;

        request.open(method, url, async);
        request.onreadystatechange = function () {
            if (request.readyState == 4) {
                if (request.status == 200) {
                    var data = JSON.parse(request.responseText);
                    var address = data.results[0];
                    resolve(address);
                }
                else {
                    reject(request.status);
                }
            }
        };
        request.send();
    });
};

다음과 같이 부릅니다.

getAddress(lat, lon).then(console.log).catch(console.error);

promise는 'then'의 주소 개체 또는 'catch'의 오류 상태 코드를 반환합니다.


3
액세스 키 없이는 작동하지 않습니다. 센서 매개 변수도 더 이상 사용되지 않습니다
Joro Tenev 2018-04-24

실제로 작동하지 않습니다
ProgrammingHobby

3

다음 코드는 도시 이름을 가져 오는 데 잘 작동합니다 ( Google Map Geo API 사용 ).

HTML

<p><button onclick="getLocation()">Get My Location</button></p>
<p id="demo"></p>
<script src="http://maps.google.com/maps/api/js?key=YOUR_API_KEY"></script>

스크립트

var x=document.getElementById("demo");
function getLocation(){
    if (navigator.geolocation){
        navigator.geolocation.getCurrentPosition(showPosition,showError);
    }
    else{
        x.innerHTML="Geolocation is not supported by this browser.";
    }
}

function showPosition(position){
    lat=position.coords.latitude;
    lon=position.coords.longitude;
    displayLocation(lat,lon);
}

function showError(error){
    switch(error.code){
        case error.PERMISSION_DENIED:
            x.innerHTML="User denied the request for Geolocation."
        break;
        case error.POSITION_UNAVAILABLE:
            x.innerHTML="Location information is unavailable."
        break;
        case error.TIMEOUT:
            x.innerHTML="The request to get user location timed out."
        break;
        case error.UNKNOWN_ERROR:
            x.innerHTML="An unknown error occurred."
        break;
    }
}

function displayLocation(latitude,longitude){
    var geocoder;
    geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(latitude, longitude);

    geocoder.geocode(
        {'latLng': latlng}, 
        function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var add= results[0].formatted_address ;
                    var  value=add.split(",");

                    count=value.length;
                    country=value[count-1];
                    state=value[count-2];
                    city=value[count-3];
                    x.innerHTML = "city name is: " + city;
                }
                else  {
                    x.innerHTML = "address not found";
                }
            }
            else {
                x.innerHTML = "Geocoder failed due to: " + status;
            }
        }
    );
}

0

@Sanchit Gupta와 동일합니다.

이 부분에서

if (results[0]) {
 var add= results[0].formatted_address ;
 var  value=add.split(",");
 count=value.length;
 country=value[count-1];
 state=value[count-2];
 city=value[count-3];
 x.innerHTML = "city name is: " + city;
}

결과 배열을 콘솔

if (results[0]) {
 console.log(results[0]);
 // choose from console whatever you need.
 var city = results[0].address_components[3].short_name;
 x.innerHTML = "city name is: " + city;
}

0

사용 가능한 많은 도구가 있습니다.

  1. 모두가 작성한 것처럼 Google지도 API
  2. 이 데이터를 사용하십시오 " https://simplemaps.com/data/world-cities "무료 버전을 다운로드하고 " http://beautifytools.com/excel-to-json-converter.php " 와 같은 온라인 변환기를 사용하여 Excel을 JSON으로 변환하십시오.
  3. 다른 사람의 IP 주소를 사용하는 것은 좋은 사용자가 자신을 해킹 할 수 있다고 생각할 수 있기 때문에 좋지 않은 IP 주소를 사용하십시오.

다른 무료 및 유료 도구도 사용할 수 있습니다.


0

BigDataCloud 에는 nodejs 사용자를위한 멋진 API도 있습니다.

그들은 클라이언트 무료를위한 API가 있습니다. 그러나 백엔드 에도 API_KEY를 사용 경우 (할당량에 따라 무료).

GitHub 페이지 .

코드는 다음과 같습니다.

const client = require('@bigdatacloudapi/client')(API_KEY);

async foo() {
    ...
    const location: string = await client.getReverseGeocode({
          latitude:'32.101786566878445', 
          longitude: '34.858965073072056'
    });
}

0

Google 지오 코딩 API를 사용하고 싶지 않은 경우 개발 목적으로 몇 가지 다른 무료 API를 참조 할 수 있습니다. 예를 들어 저는 위치 이름을 얻기 위해 [mapquest] API를 사용했습니다.

다음 기능을 구현하여 위치 이름을 쉽게 가져올 수 있습니다.

 const fetchLocationName = async (lat,lng) => {
    await fetch(
      'https://www.mapquestapi.com/geocoding/v1/reverse?key=API-Key&location='+lat+'%2C'+lng+'&outFormat=json&thumbMaps=false',
    )
      .then((response) => response.json())
      .then((responseJson) => {
        console.log(
          'ADDRESS GEOCODE is BACK!! => ' + JSON.stringify(responseJson),
        );
      });
  };


OP는 Google Maps API로 솔루션을 요청했지만 질문에 대답하지 않는 것 같습니다.
Michał Tkaczyk

죄송하지만 대체 방법을 제안했습니다. Google Geo 코딩 API 키가 있으면 제대로 작동합니다.
pankaj chaturvedi

-3

순수한 php와 google geocode api로 할 수 있습니다.

/*
 *
 * @param latlong (String) is Latitude and Longitude with , as separator for example "21.3724002,39.8016229"
 **/
function getCityNameByLatitudeLongitude($latlong)
{
    $APIKEY = "AIzaXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // Replace this with your google maps api key 
    $googleMapsUrl = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" . $latlong . "&language=ar&key=" . $APIKEY;
    $response = file_get_contents($googleMapsUrl);
    $response = json_decode($response, true);
    $results = $response["results"];
    $addressComponents = $results[0]["address_components"];
    $cityName = "";
    foreach ($addressComponents as $component) {
        // echo $component;
        $types = $component["types"];
        if (in_array("locality", $types) && in_array("political", $types)) {
            $cityName = $component["long_name"];
        }
    }
    if ($cityName == "") {
        echo "Failed to get CityName";
    } else {
        echo $cityName;
    }
}

1
자바 스크립트 솔루션이 아님
Chintan Pathak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.