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