2008-12-04 96 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。這是一個很棒的測試工具。