什么是阅读,代表和渲染地图数据的最佳方式是什么?

问题描述 投票:12回答:11

我兴趣写一个简单的导航应用作为宠物项目。免费地图数据检索各地后,我对US Census Bureau TIGER 2007线/ Shape文件的地图数据解决。该数据被分成各个县zip文件,我已经下载了单县的地图数据为我区。

什么是在这个地图数据读入一个可用的格式最好的方法是什么?

我应该如何:

  • 阅读这些文件
  • 解析它们 - 正则表达式或一些已经可以分析这些形状文件库?
  • 将数据加载到我的应用程序 - 我应该直接加载点到内存中数据结构的一些?使用一个小型的数据库?我有没有必要进行持久,一旦你关闭地图数据的应用。用户可以再次加载Shape文件。

什么是呈现地图一次我看了在shapefile数据的最佳方式?

理想情况下,我想能够在一个县的地图数据shape文件读取和渲染的所有折线到屏幕上,并允许旋转和缩放。

我应该如何:

  • 转换纬度/经度点为屏幕坐标? - 据我知道的Shapefile使用经度和纬度为它点。所以,很显然,我将不得不以某种方式将其换算成屏幕坐标显示的地图功能。
  • 渲染的方式,我可以很容易地旋转和缩放整个地图的地图数据(A系列折线道路,边界等)?
  • 渲染我的整个地图上会以“瓦”因此,只有视域内的特征/线的呈现?

防爆。 TIGER的数据呈现为显示图:

任何人只要有一定的经验和洞察对我来说,在这些文件中读取我,应该如何代表他们(数据库中存储数据结构)在我的计划,我应该如何渲染(带旋转/缩放)地图数据的最佳方式在屏幕上,将不胜感激。

编辑:为了澄清,我不希望使用任何谷歌或雅虎地图API。同样,我不想使用OpenStreetMap的。我正在寻找一个更从划痕的方法不是利用这些API /程序。这将是一个桌面应用程序。

java .net graphics rendering maps
11个回答
24
投票

首先,我建议您使用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信息来源。

祝你好运,并请发表不管你做什么,无论多么简陋或难看,以便其他人可以受益!

-亚当


1
投票

当我把这个答案的问题被标记

“什么是渲染shape文件(地图数据)折线.NET中的最佳方式是什么?”

现在,这是一个不同的问题,但我离开我的回答原来的问题。

我写使用普通GDI +在c#NET版本,可以绘制矢量的数据(例如来自一个SHP文件的几何形状)。这是相当有趣。

其原因是,我们需要处理不同版本的几何形状,并用了很多附加属性的信息,所以我们不能使用商业地图组件或使用开源的一个。

这样做时,最主要的是建立一个视口和翻译/转换WGIS84坐标一家低档次和GDI + x,y坐标与投影等待,如果你甚至需要在所有重新投影。


0
投票

一个解决方案是使用的MapXtreme。他们有API的Java和C#。该API能够载入这些文件,使它们。

对于Java:

API

对于.NET:

My source for the number of miles per degree.

我曾经在一个桌面应用该解决方案,效果不错。它提供了更多,只有呈现信息。

现在从头开始做这可能需要相当长一段时间。他们有一个评估版本,您可以下载。我认为它只是打印“MAPXTREME”地图作为水印结束了,但它是完全可用,否则


14
投票

SharpMap为WinForms和ASP.NET一个开源.NET 2.0映射引擎。这可以提供你所需要的所有功能。它涉及最常见的GIS矢量和栅格数据格式,包括ESRI形状文件。


7
投票

解决的办法是:

  • 地理空间服务器等地图服务器,GeoServer的,程度(开源)。

他们可以读取和服务shape文件(和许多其他的东西)。例如,的GeoServer(安装时)为来自美国人口普查局的TIGER作为shape文件演示数据

  • 一个JavaScript制图库一样的OpenLayers(见link text例子

有很多在网络上的实例使用此解决方案


5
投票

好笑的问题。下面是我如何做到这一点。

我收集我需要他们来的任何格式,我一直拉着美国地质调查局的数据,这样无异于一堆任何几何形状:

然后我写了一个程序,“编译”的形定义成一种形式,是有效率的渲染。这意味着做任何突起和数据格式转换所必需的有效显示数据。一些细节:

  • 对于2D应用程序,你可以使用任何你想要的投影:Map Projections
  • 对于3D,你想那些纬度/经度转换成三维坐标。这里是如何做到这一点一些数学:transformation from spherical coordinates to normal rectangular coordinates
  • 打破了所有的图元到四叉树/八叉树(2D / 3D)。在此树的叶节点包含对相交该叶节点的(轴线对齐)边界框所有几何引用。 (这意味着片几何形状可以被引用一次以上。)
  • 然后几何形状分成顶点的表和绘图命令的表。这是对OpenGL的理想格式。命令可以通过使用glDrawArrays顶点缓冲区(Vertex Buffer Objects)发行。
  • 一般访问者模式是用来走路的四叉树/八叉树。步行涉及测试,直到遇到叶子节点的访问者是否相交的树的给定节点。参观者中包括:素描,碰撞检测和选择。 (因为树叶可以包含重复参照几何,漫步者标志着节点作为被访问,然后忽略它们。这些标记必须重置或做下一个走之前,否则更新。)
  • 使用空间分隔系统(树中的一个)和一个绘图有效的表示是为了实现高帧速率的关键。我发现,在这些类型的应用程序,你希望你的帧速率高达至少20个可能FPS。更何况事实,即大量的性能将带给你无限的机会,创造一个更好看的地图。 (矿山远远好找,但有一天会实现这个目标。)
  • 空间分隔有助于通过减少发送到处理器绘图命令的数量的渲染性能。但是,有可能来的时候,用户实际上想要查看整个数据集(或许是宋体视图)。在这种情况下,你需要详细的控制系统的水平。由于我的应用程序与街头交易,我到公路和道路较大优先。我的绘制代码知道我的帧率下降之前,我多少可以借鉴的原语。原语也由该优先级排序。我只画出了第一x项目,其中x是原语我可以在我所期望的帧率绘制的数量。

剩下的就是相机的控制,你想显示的任何数据的动画。

这里是我现有的实现的一些例子:

Picture http://seabusmap.com/assets/Picture%205.png Picture http://seabusmap.com/assets/Picture%207.png


2
投票

在本地存储数据的老虎,我会选择与qazxsw POI工具qazxsw POI。

他们的工具藏品令人印象深刻,你特别是Postgresql提供进口和使用老虎数据的好办法。

你需要看看与PostGIS的交互的工具,最有可能的某种postgis

Tiger Geocoder

现在有与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地图服务器,这将是在桌面环境中使用。


2
投票

虽然你已经决定使用TIGER数据,你可能会感兴趣的mapserver,怎么一回事,因为OSM中有老虎的数据,与用户丰富的完整的进口提供的数据。如果你坚持TIGER格式,您的应用程序将是无用的国际用户,OSM你TIGER和一切在一次。

OSM是一个开放的项目设有协作编辑自由世界地图。你可以得到所有这些数据以及结构化的XML,无论是查询的区域,或下载整个世界都在一个大的文件。

有在各种编程语言提供的OSM,大多数开源地图的一些渲染器,但仍然有许多工作要做。

还有是http://postgis.refractions.net/documentation/ avaliable。它有一个网络接口,还可以通过Web服务API是可查询的。再次,这还不是全部完成。用户肯定可以使用建立在此之上桌面或移动路由应用。

即使你没有决定去与该项目,你可以得到很多从它的灵感。只要有一个看看OSM (Open Street Map),并在其参与(你会发现里面维基它们的链接)的各种软件项目的来源。


1
投票

你也可以与微软的视觉地球地图应用程序和API工作或使用谷歌的API。我一直与ESRI产品的商业程序,但尚未开放API的那么多比赛。

此外,您可能想看看设备!和Finder!他们是相对较新的程序,但我认为他们都是免费的。可能是对嵌入data.OSM routing service限制可以在这里找到。

问题是,空间处理是在非商业规模相当新。


1
投票

如果你不介意支付project wiki产生一种名为FME产品的解决方案。该工具将帮助您从任何格式的几乎任何其它转换数据。包括KML谷歌地球格式或呈现为(JPEG文件或系列)一个JPEG。转换数据后,您可以使用他们的Maker嵌入谷歌地球到您的应用程序或只显示平铺图像。

作为一个边不FME是一个非常强大的平台,因此,在做你的翻译,可以添加或删除,你不一定需要的部分数据。合并的来源,如果你有一个以上的。坐标转换(我不记得究竟谷歌地球使用)。存储备份到数据库中。但严重的是,如果你愿意掏出几块钱,你应该看看这个。

您还可以创建包含一个地点(把它放在哪里)和有关位置的其它数据/注释标志(就像在你的样图)。这些标志有许多形状和大小。


1
投票

在墨卡托或其它突出一个简化是承担的纬度和经度的恒定转换因子。通过69.172英里乘以纬度的;为经度,挑选你的地图区域的中纬度和乘(180经度)的余弦(middle_latitude)* 69.172。一旦你已经转换为英里,你可以使用另一套转换才能到屏幕坐标。

这是我在1979年什么工作回来。

Safe Software

© www.soinside.com 2019 - 2024. All rights reserved.