给定纬度/经度坐标,我们如何找出城市/国家?

时间:2011-05-28 01:17:51

标签: geolocation geocoding geospatial geo

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

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

我们怎样才能找到这个城市/国家?

14 个答案:

答案 0 :(得分:158)

另一种选择:

  • http://download.geonames.org/export/dump/
  • 下载城市数据库
  • 将每个城市添加为纬度/经度 - >城市映射到空间索引,例如R树(某些DB也具有功能)
  • 使用最近邻搜索找到任何给定点的最近城市

优点:

  • 不依赖外部服务器
  • 非常快(每秒容易进行数千次查找)

缺点:

  • 不会自动更新
  • 如果您想区分距离最近的城市几十英里的情况,则需要额外的代码
  • 可能会在极点和国际日期线附近给出奇怪的结果(尽管那些地方没有任何城市

答案 1 :(得分:90)

免费Google Geocoding API通过HTTP REST API提供此服务。请注意,API为usage and rate limited,但您可以为无限制访问付费。

尝试此链接以查看输出示例(这是在json中,输出也在XML中可用)

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

答案 2 :(得分:32)

您需要if 'A' <= name[x] <= 'M':

geopy

然后:

pip install geopy

获取更多信息:

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

print(location.address)

答案 3 :(得分:20)

我正在搜索类似的功能,我看到了数据&#34; http://download.geonames.org/export/dump/&#34;早先的回复分享(感谢分享,这是一个很好的来源),并实施了一个基于cities1000.txt数据的服务。

你可以看到它正在运行 http://scatter-otl.rhcloud.com/location?lat=36&long=-78.9 (断开的链接) 只需更改您所在位置的纬度和经度即可。

它部署在OpenShift(RedHat平台)上。长时间闲置后的第一次通话可能需要一段时间,但通常表现令人满意。 随意使用此服务...

此外,您可以在以下位置找到项目来源 https://github.com/turgos/Location

答案 4 :(得分:20)

Open Source替代方案是来自Open Street Map的Nominatim。 您所要做的就是在URL中设置变量,并返回该位置的城市/国家/地区。请查看以下链接以获取官方文档:Nominatim

答案 5 :(得分:5)

我花了大约30分钟试图找到如何在Javascript中执行此操作的代码示例。我找不到你发布的问题的快速明确答案。所以...我自己创造了。希望人们可以使用它,而无需深入研究API或盯着他们不知道如何阅读的代码。哈,如果没有别的我可以参考这篇文章为我自己的东西..好问题,并感谢讨论论坛!

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

答案 6 :(得分:5)

我使用了Geocoder,这是一个优秀的Python库,支持多个提供商,包括Google,Geonames和OpenStreetMaps,mention just a few。我尝试过使用GeoPy库,它经常会超时。为GeoNames开发自己的代码不是最好的利用时间,最终可能会得到不稳定的代码。根据我的经验,Geocoder非常简单易用documentation。以下是按纬度和经度查找城市或按城市名称查找纬度/经度的示例代码。

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

答案 7 :(得分:3)

这实际上取决于您拥有的技术限制。

一种方法是建立一个空间数据库,其中包含您感兴趣的国家和城市的轮廓。通过大纲我的意思是国家和城市存储为空间类型多边形。您的坐标集可以转换为空间类型点,并针对多边形进行查询,以获取该点所在的国家/城市名称。

以下是一些支持空间类型的数据库:SQL server 2008MySQLpostGIS - postgreSQL和Oracle的扩展。

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

答案 8 :(得分:2)

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

它基于this数据库,已由@turgos突出显示。

如果你的任务是快速查找坐标列表的国家和城市,这是一个很棒的工具。

答案 9 :(得分:1)

您可以使用Google地理编码API

Bellow是返回地址,城市,州和国家的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;
}

答案 10 :(得分:1)

最小化库的数量。

在他们的网站上获取使用api的密钥,然后在http请求中获得结果:

curl -i -H“ key:YOUR_KEY” -X GET https://api.latlong.dev/lookup?lat=38.7447913&long=-9.1625173

答案 11 :(得分:0)

请检查以下答案。它对我有用

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

答案 12 :(得分:0)

如果您使用的是Google地方信息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;
  }
}

答案 13 :(得分:0)

Loc2country是基于Golang的工具,可针对给定的位置坐标(纬度/经度)返回ISO alpha-3国家/地区代码。它以微秒为单位响应。它使用地理哈希到国家地图。

geohash数据是使用georaptor生成的。

我们在此工具的第6级使用geohash,即尺寸为1.2km x 600m的盒子。