目标比较明确,就是从GPS坐标得到它所在的国家。


网上可以找的比较典型的解决方案是利用一些网站(例如Google)的webservice来完成这个任务,但是这些解决方案有一个比较大的弱点,就是这些webservice会限制请求的次数(通常每天只有1000-2000次)。


为了不被请求次数限制,就试图寻找离线的解决方案:不利用在线的webservice,而在本地根据地图数据就完成查找。


运气不错,找到了一个stackoverflow上的问答:

Lookup country for GPS coordinates without Internet access


这里提供的解决方案是用了这个地方的地图数据:


另外,问这个问题的人还很友善地提供了他最后的代码:)


本来以为一用就可以,结果发现还需要在Python中调用OGR。接着,就开始找怎么在windows中装python能调用的OGR……试了好几种方案(OSGeo4W和gdalwin32都没弄成功=____=),最后总算发现了一个binary安装包,可以一键解决~


=============

最后,总结一下步骤:
1. 下载安装GDAL-1.10.0.win32-py2.7.exe,我用的是python 2.7 (http://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal
2. 下载这里的master分支(https://github.com/che0/countries,就两py文件),把两py文件放到一个目录,比如D:\countryFinder
3. 下载TM_WORLD_BORDERS-0.3.zip (http://thematicmapping.org/downloads/world_borders.php),同样解压到D:\countryFinder
4. 在D:\countryFinder下,创建一个test.py,写下
import countries
cc = countries.CountryChecker('TM_WORLD_BORDERS-0.3.shp')
print cc.getCountry(countries.Point(49.7821, 3.5708)).iso
print cc.getCountry(countries.Point(49.7821, 3.5708))
print cc.getCountry(countries.Point(47.3, 9))

Enjoy~


=================
补充说明:
因为这个刻画国家边界的地图数据总是略微有些粗略,所以会存在国家边界上的一些坐标可能会出现“None”甚至归错国家的可能。针对“None”的情况,可以再换用在线的weiservice API去获取信息,比如: