Biorąc pod uwagę współrzędne lat / long, jak możemy znaleźć miasto / kraj?

Na przykład jeśli mamy taki zbiór współrzędnych

"latitude": 48.858844300000001,
"longitude": 2.2943506,

Jak możemy znaleźć miasto / kraj?

Author: ming yeow, 2011-05-28

12 answers

Darmowy Google Geocoding API zapewnia tę usługę za pośrednictwem HTTP REST API. Uwaga, API jest użycie i stawki ograniczone, ale możesz zapłacić za nieograniczony dostęp.

Wypróbuj ten link, aby zobaczyć przykład wyjścia (to jest w json, wyjście jest również dostępne w XML)

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

 84
Author: Kevin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 03:56:39

Inna opcja:

  • Pobierz bazę miast z http://download.geonames.org/export/dump/
  • Dodaj każde miasto jako lat / long - > mapowanie miasta do indeksu przestrzennego, takiego jak R-Tree (niektóre DBs również mają tę funkcjonalność)
  • Użyj wyszukiwania najbliższego sąsiada, aby znaleźć najbliższe miasto dla danego punktu

Zalety:

  • nie zależy od zewnętrznego serwera, który będzie dostępny
  • bardzo szybko (łatwo robi tysiące wyszukań na sekundę)

Wady:

  • nie automatycznie aktualizowane
  • wymaga dodatkowego kodu, jeśli chcesz rozróżnić przypadek, w którym najbliższe miasto znajduje się kilkadziesiąt Mil]}
  • może dać dziwne wyniki w pobliżu biegunów i międzynarodowej linii daty (choć i tak nie ma żadnych miast w tych miejscach
 138
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-24 18:48:21

Potrzebujesz geopy

pip install geopy

A następnie:

from geopy.geocoders import Nominatim
geolocator = Nominatim()
location = geolocator.reverse("48.8588443, 2.2943506")

print(location.address)

Aby uzyskać więcej informacji:

print (location.raw)

{'place_id': '24066644', 'osm_id': '2387784956', 'lat': '41.442115', 'lon': '-8.2939909', 'boundingbox': ['41.442015', '41.442215', '-8.2940909', '-8.2938909'], 'address': {'country': 'Portugal', 'suburb': 'Oliveira do Castelo', 'house_number': '99', 'city_district': 'Oliveira do Castelo', 'country_code': 'pt', 'city': 'Oliveira, São Paio e São Sebastião', 'state': 'Norte', 'state_district': 'Ave', 'pedestrian': 'Rua Doutor Avelino Germano', 'postcode': '4800-443', 'county': 'Guimarães'}, 'osm_type': 'node', 'display_name': '99, Rua Doutor Avelino Germano, Oliveira do Castelo, Oliveira, São Paio e São Sebastião, Guimarães, Braga, Ave, Norte, 4800-443, Portugal', 'licence': 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'}
 24
Author: Farsheed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-09 11:19:28

Szukałem podobnej funkcjonalności i zobaczyłem DANE " http://download.geonames.org/export/dump / " udostępniony na wcześniejszej odpowiedzi (dziękuję za udostępnienie, jest to doskonałe źródło) i zaimplementowany serwis oparty na cities1000.dane txt.

Widać, że działa na http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (broken link) Po prostu zmień szerokość i długość geograficzną dla swoich lokalizacji.

It jest wdrożony na platformie OpenShift (RedHat). Pierwsze wywołanie po długim okresie bezczynności może zająć trochę czasu, ale zazwyczaj wydajność jest zadowalająca. Zapraszamy do korzystania z tej usługi, jak chcesz...

Również źródło projektu można znaleźć na https://github.com/turgos/Location .

 20
Author: turgos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 07:04:41

Alternatywą Open Source jest Nominatim z Open Street Map. Wszystko, co musisz zrobić, to ustawić zmienne w adresie URL i zwraca miasto / kraj tej lokalizacji. Proszę sprawdzić poniższy link do oficjalnej dokumentacji: Nominatim

 17
Author: Rega,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-03 01:38:09

Spędziłem około 30min próbując znaleźć przykład kodu, jak to zrobić w Javascript. Nie mogłem znaleźć szybkiej, jasnej odpowiedzi na twoje pytanie. Więc... Zrobiłem swoje. Mam nadzieję, że ludzie mogą tego używać bez konieczności zagłębiania się w API lub wpatrywania się w kod, który nie mają pojęcia, jak czytać. Ha jeśli nic innego mogę odwołać się do tego postu dla moich własnych rzeczy.. Ładne pytanie i dzięki za forum dyskusyjne!

To jest korzystanie z Google API.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=<YOURGOOGLEKEY>&sensor=false&v=3&libraries=geometry"></script>

.

//CHECK IF BROWSER HAS HTML5 GEO LOCATION
if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function (position) {

        //GET USER CURRENT LOCATION
        var locCurrent = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);

        //CHECK IF THE USERS GEOLOCATION IS IN AUSTRALIA
        var geocoder = new google.maps.Geocoder();
            geocoder.geocode({ 'latLng': locCurrent }, function (results, status) {
                var locItemCount = results.length;
                var locCountryNameCount = locItemCount - 1;
                var locCountryName = results[locCountryNameCount].formatted_address;

                if (locCountryName == "Australia") {
                    //SET COOKIE FOR GIVING
                    jQuery.cookie('locCountry', locCountryName, { expires: 30, path: '/' }); 
                }
        });
    }
}
 5
Author: Kai Husen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 19:14:49

Użyłem Geocoder , dobrej Biblioteki Pythona, która obsługuje wielu dostawców, w tym Google, Geonames i OpenStreetMaps, aby wymienić tylko kilka. Próbowałem korzystać z biblioteki GeoPy i często dostaje timeouty. Tworzenie własnego kodu do gier GeoNames nie jest najlepszym wykorzystaniem twojego czasu i może skończyć się niestabilnym kodem. Geocoder jest bardzo prosty w obsłudze z mojego doświadczenia i ma wystarczająco dobrą dokumentację . Poniżej przykładowy kod do szukania miasta przez szerokość i Długość geograficzna, lub znalezienie szerokości/długości geograficznej według nazwy miasta.

import geocoder

g = geocoder.osm([53.5343609, -113.5065084], method='reverse')
print g.json['city'] # Prints Edmonton

g = geocoder.osm('Edmonton, Canada')
print g.json['lat'], g.json['lng'] # Prints 53.5343609, -113.5065084
 5
Author: Ham Sam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-08 09:37:10

To naprawdę zależy od tego, jakie masz ograniczenia technologiczne.

Jednym ze sposobów jest posiadanie przestrzennej bazy danych z zarysem krajów i miast, które Cię interesują. Przez zarys rozumiem, że kraje i miasta są przechowywane jako wielokąt typu przestrzennego. Twój zestaw współrzędnych może zostać przekonwertowany na punkt typu przestrzennego i zapytany o wielokąty, aby uzyskać nazwę kraju/miasta, w którym znajduje się punkt.

Oto niektóre z baz danych obsługujących typ przestrzenny: SQL server 2008, MySQL, postGIS - rozszerzenie postgreSQL i Oracle.

Jeśli chcesz skorzystać z usługi zamiast posiadania własnej bazy danych, możesz skorzystać z Yahoo ' S GeoPlanet . Jeśli chodzi o podejście do usług, możesz sprawdzić odpowiedź na gis.stackexchange.com , który obejmuje dostępność usług do rozwiązania problemu.

 3
Author: steenhulthin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 12:33:45

Możesz użyć Google Geocoding API

Poniżej jest funkcja php, która zwraca adres, Miasto, Stan i kraj

public function get_location($latitude='', $longitude='')
{
    $geolocation = $latitude.','.$longitude;
    $request = 'http://maps.googleapis.com/maps/api/geocode/json?latlng='.$geolocation.'&sensor=false'; 
    $file_contents = file_get_contents($request);
    $json_decode = json_decode($file_contents);
    if(isset($json_decode->results[0])) {
        $response = array();
        foreach($json_decode->results[0]->address_components as $addressComponet) {
            if(in_array('political', $addressComponet->types)) {
                    $response[] = $addressComponet->long_name; 
            }
        }

        if(isset($response[0])){ $first  =  $response[0];  } else { $first  = 'null'; }
        if(isset($response[1])){ $second =  $response[1];  } else { $second = 'null'; } 
        if(isset($response[2])){ $third  =  $response[2];  } else { $third  = 'null'; }
        if(isset($response[3])){ $fourth =  $response[3];  } else { $fourth = 'null'; }
        if(isset($response[4])){ $fifth  =  $response[4];  } else { $fifth  = 'null'; }


        $loc['address']=''; $loc['city']=''; $loc['state']=''; $loc['country']='';
        if( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth != 'null' ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $fourth;
            $loc['country'] = $fifth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth != 'null' && $fifth == 'null'  ) {
            $loc['address'] = $first;
            $loc['city'] = $second;
            $loc['state'] = $third;
            $loc['country'] = $fourth;
        }
        else if ( $first != 'null' && $second != 'null' && $third != 'null' && $fourth == 'null' && $fifth == 'null' ) {
            $loc['city'] = $first;
            $loc['state'] = $second;
            $loc['country'] = $third;
        }
        else if ( $first != 'null' && $second != 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['state'] = $first;
            $loc['country'] = $second;
        }
        else if ( $first != 'null' && $second == 'null' && $third == 'null' && $fourth == 'null' && $fifth == 'null'  ) {
            $loc['country'] = $first;
        }
      }
      return $loc;
}
 1
Author: Nishad Up,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-05 08:00:49

Wiem, że to pytanie jest naprawdę stare, ale pracowałem nad tym samym problemem i znalazłem niezwykle wydajny i wygodny pakiet, reverse_geocoder, zbudowany przez Ajay Thampi. Kod jest dostępny Tutaj . Opiera się on na równoległej implementacji drzew K-D, która jest niezwykle wydajna dla dużej ilości punktów (zdobycie 100 000 punktów Zajęło mi kilka sekund.

Jest oparta na tej bazie danych, już zaznaczonej przez @ turgos.

Jeśli twoim zadaniem jest szybkie znalezienie kraj i miasto listy współrzędnych, jest to świetne narzędzie.

 1
Author: Giorgio Balestrieri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 17:38:55

Proszę sprawdzić poniższą odpowiedź. It works for me

if(navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position){

        initialize(position.coords.latitude,position.coords.longitude);
    }); 
}

function initialize(lat,lng) {
    //directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
    //directionsService = new google.maps.DirectionsService();
    var latlng = new google.maps.LatLng(lat, lng);

    //alert(latlng);
    getLocation(latlng);
}

function getLocation(latlng){

    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[0]) {
                    var loc = getCountry(results);
                    alert("location is::"+loc);
                }
            }
        });

}

function getCountry(results)
{
    for (var i = 0; i < results[0].address_components.length; i++)
    {
        var shortname = results[0].address_components[i].short_name;
        var longname = results[0].address_components[i].long_name;
        var type = results[0].address_components[i].types;
        if (type.indexOf("country") != -1)
        {
            if (!isNullOrWhitespace(shortname))
            {
                return shortname;
            }
            else
            {
                return longname;
            }
        }
    }

}

function isNullOrWhitespace(text) {
    if (text == null) {
        return true;
    }
    return text.replace(/\s/gi, '').length < 1;
}
 0
Author: Summved Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-30 08:27:03

Jeśli używasz Google Places API, w ten sposób możesz uzyskać kraj i miasto z obiektu place za pomocą Javascript:

function getCityAndCountry(location) {
  var components = {};
  for(var i = 0; i < location.address_components.length; i++) {
    components[location.address_components[i].types[0]] = location.address_components[i].long_name;
  }

  if(!components['country']) {
    console.warn('Couldn\'t extract country');
    return false;
  }

  if(components['locality']) {
    return [components['locality'], components['country']];
  } else if(components['administrative_area_level_1']) {
    return [components['administrative_area_level_1'], components['country']];
  } else {
    console.warn('Couldn\'t extract city');
    return false;
  }
}
 0
Author: vedo27,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-03 19:27:39