2008-12-04 56 views
1

我正在研究涉及一些GIS的应用程序。将会有一些.shp文件被读取并绘制到opengl屏幕上。当前的opengl屏幕正在使用从glOrtho()设置的正交投影,并且已经使用来自简单文本文件的坐标显示地图。使用GDAL/OGR api读取矢量数据(shapefile) - 如何?

现在要绘制的地图将从shapefile中读取。

我有以下几点疑惑:

  1. 如何使用.shp文件的WGS84投影(从shape文件,WKT格式的.prj文件读取)到我现有的glOrtho投影..有没有需要完成的转换?它与glOrtho()的设置有什么不同?基本上如何使用这些信息?

  2. 我的应用程序需要设置的方式,我可以知道一个点在地图上的确切纬度/经度。例如。如果我在X城市徘徊,它的正确纬度/长度可能会被提取。我知道这可以通过使用像GDAL/OGR开源utils/apis来完成,但我很乱,因为这些apis的文档没有进入我的头。 我试图找到一些示例C++ progs,但找不到一个。

  3. 我已经编写了自己的逻辑从包含点/多段线/多边形(使用C-shapelib)的shapefile读取坐标并绘制在我的opengl屏幕上。我在doc中找到了一个OGR示例代码来读取POINTS shapefile,但POLYGON shapefile没有。问题是,这个应用程序必须是动态的,以便加载shapefile时,它应该正确设置opengl屏幕的投影,具体取决于被读取的.shp文件的投影.eg WGS84,LCC,EVEREST MODIFIED ...等。如何从OGR api实现这一点?

请给你的投入就这个问题..我真的很渴望,使这项工作,但即时通讯没有得到正确的开始..

回答

2
  1. Shape文件的渲染是很简单的在OpenGL。你可能需要“shapelib”,一个C语言中的免费shapefile解析库(Google it)。对于shape shape文件使用GL_POINTS,对于shape shape文件使用GL_LINES,对于多边形shapefile使用GL_LINE_LOOP。将你的包围盒坐标设置为Ortho。

  2. 您从.prj文件读取的内容是投影信息。 WGS84为您提供经纬度(球形)。 但是你的显示系统是2D(矩形)。因此,您需要将三维球面坐标转换为二维矩形坐标(这是投影的含义)。投影类型很多,取决于地球上感兴趣的区域(记住投影会扭曲区域/形状/特征的大小)。投影类型范围从Polyconic,修改Everest,NAD,UTM等,

  3. 如果您只是需要WGS84,然后阅读您的.sh文件的边界框coords并将它们分配给glOrtho。如果您有任何投影(例如:-UTM),则将边界框坐标转换为投影坐标,然后将新投影的坐标分配给glOrtho。用于将纬度/经度到任何投影,则可能需要像“Projlib”或“GeotransEngine”投影库等

为进一步澄清可能联系我dgplinux @ Y A H 2 O O操作。c o m

2

请阅读OGR API Tutorial,您可以在其中学习如何从Shapefile等来源读取矢量数据。接下来,检查OGR Projections Tutorial,您可以在这里了解如何使用从OGR源读取的投影和空间参考系统信息。

0

GDAL/OGR具有加载矢量文件所需的所有内容,然后转换任何坐标。由于文档不是最大的,我理解你对GDAL的沮丧。如果您想要使用API​​,请查看GDAL Subversion树中的gdalinfo.c和ogrinfo.cpp。来源可以在https://svn.osgeo.org/gdal/trunk/gdal看到。

如果这没有帮助,我有两个基本的例子,我用它来解析矢量信息并做坐标转换。他们真的很糟糕,但他们可能有助于明白这一点。

Coordinate Conversion

最后,如果你不熟悉的GIS格式,我会考虑下Guide Books/Map Projections阅读的ArcGIS介绍here。由于这些指南,我可以与专家竞争,尽管没有制图培训。另一个好的来源是维基百科。

如果有疑问,只需选择要坚持使用的UTM网格,并将UTM用作坐标系。它使用X(东向),Y(北向)和Z(高度)。唯一的关键是选择一个单一的UTM网格并确保所有坐标都将其用作参考。由于网上有很多指南,UTM很容易测试代码。您还可以使用OGR/GDAL或其他资源查找转换代码。其他投影坐标系统是值得的,可能会更好,但我会先看看。

最后,如果一切都失败了,请看看NGA GeoTrans。这是一个很棒的测试工具。