Bestimmten String zerlegen

komplexor

Mitglied
Hallo,

ich muß ein Simple Feature MultiPolygon zerlegen um es in ein anders Format zu konvertieren.
Der Eingangsstring hat dann in etwa das folgende Format:

MULTIPOLYGON(((0 0, 0 20, 20 20, 20 0, 0 0),(5 5, 5 15, 15 15, 15 5, 5 5)),((30 30, 30 40, 40 40, 40 30, 30 30)))
dabei repräsentiert der String zwei Polygone, wobei das erstes Polygon (0 0, 0 20, 20 20, 20 0, 0 0) ein Loch hat (5 5, 5 15, 15 15, 15 5, 5 5).
Ausgabeformat soll dann im GeoJSON Format ausgegeben werden:
[[[{lat:0, lng:0}, {lat:0, lng:20}, ... , {lat:0, lng:0}], [{lat:5, lng:5}, ... , {lat:5 ,lng:5}]] , [{lat:30 ,lng:30}..]]

Jemand eine Idee wie man am geschicktesten die Klammer mit Inhalt extrahiert und dabei auch die Polygone samt inneren Polygon erkennt?
 
Wow... noch ein Geowissenschaftler... jetzt fühl ich endlich nicht mehr so mickrig 😀

Warum zerlegst du dein MULTIPOLYGON nicht shon auf der Datenbank selbst? Ich glaub, dafür musst du einen dump nehmen... google mal nach postgis dump

EDIT: Ich hab´s mal schnelle erledigt: ST_Dump

Alternativ kannst du auch einfach über String#split("),") gehen...
 
Zuletzt bearbeitet:
ja, wir werden immer mehr 😉

Das Problem ist, dass der String nicht aus der DB kommt, sondern mehr oder weniger direkt aus der Map. Mit Geotools könnte ich das auch ganz leicht konvertieren, aber ich muß das leider alleine machen, also den String parsen und neu formatieren.
Für weitere Hilfe wär ich sehr dankbar.
 
Das Problem wollte ich auch schonmal behandeln, hab´s aber aufgegeben. Mein Ansatz damals war, einfach zu jeder sich öffnenen Klammer die schließende Klammer zu suchen. Öffnet sich VOR dem Schließen der Klammer schon wieder eine, wird die zugehörige Funktion rekuriv nochmal aufgerufen, bis endlich mal eine schließende Klammer gefunden wurde...
Vlcht, hilft dir das ein wenig.

EDIT: Aber das mit .split("),") haste schon probiert?
EDIT: Ne, geht wirklich nicht, da wird erstmal ´ne PatternSyntaxException geworfen... was auch irgendwie verständlich ist.
 
Zuletzt bearbeitet:
genau den ansatz wollte ich auch verfolgen, ist aber irgendwie voll frikelig. Bin gerade dabei mit dem Tokenizer zu arbeiten, da split() in diesem fall nicht so nützlich ist. bekomme dann diese ausgabe
(((0 0, 0 20, 20 20, 20 0, 0 0 --> erstes Polygon
,(5 5, 5 15, 15 15, 15 5, 5 5 --> inneres P im ersten P
,((30 30, 30 40, 40 40, 40 30, 30 30 --> zweites P
ich denke darauf lässt sich aufbauen. mal sehen wie weit ich komme.
poste bei erfolg mal den code
 
also ich kenn mich mit der Materie des Multipolygons jetzt nich speziell aus aber wenn ich deinen Ausgangsstring so sehe sollte
split("),("); danach replaceAll("(", ""); replaceAll(")", ""); split(","); dir die freigestellten Zahlenpaare liefern.

Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:
Nicht vergessen, [c]([/c], [c])[/c] etc. sind Regex Steuerzeichen, die escaped werden müssen! Darum kriegt HimBromBeere die Exception.
 
Das mit der Exception war Himbrombeere schon klar, nur irgendwie nützte
Code:
String#split("\),")
nix genau wie
Code:
String#split("/),")
...

Aber ich gebe gerne zu, regex ist so ein Thema, um das ich mich regelmäßig drumrumdrücke😳
 
also ich kenn mich mit der Materie des Multipolygons jetzt nich speziell aus aber wenn ich deinen Ausgangsstring so sehe sollte
split("),("); danach replaceAll("(", ""); replaceAll(")", ""); split(","); dir die freigestellten Zahlenpaare liefern.

Gruß Vanny


Hallo Vanny,

das ist soweit schon klar, allerdings ist es damit noch nicht getan. Da es sich um ein MultiPolygon handelt, kann es auch vorkommen, das in einem Polygon ein weiters Polygon und darin wieder eins etc.
Daher muß ich quasi auch wissen, wo, welches Polygon ist und ob es weitere innere Polygone hat.
Für das Beispiel:
MULTIPOLYGON(((0 0, 0 20, 20 20, 20 0, 0 0),(5 5, 5 15, 15 15, 15 5, 5 5)),((30 30, 30 40, 40 40, 40 30, 30 30))) = zwei Polygone bzw. drei Polygone, wobei das erste ein inneres Polygon enthält und das zweite ein einzelnes Polygon ist

((0 0, 0 20, 20 20, 20 0, 0 0),(5 5, 5 15, 15 15, 15 5, 5 5)) = Polygon mit inneren Polygon
((30 30, 30 40, 40 40, 40 30, 30 30)) = ein anderes Polygon
 
Das mit der Exception war Himbrombeere schon klar, nur irgendwie nützte
Code:
String#split("\),")
nix genau wie
Code:
String#split("/),")
...

Aber ich gebe gerne zu, regex ist so ein Thema, um das ich mich regelmäßig drumrumdrücke😳

Bei Regexes immer doppelte Backslashes zum Escapen:
Code:
String#split("\\),")
 
Oder immer wieder schön zu erwähnen, es gibt [c]Pattern.quote()[/c]. Wenn man eigentlich gar nicht nach einem Regex sondern nach einem natürlichen Ausdruck sucht, kann man [c]xy.split(Pattern.quote("),"))[/c] verwenden.
 
Tatsache... wieder was gelernt...
Werd´ mich mal über regex drüber hermachen...:rtfm:
Später...😀

Ist eigentlich logisch: Der Regex-Mechanismus braucht einen "richtigen" Backslash vor dem zu escapenden Zeichen, nur macht da der normale Escape-Mechanismus für Strings (der also Sachen wie "\n" auflöst) nicht mit, man muss also den Backslash selbst escapen (also "\\"), damit er am Ende dem Regex-Parser übergeben werden kann.
 

Zurück
Oben