首先,我建议您使用2008年老虎档案 http://www.census.gov/geo/www/tiger/tgrshp2008/tgrshp2008.html.
其次,正如其他人指出的那样,现在有很多项目已经读入、解释、转换和使用数据。不过,为这些数据构建您自己的解析器几乎是微不足道的,因此没有理由浏览另一个项目的代码并尝试提取您需要的内容,除非您计划将他们的项目作为一个整体使用。
如果你想从较低的水平开始
Parsing
构建您自己的 TIGER 解析器(相当简单 - 只需一个线段数据库),并在此基础上构建一个简单的渲染器(线条、多边形、字母/名称)也将相当容易。你会想看看各种地图投影类型 http://www.colorado.edu/geography/gcraft/notes/mapproj/mapproj_f.html用于渲染阶段。最常用(因此用户最熟悉)的是墨卡托投影 http://www.colorado.edu/geography/gcraft/notes/mapproj/mapproj_f.html- 它相当简单且快速。您可能想尝试支持其他投影。
这将为了解如何投影地图以及如何反转该投影提供一些“乐趣”(假设用户单击地图,您想查看他们单击的纬度/经度 - 需要反转当前投影方程)。
渲染
当我开发渲染器时,我决定将窗口基于固定尺寸(嵌入式设备)和固定放大倍率。这意味着我可以将地图以纬度/经度为中心,并且在给定的放大倍率下中心像素=中心纬度/经度,并且给定墨卡托投影,我可以计算哪个像素代表每个纬度/经度,反之亦然。
有些程序允许窗口变化,并且不使用放大倍率和固定点,而是使用两个固定点(通常是定义窗口的矩形的左上角和右下角)。在这种情况下,确定像素到纬度/经度的传输变得微不足道 - 这只是一些插值计算。旋转和缩放使此传递函数稍微复杂一些,但应该不会太复杂 - 它仍然是一个带有插值的矩形窗口,但窗口角不需要相对于北处于任何特定方向。这增加了一些极端情况(例如,您可以将地图翻过来并像从地球内部一样查看它),但这些并不繁重,并且可以在您处理它时处理。
一旦完成了纬度/经度到像素的传输,渲染线条和多边形就相当简单了,除了正常的图形问题(例如线条或多边形的边缘不恰当地重叠、抗锯齿等)。但是渲染一个基本的丑陋地图(例如许多开源渲染器所做的那样)是相当简单的。
您还可以进行距离和大圆计算 - 例如,一个很好的经验法则是,赤道的每一度纬度或经度大约为 111.1KM - 但当您靠近任一极时,它会发生变化,而另一个继续保持在111.1kM。
存储和结构
然而,如何存储和引用数据在很大程度上取决于您计划如何使用它。如果您想对人口统计和路由使用相同的数据库结构,就会出现很多难题 - 给定的数据库结构和索引对于一个来说很快,而另一个则很慢。
使用邮政编码并仅加载附近的邮政编码适用于小型地图渲染项目,但如果您需要穿越全国的路线,则需要不同的结构。一些实现具有“覆盖”数据库,其中仅包含主要道路和捕捉到覆盖的路线(或通过多个覆盖 - 本地、地铁、县、州、国家)。这会导致快速但有时效率低下的路由。
Tiling
平铺地图实际上并不容易。在较低的放大倍率下,您可以渲染整个地图并将其剪切。在较高的放大倍率下,您无法一次渲染整个物体(由于内存/空间限制),因此您必须将其切成薄片。
在图块边界处切割线,以便渲染单个图块会导致不太完美的结果 - 通常所做的是将线渲染到图块边界之外(或者,至少保留线端的数据,尽管渲染一旦停止就会停止)发现它从边缘掉下来) - 这减少了当线条穿过瓷砖时看起来不太匹配时发生的错误。
当你解决这个问题时,你就会明白我在说什么。
查找进入给定图块的数据也并非易事 - 一条线的两端可能都在给定图块之外,但会穿过该图块。您需要查阅有关此的图形书籍(迈克尔·阿布拉什 (Michael Abrash) 的书是开创性的参考书 https://www.jagregory.com/abrash-black-book/,现在可以通过前面的链接免费获得)。虽然它主要讨论游戏,但窗口、裁剪、多边形边缘、碰撞等都适用于此。
但是,您可能想玩更高级别的游戏。
完成上述操作后(通过调整现有项目或自己执行上述操作),您可能想尝试其他场景和算法。
反向地理编码相当容易。输入纬度/经度(或单击地图)并获取最近的地址。这将教您如何解释 TIGER 数据中线段的地址。
基本的地理编码是一个难题。编写地址解析器是一个有用且有趣的项目,然后使用 TIGER 数据将其转换为纬度/经度并非易事,但很有趣。从简单而小的开始,要求精确的名称和格式匹配,然后开始研究“类似”匹配和语音匹配。该领域有很多研究 - 请查看搜索引擎项目以获取一些帮助。
寻找两点之间的最短路径是一个不平凡的问题。有很多很多算法可以做到这一点,其中大多数都已申请专利。我建议,如果您尝试这样做,请使用您自己设计的简单算法,然后进行一些研究并将您的设计与最先进的技术进行比较。如果您热衷于图论,这会很有趣。
遵循路径并先发制人地发出指示这并不像乍一看那么容易。给定一组带有相关经纬度对数组的指令,使用外部输入(GPS 或模拟 GPS)“遵循”路线,并开发一种算法,在用户接近每个真实交叉路口时向其提供指令。请注意,由于弯曲的道路等原因,纬度/经度对比指令多,并且您需要检测行进方向等。在尝试实现之前,您不会看到很多极端情况。
兴趣点搜索。这个很有趣 - 你需要找到当前位置,以及一定距离(直线距离,或更难 - 行驶距离)内的所有兴趣点(不是 TIGER 的一部分,可以自己制作或获取其他来源)起源。这个很有趣,因为在这种情况下你必须将 POI 数据库转换成一种易于搜索的格式。您无法花时间浏览数百万个条目,进行距离计算 (sqrt(x^2 + y^2)),然后返回结果。首先你需要有一些方法或算法来减少数据量。
旅行推销员。具有多个目的地的路由。只是常规路由的更难版本。
您可以找到许多项目的链接以及有关此主题的信息源here http://delicious.com/stienman/gis.
祝你好运,无论你做什么,无论多么初级或丑陋,请发表,以便其他人受益!
-Adam