Tworzenie tabel przestrzennych za pomocą PostGIS

20

W dokumentacji PostGIS jest napisane, że istnieją dwa kroki do utworzenia tabeli przestrzennej za pomocą SQL:

  1. Utwórz normalną tabelę nieprzestrzenną.
  2. Dodaj kolumnę przestrzenną do tabeli za pomocą funkcji „AddGeometryColumn” OpenGIS.

Gdybym podążał za przykładami, stworzyłbym tabelę o terrain_pointstakiej nazwie :

CREATE TABLE terrain_points ( 
  ogc_fid serial NOT NULL, 
  elevation double precision,
);

SELECT AddGeometryColumn('terrain_points', 'wkb_geometry', 3725, 'POINT', 3 );

Alternatywnie, jeśli spojrzę na istniejące tabele w pgAdmin III , wygląda na to, że mógłbym stworzyć taką samą tabelę:

CREATE TABLE terrain_points
(
  ogc_fid serial NOT NULL,
  wkb_geometry geometry,
  elevation double precision,
  CONSTRAINT terrain_points_pk PRIMARY KEY (ogc_fid),
  CONSTRAINT enforce_dims_wkb_geometry CHECK (st_ndims(wkb_geometry) = 3),
  CONSTRAINT enforce_geotype_wkb_geometry CHECK (geometrytype(wkb_geometry) = 'POINT'::text OR wkb_geometry IS NULL),
  CONSTRAINT enforce_srid_wkb_geometry CHECK (st_srid(wkb_geometry) = 3725)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE terrain_points OWNER TO postgres;

-- Index: terrain_points_geom_idx

-- DROP INDEX terrain_points_geom_idx;

CREATE INDEX terrain_points_geom_idx
  ON terrain_points
  USING gist
  (wkb_geometry);

Czy te dwie metody dają ten sam wynik? Czy wersja oparta na pgAdmin III jest po prostu bardziej gadatliwa i robi rzeczy, AddGeometryColumnktóre domyślnie by działały?

BenjaminGolder
źródło
Mam nadzieję, że nie przechwytujesz każdego piksela rastra i nie
zapisujesz
nie, wcale nie :) Ale zamierzam użyć ST_DumpPoints na niektórych liniach konturów, aby wypełnić tę tabelę.
BenjaminGolder,

Odpowiedzi:

9

Nie, nie dają takich samych wyników.

Drugą metodą nadal musisz dodać rekord do tabeli GEOMETRY_COLUMNS i musisz to zrobić za pomocą instrukcji INSERT lub za pomocą funkcji Populate_Geometry_Columns, jak sugerowano w drugiej odpowiedzi.

AddGeometryColumn zajmie się tym za Ciebie (wraz z tworzeniem indeksu i ograniczeń).

capooti
źródło
2
W przyszłości nie jest to już prawdą: postgis.net/docs/AddGeometryColumn.html
Janosimas
7

Dwie metody powinny dawać takie same wyniki. AddGeometryColumnnie tylko utworzy pole geometrii, ale także zweryfikuje i utworzy niezbędne indeksy. Tak długo, jak robisz to wszystko ręcznie, rezultat będzie taki sam. Jeśli masz istniejącą kolumnę geometrii, możesz użyć Populate_Geometry_Columnsfunkcji do sprawdzenia jej poprawności i utworzenia niezbędnych indeksów.

Senthil
źródło
Czy to oznacza, że ​​dwie metody dadzą ten sam wynik?
BenjaminGolder,
Zrobi to samo, jeśli użyłeś istniejących geometrii_kolumn, sprawdź poprawność i poprawnie utworzysz indeksy. Możesz sprawdzić elsasoft.org/samples/postgre_postgis/…
Senthil
przepraszam @Senthil, nie do końca rozumiem twoje zdanie. Co masz na myśli, mówiąc: „jeśli użyłeś istniejących geometrii_kolumn, sprawdź poprawność i poprawnie utworzysz indeksy”? Czy to polecenie, którego brakuje w przykładach?
BenjaminGolder,
@BenjaminGolder Zobacz, co AddGeometryColumn robi z tym linkiem: elsasoft.org/samples/postgre_postgis/... W twoim przypadku, o ile wkb_geometry jest już w tabeli geometry_columns i ręcznie tworzysz indeks. Wygląda dobrze. ale najłatwiejszą opcją jest użycie AddGeometryColumn dla nowych pól.
Senthil
Zredagowałem twoją odpowiedź, aby była jaśniejsza. Dziękuję Ci.
BenjaminGolder
5

W PostGIS 2.0+ możesz bezpośrednio utworzyć kolumnę geometrii, używając wspólnego języka definicji danych.

Na przykład:

-- points in geographic wgs84 coordinates (epsg:4326)
create table mypoints (id serial, name varchar, geom geometry(Point, 4326));

-- lines in spherical mercator (epsg:3857)
create table mylines (id serial, name varchar, geom geometry(LineString, 3857));

-- polygons in Dutch national coordinate system (epsg:28992)
create table mypolygons (id serial, name varchar, geom geometry(Polygon, 28992));

-- multipolygons in British National Grid (epsg:27700)
create table 
  mymultipolygons(id serial, name varchar, geom geometry(Multipolygon, 27700));

-- generic geometry (no data type constraints)
create table mygeometries(id serial, name varchar, geom geometry);
anneb
źródło