2012-02-01 165 views
3

考虑到从基地城市(geonameid)100公里的半径100公里,我需要找到附近的城市。如何在python中获取城市(geonameid)的附近城市?

我的剧本是蟒蛇。有没有任何API可以找到它?

感谢

+0

您是否使用国地名web服务,还是你下载到本地数据库? – 2012-02-01 15:59:31

+0

我正在使用Geonames webservice。 – shaikh 2012-02-01 18:39:12

回答

10

如果你有个城市的数据库,看看this example它展示了如何建立SQL查询的特定任务。

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

所以,如果你有自己的数据库或城市或者你愿意创造出具有地方和某些城市的坐标数据库(可能是某处提供在互联网上),那么这个解决方案会为你工作。

或者,如果您没有数据库,并且想要使用Google地图等API,请特别注意The Google Geacoding API和反向地理编码。像一个请求:

http://maps.googleapis.com/maps/api/geocode/json?latlng=40.7,-73.9&sensor=false 

会给你可能地址的经度和纬度,你已经与提供它。

不幸的是,Google Places API(附近的地方)只适用于像东西餐厅,商店,酒吧等。

+1

实际上,Places还包含一系列不仅仅是场所的类型,还包括地点,国家,行政单位等等:http://code.google.com/apis/maps/documentation/places/supported_types .html – 2012-02-01 15:58:49

+1

@ManoMarks是的,但这些类型“在发送地方搜索请求时由Places API支持”。 – MMM 2012-02-01 16:13:36

+0

对,我不太确定你说的是什么,然后当你说“不幸的是,Google Places API(附近的地方)只适用于诸如餐厅,商店,酒吧等等。” – 2012-02-01 16:37:27

0

恐怕既不是地理编码API也没有地方API将帮助你你想要的方式。

反向地理编码会给你这个城市对于给定的经纬度,而不是围绕着一个人。甚至没有API。这些API用于不同的用途,但我想现在你对此不感兴趣。

除非你找到你想要做什么的API,你需要建立自己的数据库和运行就像一个MMM指出查询。要构建数据库,可以使用Natural Earth's 1:10m Cultural Vectors中的“已填充位置”数据集。你需要某种形式的GIS软件来处理它,并从这些居民地提取你会打电话城市虽然。

+0

OP实际上使用的是Geonames数据库 – 2012-02-01 16:38:26

+0

更简单,直到今天我才看到Geonames。 Fusion Tables可以做到这一点,只需导入您最喜爱的citiesXXXX表格,然后使用ST_INTERSECTS空间条件查询Fusion Tables SQL API。 – miguev 2012-02-01 17:01:22

4

由于您使用的国地名web服务,它看起来像有内置于它来查找附近的地名功能:

http://www.geonames.org/export/web-services.html

查找附近人口密集的地方/反向地理编码

web服务类型:REST URL:api.geonames.org/findNearbyPlaceName? 参数:lat,lng,lang:返回的'name'元素的语言( 伪语言代码'local'将以本地语言返回它), radius:半径in km(可选),maxRows:最大行数默认 10)风格:短,中,长,满(默认为MEDIUM)的 冗长返回的XML文档结果:返回最接近人口稠密的地方 纬度/经度查询作为XML文档。距离元素的单位是 'km'。例如: http://api.geonames.org/findNearbyPlaceName?lat=47.3&lng=9&username=demo

该服务也可在JSON格式: http://api.geonames.org/findNearbyPlaceNameJSON?lat=47.3&lng=9&username=demo