Tempelmodelle in der Irrlicht Engineby Jan Seyler und Nithi Rungtanapirom |
Die ShapelibC++ Library zum Arbeiten mit ShapefilesAls wir uns zu Anfang unseres Projekts mit der Verarbeitung von ArcGIS Shapedateien beschäftigt haben, sind wir nach einiger Zeit des Rumprobierens auf die Shapelib gestoßen.Hierbei handelt es sich um eine C/C++ Library zum Arbeiten mit Shapefiles. Die Library läuft unter der GNU Lizenz und ist somit frei zugänglich und anpassbar. Die Internetseite bietet eine vollständige API, welche ich an dieser Stelle wärmstens empfehle. Wie die Shapelib funktioniert und wie wir sie angewendet haben, möchte ich hier kurz darstellen: Die Dateien *.shp und *.shx werden bei der Benutzung der Shapelib gleichzeitig gelesen und als Objekt der Klasse "SHPHandle" gespeichert. Dies beinhaltet aber mehrere Unterobjekte der Klasse "SHPObject". Um zuerst einmal einige wichtige Information über die Shapefiles zu erhalten, wird die Funktion SHPGetInfo aufgerufen. Dadurch erfährt man die Anzahl der Unterobjekte, den Typ der Shapefiles, und die Schranken der beinhalteten Daten. Ein Objekt der Klasse "SHPObject" hat folgende Struktur:
typedef struct Dabei haben die Arrays panPartStart und panPartType die Größe gleich nParts, die Arrays padfX, padfY, padfZ, padfM dann die Größe gleich nVertices. Ist SHPObject vom Typ 1 (Punkt), 3 (Polylinie), 5 (Polygon) oder 8 (Multipoint), so handelt es sich dabei um ein zweidimensionales Objekt, und alle Einträge padfZ und padfM sind dann gleich Null, wie z.B. in unseren Dateien. Neben den *.shp und *.shx Dateien gibt es auch die *.dbf-Datei. Diese speichert die Attribute der Shapefiles und wird beim Auslesen als Objekt der Klasse "DBFHandle" gespeichert. Sie kann mehrere Felder enthalten, im jeweiligen Feld gibt es aber idR genauso viel Einträge wie Unterobjekte des SHPHandles. Mithilfe von DBFGetFieldCount() kann man die Anzahl der Felder, von DBFGetFieldInfo(), den Namen des jeweiligen Feldes, die Größe und ggf. die Genauigkeit der Dezimaldarstellung auslesen. Im Rahmen unseres Softwarepraktikums haben wir folgende Shapefiles verwendet:
Anmerkung: da es sich hier um objektorientierte Programmierung handelt, muss man am Ende alle erzeugte Objekte wieder löschen. Dazu gibt es die Funktionen SHPClose() für SHPHandle, DBFClose() für DBFHandle, und SHPDestroyObject() für SHPObjekt (also der einzelne Eintrag von SHPHandle). |