Problem INSERT INTO Geometry

Hallo,
ich habe eine Frage zu PostGis.
Ich habe eine Tabelle angelegt die so aussehen könnte:

CREATE TABLE “muster”(
id numeric,
geom geometry,
)

jetzt möchte ich gerne bestimmte Werte in diese Datenbank schreiben aber leider habe ich Probleme mit den Datantyp geometry?
Er gibt mir immer die Fehlermeldung das er den Typ Geometry ertwartet und keinen Point.
Aber den Datentyp Geomety kann doch eigentlich alle möglichen Gemetrischen Figuren speichern oder.
Vielleicht könnt ihr mir da weiterhelfen.

die Abfrage würde wie folgt aussehen: insert into “muster” (1, Point(1,1));

Ich konnte das Problem jetzt lösen wie folgt:
INSERT INTO knoten (kn_id, pos_xy, pos_z) VALUES (v_kn_id, GeometryFromText(‘POINT(-126.4 45.32)’, -1), v_pos_z);

allerdings möchte ich ganz gerne eine Funktion schreiben die mehr die entsprechenden Werte in die Tabelle hinzufügt.

INSERT INTO knoten (kn_id, pos_x, pos_y, pos_z) VALUES (v_kn_id, GeometryFromText(‘POINT(pos_x pos_y)’, -1), v_pos_z);

Leider wirft er mit hier folgende Fehlermeldung:
********** Fehler **********

ERROR: parse error - invalid geometry
SQL Status:XX000
Kontext:SQL statement "INSERT INTO knoten

Vielleicht hat jemand eine Idee

Was möchtest du genau? Ich händle das je nach Bedarf, z.B. Habe ich oft geometrien aus verschiedenen GK-Streifen, dann baue ich das Geometry-Feld als WGS84 und speichere die Orginal-Koordinaten in normalem Spalten. Falls das alles eindeutig ist, dann nehme ich meist nur ein Geometrie-Feld und erzeuge mir die jeweilgen Kordinaten bei Bedarf mit ST_X|Y|Z.
Du sollest da Geometrie-Feld übrigens mit addgeometycolumn(…) anlegen und nicht einfach im Create Table Statement. Am besten du liest dir mal die Doku und die Beispiele im PostGIS-Handbuch nach.

Grüssle und schönes Feiern

Uwe

Hallo Uwe,

ein frohes Neues und nochmal vielen Dank für deine Hilfe.
Bin gerade dabei mir die Doku anzusehen. Bevor ich Sie mir auch englisch durchlese, weiß du ob man diese auch irgendwo in deutsch herunternladen kann?
Zu dem was ich genau vorhabe. Ich habe eine Datenbank in Sybase SQl und möchte diese gerne in PostGreSQl umschreiben. Die Datenbank besteht aus mehren Tabellen und jede Tablle besitzt eine Einfüge Prozedure, wo bestimmte Fehleingaben usw. abgefangen werden.

Die Aufgabe der Datenbank ist bestimmte Knoten zu erfassen in einem rechteckigen KoordinatenSystem und bei Bedarf die Strecke zwischen den beiden Knoten zu berechnen. Ein Knoten besteht dabei aus einer x,y,z Koordinate.

Die Tabelle Knoten sind dabei wie folgt aus:

CREATE TABLE knoten
(
kn_id integer NOT NULL,
stoff_id serial NOT NULL,
ktyp_id serial NOT NULL,
pos_z integer NOT NULL,
pos_xy geometry,
CONSTRAINT “pkey(knoten)” PRIMARY KEY (kn_id, stoff_id),
CONSTRAINT “fkey(knoten)_ktyp_id” FOREIGN KEY (ktyp_id)
REFERENCES knoten_typ (ktyp_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT “fkey(knoten)_stoff_id” FOREIGN KEY (stoff_id)
REFERENCES stoff_typ (stoff_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);
ALTER TABLE knoten OWNER TO postgres;

um die Datenbank mit werden zu füllen wird eine Prozedure verwendet, die ich der Übersicht halber ein wenig gekürtzt habe:

CREATE OR REPLACE FUNCTION new_kn(v_kn_id integer, v_stoff_id integer, v_ktyp_id integer, v_pos_xy geometry, v_pos_z integer)
RETURNS integer AS
$BODY$
BEGIN
INSERT INTO knoten (kn_id, stoff_id, ktyp_id, pos_xy, pos_z) VALUES (v_kn_id, v_stoff_id, v_ktyp_id, point(pos_xy,pos_xy), v_pos_z);
END IF;
RETURN 0; --keine Fehler
END;
$BODY$
LANGUAGE ‘plpgsql’ VOLATILE
COST 100;
ALTER FUNCTION new_kn(integer, integer, integer, geometry, integer) OWNER TO postgres;
COMMENT ON FUNCTION new_kn(integer, integer, integer, geometry, integer) IS ‘new_kn’;

Mein gruoßes Problem ist hierbei die Insert Anweisung ich kann sie ausführen sobald ich Integer Werte einfüge aber sobald ich eine Integer Variavle angeben spuckt er mir Fehler aus(oben schon beschrieben)

Leider bin noch ein NewBee im gebiet PostGreSql und ich hoffe du kannst mir weiterhelfen.

Habe ich oft geometrien aus verschiedenen GK-Streifen, dann baue ich das Geometry-Feld als WGS84 und speichere die Orginal-Koordinaten in normalem Spalten. Falls das alles eindeutig ist, dann nehme ich meist nur ein Geometrie-Feld und erzeuge mir die jeweilgen Kordinaten bei Bedarf mit ST_X|Y|Z.
–> Du meinst damit das du nicht den Typ gemoetrie nimmst sondern dich einfachen Datentypen bedienst und erst bei Bedarf daraus einen geometrischeb Datebtyp erstellst?

Du sollest da Geometrie-Feld übrigens mit addgeometycolumn(…) anlegen und nicht einfach im Create Table Statement
–> ich weiß nicht genau wie du das meinst? Soll ich den Datentyp mit den add Befehl der Tabelle hinzufügen?

So durchstöbere noch die Doku. vielen dank schon mal.

hab mich mal weiter durch die Doku gefuchst und das mit den addColum geändert. Jetzt stehe ich nur noch vor dem Problem wie ich die Daten mithilfe einer Prozedure in die Tabelle bekomme (s.Oben).

CREATE TABLE knotenV2
(
kn_id integer NOT NULL,
stoff_id serial NOT NULL,
ktyp_id serial NOT NULL,
pos_z integer NOT NULL,
–pos_xy geometry,
CONSTRAINT “pkey(knotenV2)” PRIMARY KEY (kn_id, stoff_id),
CONSTRAINT “fkey(knotenV2)_ktyp_id” FOREIGN KEY (ktyp_id)
REFERENCES knoten_typ (ktyp_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT “fkey(knotenV2)_stoff_id” FOREIGN KEY (stoff_id)
REFERENCES stoff_typ (stoff_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
SELECT AddGeometryColumn( ‘knotenv2’, ‘pos_xy’, -1, ‘GEOMETRY’, 0 );


in der Doku steht das man mithilfe von
INSERT INTO roads (road_id, roads_geom, road_name)VALUES (3,GeomFromText(’LINESTRING(192783 228138,192612 229814)’,-1),’Paul St&#8217 :wink: ;
Daten in die Datenbank bekommt. Bei mir soll es allerdings so aussehen:
INSERT INTO roads (road_id, roads_geom, road_name)VALUES (3,GeomFromText(’POINT(x y)’,-1),’Paul St&#8217 :wink: ;
Bei den Variablen x und y soll es sich um Integer Werte handeln.
Jetzt habe ich mir die Methode mal etwas näher angesehen und sie erwartet einen char und Integer Wert. Alldings möchte ich 2 Koordinaten einfügen, gibt es eine Methode mit der ich dieses realisieren kann?
“CREATE OR REPLACE FUNCTION geometryfromtext(text, integer)”