鉴于经纬度的坐标,我们如何找出城市/国家?

例如,如果我们有这些坐标

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

我们如何才能找出城市/国家?

免费的Google地理编码API通过HTTP REST API提供此服务。 请注意,该API是使用率和费率限制 ,但您可以支付无限的访问权限。

试试这个链接看看输出的例子(这是在JSON中,输出也是可用的XML)

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

另一种select:

优点:

  • 不依赖于外部服务器可用
  • 速度非常快(每秒可轻松进行数千次查询)

缺点:

  • 不会自动更新
  • 如果你想区分最近的城市是几十英里远的情况下需要额外的代码
  • 可能会在极点和国际date线附近产生奇怪的结果(尽pipe这些地方没有任何城市

我正在寻找一个类似的function,我在前面的回复中看到了数据“ http://download.geonames.org/export/dump/ ”(感谢你分享,这是一个很好的来源),并且实现了一个基于服务在cities1000.txt数据上。

你可以在http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9看到它。只要改变你的位置的经纬度。;

它部署在OpenShift(RedHat平台)上。 经过长时间的闲置时间之后的第一次通话可能需要一段时间,但通常performance令人满意 随意使用这项服务,只要你喜欢…

另外,您可以在https://github.com/turgos/Locationfind项目源代码。;

你需要geopy

 pip install geopy 

接着:

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

获取更多信息:

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

开放源代码是来自开放街道地图的Nominatim。 您只需在URL中设置variables,然后返回该位置的城市/国家/地区。 请检查以下链接的官方文件: Nominatim

我花了大约30分钟试图find一个如何在Javascript中做到这一点的代码示例。 我找不到你发布的问题的快速明确的答案。 所以…我做了我自己的。 希望人们可以使用它,而不必深入API或盯着他们不知道如何阅读的代码。 哈如果没有别的我可以参考这个post为我自己的东西..好的问题和感谢论坛的讨论!

这是利用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: '/' }); } }); } } 

我已经使用Geocoder ,这是一个很好的Python库,支持多种提供者,包括Google,Geonames和OpenStreetMaps 等等 。 我试过使用GeoPy库,它经常会超时。 开发你自己的GeoNames代码不是你最好的时间,你最终会得到不稳定的代码。 地理编码器在我的经验中使用非常简单,并且具有足够的文档 。 以下是以经纬度查询城市或按城市名称查找纬度/经度的示例代码。

 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 

这真的取决于你有什么技术限制。

一种方法是build立一个空间数据库,其中包含您感兴趣的国家和城市的概况。我的概述是指国家和城市作为空间types的多边形存储。 您可以将坐标集转换为空间types点,并根据多边形查询,以获取点位于的国家/城市名称。

以下是一些支持空间types的数据库: SQL server 2008 , MySQL , postGIS – postgreSQL和Oracle的扩展。

如果您想使用服务而不是拥有自己的数据库,则可以使用Yahoo的GeoPlanet 。 对于服务方法,您可能需要在gis.stackexchange.com上查看此答案,其中涵盖了解决问题的服务的可用性。

您可以使用Google地理编码API

贝娄是PHP函数,返回地址,城市,州和国家

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

我知道这个问题真的很老,但我一直在研究同样的问题,我发现一个非常有效和方便的软件包reverse_geocoder ,由Ajay Thampi构build。 代码在这里可用。 它基于KD树的并行实现,这对于大量的点是非常有效的(花了我几秒钟才能获得100,000点。

它基于这个数据库,已经被@turgos强调了。

如果你的任务是快速find坐标列表的国家和城市,这是一个伟大的工具。

请检查下面的答案。 它适用于我

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

如果您使用的是Google的Places API,那么您可以使用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; } }