mySQL Spatial VARCHAR zu LINESTRING Data Type

frizzer

Neuer Benutzer
Beiträge
3
Hallo,
ich habe folgende 2 Spalten in meiner table:
  1. shape VARCHAR(10000),
  2. shape_geo LINESTRING
Die Datensätze in shape sehen folgendermaßen aus:
24610.49 1794.43,24602.39 1782.19

Damit sollten das wohl ein gültiges WKT Format sein.

Wie kann ich jetzt die VARCHAR Einträge aus der Spalte "shape" in die LINESTRING Spalte "shape_geo" überführen?

Ich habe einiges versucht, z.B:
updatetableSET shape_geo = ST_GeomFromText('LINESTRING(shape)');

was zum Error führt:

ERROR 3037(22023): Invalid GIS data provided tofunction st_geometryfromtext.

Auch:
updatetableSET shape_geo = ST_GeomFromText('LINESTRING(',shape,')');

liefert einen Fehler:
ERROR 1582(42000): Incorrect parameter count in the call to native function'ST_GeomFromText'


Für Hilfe wäre ich sehr dankbar!
 
Werbung:
wild guess: ST_GeomFromText macht das, was der Name besagt: es generiert eine Geometrie aus einem Text. Aber möglicherweise nicht aus einem Linestring. Hab jetzt aber mein PostGIS-Buch nicht hier.
 
Hallo akretschmer,
deine Antwort klingt plausibel. Ich habe diesen Lösungsansatz getestet, aber leider führt auch das nicht zum Erfolg:

update table SET shape_geo = ST_GeomFromText(shape);

ERROR 3037 (22023): Invalid GIS data provided to function st_geometryfromtext.

Meinen Ansatz aus der Frage habe ich aus anderen Beispielen entnommen, z.B.
SELECT ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)');
aus ST_GeomFromText

Ich vermute es liegt daran, wie ich versuche auf die Spalte "shape" zuzugreifen.
Vielleicht ist das ein einfacher SQL Syntax Fehler den ich da einbaue? Darauf deutet die ERROR Meldung "incorrect parameter count" hin.
 
Code:
andreas@[local]:5433/test# \d frizzer;
  Table "public.frizzer"
 Column |  Type  | Collation | Nullable | Default
--------+----------+-----------+----------+---------
 id  | integer  |  | not null |
 l  | text  |  |  |
 g  | geometry |  |  |
Indexes:
  "frizzer_pkey" PRIMARY KEY, btree (id)

andreas@[local]:5433/test# select * from frizzer ;
 id |  l  | g
----+-----------------------------------+---
  1 | 24610.49 1794.43,24602.39 1782.19 |
(1 row)

andreas@[local]:5433/test*# update frizzer set g = ST_GeomFromText('LINESTRING(' || l || ')');
UPDATE 1
andreas@[local]:5433/test*# select * from frizzer ;
 id |  l  |  g   
----+-----------------------------------+------------------------------------------------------------------------------------
  1 | 24610.49 1794.43,24602.39 1782.19 | 010200000002000000C3F5285C9F08D8401F85EB51B8099C405C8FC2F59806D840F6285C8FC2D89B40
(1 row)

andreas@[local]:5433/test*#

Wenn Du mit Geodaten arbeitest, wäre PG deutlich besser für Dich. Du könntest massiv von besseren Indexen profitieren, u.a. auch von index-basierter Umkreissuche.
 
Hallo akretschmer,

vielen Dank für deine Unterstützung !

Es hat tatsächlich funktioniert. Ich musste jedoch für den string-concat die Schreibweise an mySQL anpassen:
update table set shape_geo = ST_GeomFromText(CONCAT('LINESTRING(', shape, ')'));

PS: der Data Type kann auf LINESTRING bleiben, eine Änderung auf die übergeordnete Klasse GEOMETRY war bei mir nicht nötig.
PG werde ich mir die Tage genauer anschauen. Da gibt es aber wohl keinen guten XML Parser, was die erste google Suche ergab. Die Funktion benötige ich für das Projekt ebenfalls.


Danke nochmals!
Grüße
 
Werbung:
Zurück
Oben