[Wsplgen-commits] r142 - in trunk: . src
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Mon Feb 16 00:15:23 CET 2009
Author: mrchip
Date: 2009-02-16 00:15:18 +0100 (Mon, 16 Feb 2009)
New Revision: 142
Modified:
trunk/NEWS
trunk/src/file.cpp
trunk/src/test_file.cpp
trunk/src/wsplgen.h
Log:
neues DGM-Format wird nun z.T. unterstuetzt
Modified: trunk/NEWS
===================================================================
--- trunk/NEWS 2008-12-11 09:39:39 UTC (rev 141)
+++ trunk/NEWS 2009-02-15 23:15:18 UTC (rev 142)
@@ -10,6 +10,11 @@
// Read the file COPYING coming with WSPLGEN for details.
//
+Version 1.3.0
+
+ - Ein neues DGM-Format (bisher nur als Beispiel der BfG wird nun unterstützt
+ Das Format ist noch nicht endgültig implementiert
+
Version 1.2.9
- Die Höhen von Linienstrukturen werden bei fehlenden Z-Höhen nun korrekt interpoliert.
Modified: trunk/src/file.cpp
===================================================================
--- trunk/src/file.cpp 2008-12-11 09:39:39 UTC (rev 141)
+++ trunk/src/file.cpp 2009-02-15 23:15:18 UTC (rev 142)
@@ -149,6 +149,11 @@
LoadDGMXYZ(FileName, NodeList, BegrenzungsPolygon, DebugLevel);
CheckForDuplicates(NodeList, ElementList, DebugLevel);
}
+ else if (ToUpperCase(Ext) == ".XML")
+ {
+ LoadDGMXML(FileName, NodeList, BegrenzungsPolygon, DebugLevel);
+ CheckForDuplicates(NodeList, ElementList, DebugLevel);
+ }
else if (ToUpperCase(Ext) == ".SHP")
{
LoadDGMSHP(FileName, NodeList, BegrenzungsPolygon, IsSetNoProjWarn, DebugLevel);
@@ -735,6 +740,190 @@
}
//---------------------------------------------------------------------------
+int ReadString(FILE* fh, char* compstring)
+{
+ int AnzZeilen = 0;
+
+ // Lese solange bis nix oder das erste Zeichen kommt
+ // und zaehle die Zeilen
+ int c = fgetc(fh);
+ do
+ {
+ while (EOF != c && compstring[0] != c)
+ {
+ if (c == '\n') AnzZeilen++;
+ c = fgetc(fh);
+ }
+ if (EOF == c) return (-1);
+
+ // Ok, das erste Zeichen stimmt
+ // nun muessen alle weiteren auch stimmen
+ unsigned int i = 1;
+ c = fgetc(fh);
+ while (i < strlen(compstring) && EOF != c && compstring[i] == c)
+ {
+ i++;
+ if (i >= strlen(compstring)) break;
+ c = fgetc(fh);
+ }
+
+ if (EOF == c) return (-1);
+ if (i >= strlen(compstring)) return (AnzZeilen);
+ } while (true);
+}
+//---------------------------------------------------------------------------
+int ReadDouble(FILE* fh, double* D)
+{
+ int AnzZeilen = 0;
+
+ // Lese solange bis nix oder eine Ziffer kommt
+ // und zaehle die Zeilen
+ int c = fgetc(fh);
+ while (EOF != c && (c < '0' || c > '9'))
+ {
+ if (c == '\n') AnzZeilen++;
+ c = fgetc(fh);
+ }
+ if (EOF == c) return (-1);
+
+ // Ok, das erste ist eine Ziffer
+ // nun muessen alle weiteren Zeichen entweder Ziffern oder ein Punkt oder ein Komma sein
+ double v = 0.0;
+ int exp = 1;
+ double faktor = 1.0;
+ while (EOF != c && ((c >= '0' && c <= '9') || c == '.' || c == ','))
+ {
+ if (c == '.' || c == ',')
+ {
+ if (exp != 1)
+ {
+ // Es gab zwei kommata
+ return (-1);
+ }
+ exp = exp + 1;
+ }
+ else
+ {
+ if (exp == 1)
+ {
+ v = v * 10 + (c - '0');
+ }
+ else
+ {
+ faktor = faktor / 10.0;
+ v = v + (c - '0') * faktor;
+ }
+ }
+ c = fgetc(fh);
+ }
+
+ if (EOF == c) return (-1);
+
+ fseek(fh, -1L, SEEK_CUR);
+
+ *D = v;
+
+ return (AnzZeilen);
+}
+//---------------------------------------------------------------------------
+bool LoadDGMXML(std::string FileName, TNodeList *NodeList, TXYZList *XyList, int DebugLevel)
+{
+ write_fortschritt("->Laden des DGM in Datei '%s' als XML gestartet\n", FileName.c_str());
+
+ FILE *fh = fopen(FileName.c_str(), "r");
+ if (fh == 0)
+ {
+ write_error(2201, "Konnte '%s' nicht zum Lesen öffnen\n", FileName.c_str());
+ }
+
+ double X = 0.0;
+ double Y = 0.0;
+ double Z = 0.0;
+
+ unsigned int AnzWerte = 0;
+ unsigned int AnzKnoten = 0;
+
+ int Zeilen = 0;
+ int AnzZeilen = ReadString(fh, "<Koordinate>");
+ while (AnzZeilen > 0)
+ {
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadString(fh, "<x>");
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten x Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), Zeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadDouble(fh, &X);
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten x Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadString(fh, "</x>");
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten x Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadString(fh, "<y>");
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten y Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadDouble(fh, &Y);
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten y Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadString(fh, "</y>");
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten y Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadString(fh, "<z>");
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten z Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadDouble(fh, &Z);
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten z Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadString(fh, "</z>");
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten z Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzZeilen = ReadString(fh, "</Koordinate>");
+ if (AnzZeilen < 0) write_error(2297, "Konnte keinen korrekten x,y,z Eintrag in der Datei '%s' in der Zeile %d lesen\n", FileName.c_str(), AnzZeilen);
+ Zeilen = Zeilen + AnzZeilen;
+
+ AnzWerte++;
+
+ if (DebugLevel >= 9 || (DebugLevel >= 1 && AnzWerte % 10000 == 0) || (AnzWerte > 0 && AnzWerte % 100000 == 0))
+ {
+ write_fortschritt("%d Werte gelesen, %d Knoten im Speicher\n", AnzWerte, NodeList->size());
+ }
+
+ long XL = (long)(X * 100 + 0.5);
+ long YL = (long)(Y * 100 + 0.5);
+ int ZI = (long)(Z * 100 + 0.5);
+
+ TInsideTyp InsideTyp = INSIDE;
+ if (XyList && XyList->size() > 2) InsideTyp = XyList->IsInsideXYList(XL, YL);
+ if (InsideTyp == INSIDE || InsideTyp == ON_LINE)
+ {
+ AnzKnoten++;
+
+ TNode *Node = new TNode(AnzKnoten, XL, YL, ZI);
+ NodeList->Add(Node);
+ }
+
+ AnzZeilen = ReadString(fh, "<Koordinate>");
+ Zeilen = Zeilen + AnzZeilen;
+ }
+
+ write_fortschritt("%d Werte gelesen, %d Knoten im Speicher\n", AnzWerte, NodeList->size());
+
+ fclose(fh);
+
+ write_fortschritt("<-Laden des DGM in Datei '%s' als XML beendet\n", FileName.c_str());
+
+ return (true);
+}
+
+//---------------------------------------------------------------------------
bool LoadDGMSHP(std::string FileName, TNodeList *NodeList, TXYZList *XyList, bool NoProjWarn, int DebugLevel)
{
write_fortschritt("->Laden des DGM in Datei '%s' als SHP gestartet\n", FileName.c_str());
Modified: trunk/src/test_file.cpp
===================================================================
--- trunk/src/test_file.cpp 2008-12-11 09:39:39 UTC (rev 141)
+++ trunk/src/test_file.cpp 2009-02-15 23:15:18 UTC (rev 142)
@@ -33,9 +33,9 @@
#define DGMXYZFILE2 "test_daten\\dgm_gross.xyz"
#define DGMXYZFILE3 "test_daten\\dgm_ziemlich_gross.xyz"
#define DGMXYZFILE4 "test_daten\\dgm_sehr_gross.xyz"
+#define DGMXMLFILE "test_daten\\dgm.xml"
#define DGMSHPFILE "test_daten\\dgm.shp"
#define DGMSHPFILE2 "test_daten\\dgm2.shp"
-#define DGMXYZFILE4 "test_daten\\dgm_sehr_gross.xyz"
#define DGM2DMFILE "test_daten\\dgm.2dm"
#define PROFILFILE "test_daten\\profile.shp"
#define PROFILZFILE "test_daten\\profilez.shp"
@@ -60,6 +60,7 @@
#define DGMXYZFILE2 "test_daten/dgm_gross.xyz"
#define DGMXYZFILE3 "test_daten/dgm_ziemlich_gross.xyz"
#define DGMXYZFILE4 "test_daten/dgm_sehr_gross.xyz"
+#define DGMXMLFILE "test_daten/dgm.xml"
#define DGMSHPFILE "test_daten/dgm.shp"
#define DGMSHPFILE2 "test_daten/dgm2.shp"
#define DGM2DMFILE "test_daten/dgm.2dm"
@@ -660,6 +661,25 @@
}
/////////////////////////////////////////////////
+ // Test von DGM-XML ohne Begrenzungspolygon laden
+ /////////////////////////////////////////////////
+
+ {
+ printf ("Test DGM-XML ohne Begrenzungspolygon laden: ");
+
+ TNodeList *NodeList = new TNodeList();
+ TElementList *ElementList = new TElementList();
+
+ LoadDGM(DGMXMLFILE, NodeList, ElementList, 0, false, 8);
+
+ if (NodeList->size() != 3) printf("Failed\n");
+ else printf("Pass\n");
+
+ delete NodeList;
+ delete ElementList;
+ }
+
+ /////////////////////////////////////////////////
// Test von DGM-SHP ohne Begrenzungspolygon laden
/////////////////////////////////////////////////
Modified: trunk/src/wsplgen.h
===================================================================
--- trunk/src/wsplgen.h 2008-12-11 09:39:39 UTC (rev 141)
+++ trunk/src/wsplgen.h 2009-02-15 23:15:18 UTC (rev 142)
@@ -10,7 +10,7 @@
// Read the file COPYING coming with WSPLGEN for details.
//
-const char Version[] = "1.2.9";
+const char Version[] = "1.3.0";
// In der Datei wsplgen.h wird jetzt keine Historie mehr gespeichert.
// Diese ist nun in der Datei NEWS zu finden
More information about the Wsplgen-commits
mailing list