我兴趣写一个简单的导航应用作为宠物项目。免费地图数据检索各地后,我对US Census Bureau TIGER 2007线/ Shape文件的地图数据解决。该数据被分成各个县zip文件,我已经下载了单县的地图数据为我区。
什么是在这个地图数据读入一个可用的格式最好的方法是什么?
我应该如何:
什么是呈现地图一次我看了在shapefile数据的最佳方式?
理想情况下,我想能够在一个县的地图数据shape文件读取和渲染的所有折线到屏幕上,并允许旋转和缩放。
我应该如何:
防爆。 TIGER的数据呈现为显示图:
任何人只要有一定的经验和洞察对我来说,在这些文件中读取我,应该如何代表他们(数据库中存储数据结构)在我的计划,我应该如何渲染(带旋转/缩放)地图数据的最佳方式在屏幕上,将不胜感激。
编辑:为了澄清,我不希望使用任何谷歌或雅虎地图API。同样,我不想使用OpenStreetMap的。我正在寻找一个更从划痕的方法不是利用这些API /程序。这将是一个桌面应用程序。
首先,我建议您使用2008 TIGER files。
其次,正如其他人指出,有很多的项目,那里现在已经阅读,理解,转换和使用数据。建立自己的解析器,这个数据几乎是微不足道的,虽然如此,没有理由去通过其他项目的代码,并尝试提取你需要什么,除非你打算使用他们的项目作为一个整体。
解析
构建自己的TIGER解析器(相当容易 - 只需一个线段DB),并建立一个简单的渲染上(线,多边形,文字/名称)的顶部也将是相当容易的。你会想看看不同的map projection types的呈现阶段。最常用的(并因此最熟悉的用户)是Mercator projection - 这是相当简单,快捷。您可能希望与支持其它突出的发挥。
这将提供一点“乐趣”中看到如何投影地图,以及如何扭转这种投影(比如用户点击地图上的条款,你想看到的纬度/经度他们点击 - 需要扭转当前投影方程)。
渲染
当我开发了我的渲染我决定基础上的固定大小(嵌入式设备),和一个固定倍率我的窗口。这意味着,我可以在给定的放大中心以纬度/经度,并且与中心像素=中心的纬度/经度的地图,和给出的墨卡托投影我可以计算其像素表示的每个纬度/经度,和反之亦然。
某些程序允许代替窗口而变化,并且代替使用的放大倍率和固定点,它们使用两个固定点(通常是左上角和一个矩形的右下角限定窗口)。在这种情况下,它变得微不足道确定像素/纬度转移 - 这只是几个插值计算。旋转和缩放使这个传递函数稍微复杂一些,但不应该是如此明显 - 它仍然与插补矩形窗口,但窗口的角落不需要在任何特定的方位相对于北方。这增加了一些其他的情况(你可以打开地图内而外,并认为它从地球内部那样的话,例如),但这些都不是繁重的,并能与你进行这项工作予以处理。
一旦你得到了经/纬度来完成,渲染线和多边形像素传输是除了正常的图形问题(如不适当重叠,抗锯齿等线或面的边缘)相当简单。但呈现基本丑图,如它由许多开源渲染器做的是相当简单的。
你也可以用距离和大圆计算玩 - 例如拇指的一个很好的规则是,在赤道纬度或经度每度大约为111.1KM - 但一个变化,你接近要么极,另外继续维持在111.1kM。
存储和结构
你如何存储和引用数据,但是,在很大程度上取决于你打算用它做什么。很多棘手的问题出现,如果你想使用同一个数据库结构,人口VS路由 - 一个给定的数据库结构和索引将会很快为一体,并减缓了其他。
使用邮政编码和加载只有附近的邮编适用于小型地图绘制项目,但如果您需要在全国各地的路线,你需要不同的结构。有些实现有“覆盖”数据库只包含主要道路和捕捉航线覆盖(或通过多个覆盖 - 本地,城域,县,州,国家)。这导致快,但有时效率低下的路由。
平铺
平铺地图实际上是不容易的。在较低的放大倍率可以渲染整个地图并砍碎。在更高的放大倍率,你不能呈现整个事情一次(由于内存/空间限制),所以你必须切起来。
在瓷砖的边界切割线,所以你可以在不到完美的效果呈现个别瓷砖结果 - 通常是什么做的是线呈现超越瓦片边界(或者,至少线路末端的数据被保存,虽然渲染一旦停止认定它的脱落边缘) - 这减少了用线看起来像他们这样做不是很匹配,因为他们在砖旅行发生错误。
你就会明白我说的,你对这个问题的工作。
这是不平凡的发现,进入一个给定片以及数据 - 线可以有一个给定片外的两端,而且在整个瓦旅行。你需要(现在前面的链接Michael Abrash's book is the seminal reference,免费提供)查阅显卡的本本这个问题。虽然会谈主要是关于游戏,窗口,裁剪,多边形边缘,碰撞等所有适用于此。
一旦你上面做(通过调整现有的项目,或做你之上),你可能要与其他场景和算法的发挥。
反向地理编码是相当容易的。输入/纬度(或点击地图),并寻找最近的地址。这教你如何解释沿TIGER数据线段的地址。
基本地理编码是一个困难的问题。写一个地址解析器是一个有用和有趣的项目,然后再转换到这一点使用TIGER数据经/纬度是不平凡的,但有很多乐趣。开始了简单和小,要求准确名称和格式匹配,然后开始寻找到“喜欢”匹配和拼音匹配。有很多这方面的研究 - 看看搜索引擎项目,这里提供一些帮助。
查找两点之间的最短路径是一个不平凡的问题。有做这件事,其中大部分是专利很多,很多的算法。我建议,如果你试试这个跟你自己设计的一个简单算法,然后做一些研究和设计比较的技术状态。这是一个很大的乐趣,如果你到图论。
继路径和先发制人发出指令并不像它看起来乍一看容易。给定的一组指令与纬度/经度对相关联的阵列中,“后续”使用外部输入(GPS,或模拟GPS)途径和开发的算法,因为它们彼此接近真实相交给出用户的指令。请注意,有比因弯曲道路等指令的详细经/纬度对,你就需要检测行进方向等等。角落的情况很多,你不会看到,直到你尝试实现它。
搜索兴趣点。这一个是有趣的 - 你需要找到当前位置,和所有感兴趣的点(TIGER的不是一部分,使自己或得到另一个源)在一定距离内(直线距离,或更难 - 行车距离)起源。这是一个有趣的,你必须POI数据库转换成格式,便于在这种情况下进行搜索。你可以不花时间去通过数以百万计的条目,做距离计算(的sqrt(x ^ 2 + Y ^ 2)),并返回结果。你需要有一些方法或算法来削减数据量首次下降。
旅行商。有多个目的地的路由。只是一个更难版本常规路由的。
你可以找到一些链接到许多项目和关于这个问题here信息来源。
祝你好运,并请发表不管你做什么,无论多么简陋或难看,以便其他人可以受益!
-亚当
当我把这个答案的问题被标记
“什么是渲染shape文件(地图数据)折线.NET中的最佳方式是什么?”
现在,这是一个不同的问题,但我离开我的回答原来的问题。
我写使用普通GDI +在c#NET版本,可以绘制矢量的数据(例如来自一个SHP文件的几何形状)。这是相当有趣。
其原因是,我们需要处理不同版本的几何形状,并用了很多附加属性的信息,所以我们不能使用商业地图组件或使用开源的一个。
这样做时,最主要的是建立一个视口和翻译/转换WGIS84坐标一家低档次和GDI + x,y坐标与投影等待,如果你甚至需要在所有重新投影。
一个解决方案是使用的MapXtreme。他们有API的Java和C#。该API能够载入这些文件,使它们。
对于Java:
对于.NET:
My source for the number of miles per degree.
我曾经在一个桌面应用该解决方案,效果不错。它提供了更多,只有呈现信息。
现在从头开始做这可能需要相当长一段时间。他们有一个评估版本,您可以下载。我认为它只是打印“MAPXTREME”地图作为水印结束了,但它是完全可用,否则
SharpMap为WinForms和ASP.NET一个开源.NET 2.0映射引擎。这可以提供你所需要的所有功能。它涉及最常见的GIS矢量和栅格数据格式,包括ESRI形状文件。
解决的办法是:
他们可以读取和服务shape文件(和许多其他的东西)。例如,的GeoServer(安装时)为来自美国人口普查局的TIGER作为shape文件演示数据
有很多在网络上的实例使用此解决方案
好笑的问题。下面是我如何做到这一点。
我收集我需要他们来的任何格式,我一直拉着美国地质调查局的数据,这样无异于一堆任何几何形状:
然后我写了一个程序,“编译”的形定义成一种形式,是有效率的渲染。这意味着做任何突起和数据格式转换所必需的有效显示数据。一些细节:
x
项目,其中x
是原语我可以在我所期望的帧率绘制的数量。剩下的就是相机的控制,你想显示的任何数据的动画。
这里是我现有的实现的一些例子:
Picture http://seabusmap.com/assets/Picture%205.png Picture http://seabusmap.com/assets/Picture%207.png
在本地存储数据的老虎,我会选择与qazxsw POI工具qazxsw POI。
他们的工具藏品令人印象深刻,你特别是Postgresql提供进口和使用老虎数据的好办法。
你需要看看与PostGIS的交互的工具,最有可能的某种postgis的
现在有与PostGIS的工作几个开源工具。该项目uDig工作是在一个完整的读/写的桌面环境,可以与PostGIS的直接合作。对于互联网地图,明尼苏达Mapserver的大学可以使用的PostGIS作为数据源。该GeoTools Java的GIS工具包具有PostGIS的支持,一样的GeoServer的网络功能服务器。 GRASS支持PostGIS的作为数据源。跳跃的Java桌面GIS浏览器能够读取PostGIS的数据一个简单的插件,以及QGIS桌面有很好的PostGIS的支持。 PostGIS的数据可以使用OGR C ++库和命令行工具被导出到数个输出GIS格式(以及与捆绑式样文件自卸五言的)。当然,它可以与PostgreSQL的工作任何语言可以与PostGIS的工作 - 列表中包括的Perl,PHP,Python和TCL,C,C ++,Java和C#等。
编辑:在其名称中的服务器depite地图服务器,这将是在桌面环境中使用。
虽然你已经决定使用TIGER数据,你可能会感兴趣的mapserver,怎么一回事,因为OSM中有老虎的数据,与用户丰富的完整的进口提供的数据。如果你坚持TIGER格式,您的应用程序将是无用的国际用户,OSM你TIGER和一切在一次。
OSM是一个开放的项目设有协作编辑自由世界地图。你可以得到所有这些数据以及结构化的XML,无论是查询的区域,或下载整个世界都在一个大的文件。
有在各种编程语言提供的OSM,大多数开源地图的一些渲染器,但仍然有许多工作要做。
还有是http://postgis.refractions.net/documentation/ avaliable。它有一个网络接口,还可以通过Web服务API是可查询的。再次,这还不是全部完成。用户肯定可以使用建立在此之上桌面或移动路由应用。
即使你没有决定去与该项目,你可以得到很多从它的灵感。只要有一个看看OSM (Open Street Map),并在其参与(你会发现里面维基它们的链接)的各种软件项目的来源。
你也可以与微软的视觉地球地图应用程序和API工作或使用谷歌的API。我一直与ESRI产品的商业程序,但尚未开放API的那么多比赛。
此外,您可能想看看设备!和Finder!他们是相对较新的程序,但我认为他们都是免费的。可能是对嵌入data.OSM routing service限制可以在这里找到。
问题是,空间处理是在非商业规模相当新。
如果你不介意支付project wiki产生一种名为FME产品的解决方案。该工具将帮助您从任何格式的几乎任何其它转换数据。包括KML谷歌地球格式或呈现为(JPEG文件或系列)一个JPEG。转换数据后,您可以使用他们的Maker嵌入谷歌地球到您的应用程序或只显示平铺图像。
作为一个边不FME是一个非常强大的平台,因此,在做你的翻译,可以添加或删除,你不一定需要的部分数据。合并的来源,如果你有一个以上的。坐标转换(我不记得究竟谷歌地球使用)。存储备份到数据库中。但严重的是,如果你愿意掏出几块钱,你应该看看这个。
您还可以创建包含一个地点(把它放在哪里)和有关位置的其它数据/注释标志(就像在你的样图)。这些标志有许多形状和大小。
在墨卡托或其它突出一个简化是承担的纬度和经度的恒定转换因子。通过69.172英里乘以纬度的;为经度,挑选你的地图区域的中纬度和乘(180经度)的余弦(middle_latitude)* 69.172。一旦你已经转换为英里,你可以使用另一套转换才能到屏幕坐标。
这是我在1979年什么工作回来。