使用GDAL / OGR api读取矢量数据(shapefile) - 如何?

时间:2008-12-04 10:40:34

标签: c++ linux opengl gdal

我正在开发涉及一些gis的应用程序。将会有一些.shp文件被读取并绘制到opengl屏幕上。当前的opengl屏幕正在使用glOrtho()设置的正交投影,并且已经使用简单文本文件中的坐标显示地图..

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

我有以下疑问:

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

  2. 我的应用程序需要以这样的方式设置,即我可以知道地图上某个点的确切纬度/长度。例如。如果我在X市上空盘旋,可以获取正确的纬度/长度。我知道这可以通过使用开源工具/ apis像GDAL / OGR来完成,但我搞砸了,因为这些apis的文档没有进入我的头。 我试图找到一些示例c ++编程,但找不到。

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

  4. 请你就这个问题提出意见。我非常希望能够做到这一点,但我没有得到正确的开始......

3 个答案:

答案 0 :(得分:2)

  1. Shapefile渲染在OpenGL中非常简单。您可能需要“shapelib”,一个C(Google it)中的免费shapefile解析库。使用GL_POINTS作为点shapefile, 行shapefile的GL_LINES和多边形shapefile的GL_LINE_LOOP。将边界框坐标设置为Ortho。

  2. 您从.prj文件中读取的内容是投影信息。 WGS84为您提供纬度/长度坐标(球面)。 但您的显示系统是2D(矩形)。因此,您需要将3D球面坐标转换为2D矩形坐标(这是投影的含义)。投影类型很多,取决于地球上感兴趣的区域(记住投影扭曲区域/形状/尺寸的特征)。投影类型包括Polyconic,Modified Everest,NAD,UTM等,

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

  4. 如需进一步说明,您可以通过dgplinux @ y a o o o与我联系。 c o m

答案 1 :(得分:2)

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

答案 2 :(得分:0)

GDAL / OGR拥有加载矢量文件,然后转换任何坐标所需的一切。我理解你对GDAL的沮丧,因为文档不是最好的。如果您想要一个很好的介绍来使用API​​,请查看GDAL subversion树中的gdalinfo.c和ogrinfo.cpp。来源可以在https://svn.osgeo.org/gdal/trunk/gdal看到。

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

Vector Loading

Coordinate Conversion

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

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

最后,如果所有其他方法都失败了,请看看NGA GeoTrans。这是一个很好的测试工具。