如何将经纬度转换为邮政编码或州以生成分级颜色图
我有一大堆地理空间数据(经纬度点),而且还在不断增加(这些数据存储在mongodb里,如果这有帮助的话)。我想生成一个分级地图(可以参考这个链接:http://vis.stanford.edu/protovis/ex/choropleth.html),这个地图需要知道每个点所在的州。请问有没有什么数据库或者算法可以做到这一点,而不需要调用外部的API(也就是说,我知道像geopy和谷歌地图API这样的工具)。
5 个回答
这里是如何在FORTRAN中实现的。你还记得FORTRAN吗?我也不太记得了。不过,看起来这个过程挺简单的,因为每个州都有自己的范围。
编辑 有人提醒我,你的起点是经纬度,而不是邮政编码。
把经纬度转换成政治区域的算法叫做“地图”。说真的,普通的地图就是把某个范围内的每个点映射到它所属的区域。一个详细的数字地图,涵盖所有48个相邻的州,会是一个庞大的数据库,然后你需要一些(相对简单的)代码来判断每个州(用一系列线段描绘边界)是否包含某个特定的点。
你可以试试使用Geonames这个数据库。它里面有经纬度信息,还有城市、邮政和其他位置类型的数据。而且这个数据库是免费的。
不过,如果你想把数据放在自己本地或者导入到自己的数据库里,美国地质调查局(USGS)和国家地理空间情报局(NGA)提供了一个全面的城市经纬度列表。这个列表会定期更新,免费而且很可靠。
其实,你链接的那个网页应用里有你需要的数据。
如果你查看这个链接 http://vis.stanford.edu/protovis/ex/us_lowres.js,你会发现每个州的边界信息都在 borders[] 里面,这里包含了一系列的 [纬度, 经度] 点,勾勒出州的轮廓。你可以加载这些数据,然后检查某个点是否在这个多边形里面,具体可以参考这个链接 http://en.wikipedia.org/wiki/Point_in_polygon。
根据这个帖子 Reverse Geocoding Without Web Access,你可以通过提前计算每个州的边界框来加快这个过程,只有在点在边界框内的情况下,才去检查它是否在多边形里面。