读取,表示和渲染地图数据的最佳方法是什么?

时间:2008-10-21 17:22:45

标签: java .net graphics rendering maps

我有兴趣将简单的导航应用程序编写为宠物项目。在搜索免费的地图数据后,我已经确定了US Census Bureau TIGER 2007 Line / Shapefile地图数据。数据被分成各个县的zip文件,我已经为我的区域下载了一个县的地图数据。

将此地图数据读入可用格式的最佳方式是什么?

我该怎么做:

  • 读入这些文件
  • 解析它们 - 正则表达式还是一些已经可以解析这些Shapefile的库?
  • 将数据加载到我的应用程序中 - 我应该将这些点直接加载到内存中的某些数据结构中吗?使用小型数据库?关闭地图数据的应用程序后,我不需要持久性。用户可以再次加载Shapefile。

在读取Shapefile数据后,渲染地图的最佳方法是什么?

理想情况下,我希望能够读取县地图数据shapefile并将所有多边形线渲染到屏幕上并允许旋转和缩放。

我该怎么做:

  • 将lat / lon点转换为屏幕坐标? - 据我所知,Shapefile使用经度和纬度作为其点。很明显,我将不得不以某种方式将这些转换为屏幕坐标以显示地图特征。
  • 以我可以轻松旋转和缩放整个地图的方式渲染地图数据(道路,边界等一系列折线)?
  • 将整个地图渲染为一系列“图块”,以便只呈现查看区域内的要素/线条?

实施例。作为显示地图呈现的TIGER数据:
alt text

对于我在这些文件中阅读的最佳方式,我应该如何在程序中表示它们(数据库,在内存数据结构中)以及如何渲染(使用旋转/缩放)的任何人都有一些经验和洞察力的人屏幕上的地图数据将不胜感激。

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

11 个答案:

答案 0 :(得分:24)

答案 1 :(得分:14)

SharpMap是一个用于WinForms和ASP.NET的开源.NET 2.0映射引擎。这可能会提供您需要的所有功能。它涉及最常见的GIS矢量和栅格数据格式,包括ESRI shapefile。

答案 2 :(得分:7)

解决方案是:

  • 地理空间服务器,如mapserver,geoserver,degree(opensource)。

他们可以阅读和提供shapefile(以及许多其他内容)。例如,geoserver(安装时)提供来自美国人口普查局TIGER shapefile的数据作为演示

  • 像openlayers这样的javascript制图库(请参阅link text
  • 上的示例)

网上有很多使用此解决方案的例子

答案 3 :(得分:5)

有趣的问题。我就是这样做的。

我收集了他们所需要的任何几何形状。我一直在从USGS中提取数据,所以这相当于一堆:

然后我编写了一个程序,将这些形状定义“编译”成一个有效渲染的形式。这意味着要进行有效显示数据所需的任何投影和数据格式转换。一些细节:

  • 对于2D应用程序,您可以使用所需的任何投影:Map Projections
  • 对于3D,您希望将这些纬度/经度转换为3D坐标。这里有一些关于如何做到这一点的数学:transformation from spherical coordinates to normal rectangular coordinates
  • 将所有基元分解为四叉树/八叉树(2D / 3D)。此树中的叶节点包含对与该叶节点(轴对齐)边界框相交的所有几何体的引用。 (这意味着可以多次引用一块几何体。)
  • 然后将几何体拆分为顶点表和绘图命令表。这是OpenGL的理想格式。可以使用顶点缓冲区(glDrawArrays)通过Vertex Buffer Objects发出命令。
  • 一般访客模式用于遍历四叉树/八叉树。行走涉及测试访问者是否与树的给定节点相交,直到遇到叶节点。参观者包括:绘图,碰撞检测和选择。 (因为树叶可以包含对几何体的重复引用,所以walker将节点标记为被访问,然后忽略它们。这些标记在进行下一步之前必须重置或以其他方式更新。)
  • 使用空间分区系统(其中一棵树)和绘图效率表示对于实现高帧率至关重要。我发现在这些类型的应用程序中,您希望帧速率至少为20 fps。更不用说大量的表现会给你很多机会来创造一个更好看的地图。 (我的目光远非好看,但有一天会到达那里。)
  • 空间分区通过减少发送到处理器的绘图命令的数量来帮助渲染性能。但是,用户实际上可能想要查看整个数据集(可能是arial视图)。在这种情况下,您需要一个级别的细节控制系统。由于我的申请涉及街道,我优先考虑高速公路和更大的道路。我的绘图代码知道在帧速率下降之前我可以绘制多少个图元。基元也按此优先级排序。我只绘制了第一个x项,其中x是我可以按照我想要的帧速率绘制的图元数。

其余的是相机控制和想要显示的任何数据的动画。

以下是我现有实施的一些示例:

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

答案 4 :(得分:2)

用于在本地存储老虎数据,我会使用Postgresql工具选择postgis

他们拥有令人印象深刻的工具集,尤其是Tiger Geocoder提供了导入和使用老虎数据的好方法。

您需要查看与postgis交互的工具,很可能是某种mapserver

来自http://postgis.refractions.net/documentation/

  

现在有几种与PostGIS一起使用的开源工具。 uDig项目正在开发一个可以直接与PostGIS一起使用的完整读/写桌面环境。对于互联网映射,明尼苏达大学Mapserver可以使用PostGIS作为数据源。 GeoTools Java GIS工具包支持PostGIS,GeoServer Web Feature Server也支持。 GRASS支持PostGIS作为数据源。 JUMP Java桌面GIS查看器有一个简单的插件,用于读取PostGIS数据,QGIS桌面具有良好的PostGIS支持。可以使用OGR C ++库和命令行工具(以及带有捆绑的Shape文件转储器的cource)将PostGIS数据导出为多种输出GIS格式。当然,任何可以与PostgreSQL一起使用的语言都可以与PostGIS一起使用 - 该列表包括Perl,PHP,Python,TCL,C,C ++,Java,C#等。

编辑:depite mapserver在其名称中包含单词SERVER,这将在桌面环境中使用。

答案 5 :(得分:2)

虽然您已经决定使用TIGER数据,但您可能对OSM (Open Street Map)感兴趣,因为OSM已完全导入其中的TIGER数据,并丰富了用户提供的数据。如果您坚持使用TIGER格式,您的应用程序对国际用户将毫无用处,使用OSM,您可以立即获得TIGER和其他所有内容。

OSM是一个开放式项目,具有协作编辑的免费世界地图。您可以获取所有这些数据以及结构良好的XML,查询区域或在大文件中下载整个世界。

OSM有一些地图渲染器可用于各种编程语言,其中大多数是开源的,但仍有很多工作要做。

还有一个OSM routing service可用。它有一个Web界面,也可以通过Web服务API查询。同样,它并非全部完成。用户肯定可以使用基于此构建的桌面或移动路由应用程序。

即使您没有决定参与该项目,您也可以从中获得很多灵感。只需查看project wiki以及所涉及的各种软件项目的来源(您将在维基内找到它们的链接)。

答案 6 :(得分:1)

您还可以使用Microsoft的可视化地球地图应用程序和api或使用Google的API。我总是使用ESRI产品进行商业编程,并且没有那么开放的api。

另外,你可能想看Maker!和Finder!它们是相对较新的程序,但我认为它们是免费的。可能仅限于嵌入数据。Maker可以在这里找到。

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

答案 7 :(得分:1)

当我给出这个答案时,问题被标记为

“在.Net中使用折线渲染Shapefile(地图数据)的最佳方法是什么?”

现在这是一个不同的问题,但我将答案留给原来的问题。

  

我写了一个可以绘制的.net版本   矢量数据(例如几何体)   一个shp文件)在c#中使用普通的GDI +。它   非常有趣。

     

原因是我们需要   处理不同版本的   几何和属性有很多   我们可以提供更多信息   不使用商业地图组件或   一个开源的。

     

这样做的主要原因是   建立一个视口和   翻译/转换WGIS84坐标   降级和GDI + x,y   坐标并等待投影   如果你甚至需要重新投影。

答案 8 :(得分:1)

如果您不介意为解决方案付费Safe Software生产一种名为FME的产品。此工具将帮助您将数据从任何格式转换为几乎任何其他格式。包括KML Google地球格式或将其渲染为JPEG(或一系列JPEG)。转换数据后,您可以使用API将Google地球嵌入到您的应用中,或者只显示平铺图像。

作为一方而非FME是一个非常强大的平台,因此在进行翻译时,您可以添加或删除不一定需要的部分数据。如果您有多个来源,请合并来源。转换坐标(我不记得谷歌地球使用的是什么)。将备份存储在数据库中。但严重的是,如果你愿意花几块钱,你应该研究一下。

您还可以创建包含位置(放置位置)的标记(与样本地图非常相似)以及有关位置的其他数据/注释。这些旗帜有多种形状和大小。

答案 9 :(得分:1)

对墨卡托或其他投影的一种简化是假设纬度和经度的恒定转换因子。将纬度乘以69.172英里;对于经度,选择地图区域的中纬度并乘以(180-经度)乘以余弦(middle_latitude)* 69.172。转换为里程后,您可以使用另一组转换来获取屏幕坐标。

这在1979年对我有用。

My source for the number of miles per degree.

答案 10 :(得分:0)

一种解决方案是使用MapXtreme。他们有Java和C#的API。 API可以加载这些文件并进行渲染。

对于Java:

http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-java

对于.NET:

http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-2008

我在桌面应用程序中使用了此解决方案并且运行良好。它提供了更多只有渲染信息。

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