Ergebnis 1 bis 6 von 6

Thema: Multipolygon bzw. Multilinestring in Point-Geometrie auflösen

  1. #1
    PagMan ist offline Neuer Benutzer
    Registriert seit
    07.09.2010
    Beiträge
    3

    Beitrag Multipolygon bzw. Multilinestring in Point-Geometrie auflösen

    Guten Morgen,

    Ich habe in versch. PG-Tabellen Daten in Form vom Geometrietyp Multipolygon bzw. Multilinestring abgelegt. Ich möchte jetzt auf PG-Basis die einzelnen Punkte der Geometrie entnehmen, und in einer neuen Tabelle mit Point-Geomtrie speichern.
    Für den ersten Punkt gibt es ja folgende Lösung, ich möchte das halt für alle Punkte, und duplikate sind mir egal.
    SELECT asewkt(the_geom), ST_AsText(ST_StartPoint(the_geom::geometry)) FROM tabelle;

    Danke für eure Hilfe
    Alexander

  2. #2
    Gisman ist offline Erfahrener Benutzer
    Registriert seit
    20.01.2006
    Ort
    Pfalz
    Beiträge
    794

    Standard

    Dafür gibt es in PostGIS die Möglichkeit, die Polygone in Linien aufzulösen, die man dann in ihre Punkte zerlegen kann. AFAIR gibt es in PostGIS 1.5 dafür eine Funktion, andernfalls kann man sich das auch selber schreiben. Einfach mal ein bisschen im PostGIS -Handbuch schmökern, da findet sich dann schon was. Wenn ich nachher Zeit hab, such ich mal genauer und poste es hier. Ich hab das schon mal gemacht.

    Gruß Uwe

    EDIT: Ok, ich finds grad nicht. Prinzipiell lief das so, das man in einer Funktion ein Polygon zu Linien gemacht hat (z.B. als Ring o.ä), dann durch die einzelnen Linien gellop ist und jeweils die Anuzahl der Punkte bestimmt hat. In einem weiteren Loop hat man dann die einzelnen Punkte (mit PointN) in die ergebnisenge geschrieben. Als Ergebnis kann ein Rowset der Punkte incl. einer ID raus, das man per insert in eine eigene Tabelle schreiben konnte.

    Ich hoff das hat etwas geholfen...

    CU

    Edit2: TADA!

    Code:
    CREATE OR REPLACE FUNCTION getborderpoints(IN geom geometry, OUT idx integer, OUT xcoord numeric, OUT ycoord numeric)
      RETURNS SETOF record AS
    $BODY$
    --DECLARE
    
    --  xcoord numeric;
    --  ycoord numeric;
      
    BEGIN
      for i in 1 .. (select st_numpoints($1)) loop
        idx := i;
        xcoord := st_x(st_pointn($1,i));
        ycoord := st_y(st_pointn($1,i));
        raise notice '%, %, %', i, xcoord, ycoord;
        return next;
      end loop;
      return;
    END;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE
    Du musst noch die Geometrie als Ausgabeparameter definieren.

    CU
    Geändert von Gisman (07.09.2010 um 10:01 Uhr)
    Have a lot of fun!

  3. #3
    PagMan ist offline Neuer Benutzer
    Registriert seit
    07.09.2010
    Beiträge
    3

    Standard

    Hallo Uwe,
    ich bin ja noch neu hier, und weiss nicht ob ich das richtig mache.
    Ich habe die Funktion mit PGAdmin eingetragen.
    Dann habe ich mit "select getborderpoints(the_geom) from geom_lin;" folgendes Ergebniss.
    Was meinst du mit "noch die Geometrie als Ausgabeparameter definieren".
    Danke
    Alexander

    ####################################
    NOTICE: 1, 3464820.996, 5775033.223
    ERROR: set-valued function called in context that cannot accept a set
    CONTEXT: PL/pgSQL function "getborderpoints" line 12 at return next

    ********** Fehler **********

    ERROR: set-valued function called in context that cannot accept a set
    SQL Status:0A000
    Kontext:PL/pgSQL function "getborderpoints" line 12 at return next
    ##################################

  4. #4
    Gisman ist offline Erfahrener Benutzer
    Registriert seit
    20.01.2006
    Ort
    Pfalz
    Beiträge
    794

    Standard

    Hm, ich hab den Kontext nicht mehr ganz vor Augen in dem ioch das geschrieben hab. AFAIR kann man ihm Linien und Polygone übergeben (verm. keine Multi-Geometrien!). So wie es ist leider es dir eine Liste mit x und y-Koordinaten und eine ID wie in der ersten Zeile der Ausgabe. Damit du den Punkt als Geometrie bekommst mußt du noch in der ersten Zeile die eine Geometrie als Ausgabe-Parameter definieren und natürlich ausgeben. Also etwa so:

    Code:
    CREATE OR REPLACE FUNCTION getborderpoints(IN geom geometry, OUT idx integer, OUT xcoord numeric, OUT ycoord numeric, OUT geom geometry)
      RETURNS SETOF record AS
    $BODY$
    --DECLARE
    
    --  xcoord numeric;
    --  ycoord numeric;
    
      
    BEGIN
      for i in 1 .. (select st_numpoints($1)) loop
        idx := i;
        xcoord := st_x(st_pointn($1,i));
        ycoord := st_y(st_pointn($1,i));
        geom := st_pointn($1,i);
        raise notice '%, %, %', i, xcoord, ycoord;
        return next;
      end loop;
      return;
    END;
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE
    Die Fehlermeldung selbst besagt, das du das Ergebnis irgendwohin schreiben willst, wo es nicht geht.

    Gruß Uwe
    Have a lot of fun!

  5. #5
    PagMan ist offline Neuer Benutzer
    Registriert seit
    07.09.2010
    Beiträge
    3

    Standard

    Hallo Uwe,
    da du ja erwähnt hast, das Postgis 1.5 eine Funktion dafür hat, habe ich kurzerhand 1.5 installiert.

    Hier die Lösung (auch für Multilinestrings sowie Multipolygone):

    SELECT ST_X(geom), ST_Y(geom) from (SELECT (ST_DumpPoints(the_geom)).* FROM the_geom) as foo;

    Da PG 1.5 auf einer anderen Maschine als meine Daten läuft hier noch die Lösung mit dblink:

    dblink_connection zur entfernten Maschine:
    SELECT dblink_connect('myconn', 'hostaddr=ip port=5432 dbname=data user=xxx password=yyy');

    hier der SQL mit dblink und auch noch einer Where-Bedingung auf eine Spalte:
    SELECT ST_X(geom), ST_Y(geom) from (SELECT (ST_DumpPoints(the_geom)).*
    FROM dblink('myconn', 'SELECT spalte, the_geom FROM public.tabelle')
    AS t1(spalte character varying(3), the_geom geometry) WHERE spalte='123') as foo;

    dblink_connection zur entfernten Maschine nachher wieder trennen:
    SELECT dblink_disconnect('myconn');

    Hierbei werden Duplikate ausgegeben.

    Gruß
    Alexander

  6. #6
    Gisman ist offline Erfahrener Benutzer
    Registriert seit
    20.01.2006
    Ort
    Pfalz
    Beiträge
    794

    Standard

    So geht das auch in PostGIS <1.5. Bei mir war eine Anforderung, die Punkte der Reihe nach mit ID als csv zu liefern. Wie dem auch sei, ich kann mich daran erinnern, das ich beim Schmökern in der Doku von 1.5 sowas ähnliches gefunden hatte.
    Wird Zeit sich mal wieder mit einer vernünftigen DB zu beschäftigen. Ich werd so langsam ganz orakelig...

    CU UWe
    Have a lot of fun!

Ähnliche Themen

  1. Fehler bei st_transform für Multipolygon
    Von lars im Forum PostGIS
    Antworten: 2
    Letzter Beitrag: 13.01.2011, 14:27
  2. Zeilen auflösen
    Von Rambo im Forum SQL
    Antworten: 6
    Letzter Beitrag: 06.07.2009, 21:29
  3. Multilinestring splitten
    Von Nuadu im Forum PostGIS
    Antworten: 3
    Letzter Beitrag: 28.03.2009, 19:48
  4. Geom Collection auflösen
    Von Maik im Forum PostGIS
    Antworten: 4
    Letzter Beitrag: 16.11.2007, 15:41
  5. Endpoint von Multilinestring
    Von Sauerkraut im Forum PostGIS
    Antworten: 3
    Letzter Beitrag: 14.11.2007, 09:44

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum