1

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

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

我有以下疑问:

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

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

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

请就这个问题提供您的意见。我真的很想完成这项工作,但我没有得到正确的开始..

4

3 回答 3

3
  1. Shapefile 渲染在 OpenGL 中非常简单。您可能需要“shapelib”,这是一个免费的 C 语言 shapefile 解析库(Google it)。点 shapefile 使用 GL_POINTS,线 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”等。

如需进一步说明,您可以通过 dgplinux@yahoo 与我联系。com

于 2008-12-23T16:21:59.667 回答
2

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

于 2010-01-24T16:26:55.160 回答
0

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

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

矢量加载

坐标转换

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

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

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

于 2014-07-07T00:01:24.413 回答