Wstawianie punktu do PostGIS?

49

Utworzyłem jedną tabelę w mojej nakrętce PostGIS, której nie mogę wstawić.

Co jest nie tak z moim zapytaniem?

CREATE TABLE app ( 
  p_id INTEGER PRIMARY KEY

);

SELECT AddGeometryColumn('app','the_geom','4326','POINT',2);

INSERT INTO app(p_id, the_geom) VALUES(2, POINT(-71.060316, 48.432044));

Po ostatnim zapytaniu pokazuje błąd.

ERROR:  column "the_geom" is of type geometry but expression is of type point
LINE 1: ...SERT INTO app(p_id, the_geom) VALUES(2, POINT(-71....
                                                             ^
HINT:  You will need to rewrite or cast the expression.


********** Error **********

ERROR: column "the_geom" is of type geometry but expression is of type point
SQL state: 42804
Hint: You will need to rewrite or cast the expression.
Character: 53

Już sprawdzam swoją wersję PostGIS.

SELECT PostGIS_full_version();

Mam następujący wynik ..

"POSTGIS="1.5.3" GEOS="3.3.1-CAPI-1.7.1" PROJ="Rel. 4.7.1, 23 September 2009" LIBXML="2.7.3" USE_STATS"
Shahjalal
źródło

Odpowiedzi:

84

Mylisz SQL i WKT (dobrze znany tekst ). WKT jest podobnym językiem geometrii do opisywania kształtów, ale nie jest SQL, który jest językiem do zapytań i manipulacji bazami danych. Podczas pracy z WKT w zapytaniu SQL musi to być tekst , a nie mieszany z SQL.

Twoje zapytanie działa, jeśli poprawnie sformatujesz WKT (usuniesz „,”) i ustawisz SRID. W przypadku tej metody ST_GeomFromText(wkt, srid)działa dobrze:

INSERT INTO app(p_id, the_geom)
VALUES(2, ST_GeomFromText('POINT(-71.060316 48.432044)', 4326));

Jeśli masz kolumny o numerycznej długości / szerokości geograficznej, możesz bezpośrednio utworzyć geometrię PUNKTU:

ST_SetSRID(ST_MakePoint(long, lat), 4326);

Sprawdź inne konstruktory geometrii w instrukcji .


Na żądanie @ vik86 the_geommożna zaktualizować w tabeli appz kolumn numerycznych longi latużywając:

UPDATE app SET
  the_geom = ST_SetSRID(ST_MakePoint(long, lat), 4326);
Mike T.
źródło
Czy mógłbyś rozwinąć tę funkcję: „Jeśli masz kolumny z liczbową długością geograficzną, możesz bezpośrednio utworzyć geometrię POINT: ST_SetSRID (ST_MakePoint (długi, lat), 4326);” Obecnie mam tabelę z lat i long, aby korzystać z interfejsu PostGIS, potrzebuję go w formacie punktowym. Dlatego chciałem wiedzieć, jak zaktualizować kolumnę punktów za pomocą tej funkcji. Dzięki Vikram
Vik86
@ Vik86 zobacz zaktualizowaną odpowiedź
Mike T
1

Jeśli pracujesz z klientem Java, radzę używać typów binarnych do przesyłania danych. Z pamięci odnotowałem poprawę wydajności o 10%, kiedy dokonałem tej zmiany w stosunku do metody ST_AsEWKT.

Sarge
źródło