PostGIS'te mevcut tablodaki geometri tipini Noktadan Çok Noktaya değiştirme?


31

Mevcut bir tablonun geometri tipini değiştirebilen bir PostGIS fonksiyonu var mı?

POINT'den MULTIPOINT'e değiştirmeliyiz.

Geometri türünü değiştirdiğimizde tablo boştur ve tabloyu sadece bırakıp oluşturamayız.

Yanıtlar:


62

PostGIS 2.x için , bir ifade kullanarak ALTER TABLE DDL kullanabilirsiniz .

Tek bölümden çok bölümlü geometriye dönüştürmek için ST_Multi kullanın :

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);

Çok parçalı bir parçadan tek parçalı bir geometriye dönüştürmek için, sadece bir parçayı kullanabildiğiniz ve diğer tüm parçaları (varsa) görmezden gelebileceğinizden biraz daha zordur. Birden fazla kısmı olan bazı geometrilerin olup olmadığını görmek için önce verilerinizi kontrol edin:

SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
       COUNT(geom) AS total_geom
FROM my_table;

multi_geom0'dan büyük olduğunu görürseniz , veri kaybetme riskini alırsınız ve muhtemelen çok parçalı bir geometri olarak tutmalısınız. 0 görürseniz, aşağıdakilerle tek parça bir geometri oluşturmak güvenlidir:

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);

PostGIS 1.x için , birkaç adım olduğu için biraz daha dağınıktır (thanks @ rec.thegeom!).

Bir tablo my_tableve geometri sütunu varsayarsak geom, işte çok kısma dönüştürmek için gereken adımlar:

-- 1. Remove the geom_type constraint (if existing)
ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_geom;

-- 2. Update the geometry data to multi-part -- skip if it is an empty table
UPDATE my_table SET geom = ST_Multi(geom);

-- 3. Re-add a different geometry constraint for the new type
ALTER TABLE my_table ADD CONSTRAINT enforce_geotype_geom
  CHECK (geometrytype(geom) = 'MULTIPOINT'::text OR geom IS NULL);

-- 4. Update the geometry_columns metadata table
UPDATE geometry_columns SET type = 'MULTIPOINT'
WHERE f_table_schema = 'public' AND f_table_name = 'my_table' AND f_geometry_column = 'geom';

Hi @Mike Toews (ve Ulrik). PostGIS 1.x için ikinci adımınızın bu durumda gerekli olduğunu sanmıyorum Mike. Ulrik, tablonun tür dönüştürme sırasında boş olacağını, bu nedenle aşağıdaki gibi bir hataya neden olacak herhangi bir multi olmayan değer olmayacağını söyledi: 1) ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_the_geom; 2) ALTER TABLE my_table EKLEME EKLE enforce_geotype_the_geom CHECK (geometritype (the_geom) = 'MULTIPOINT' :: metin VEYA the_geom IS NULL); daha sonra 3) UPDATE geometry_columns SET type = 'MULTIPOINT' WHERE f_table_name = 'my_table'; (belki de şimdiye kadarki en zayıf yorum - benim kötü)
rec.thegeom

@ rec.thegeom doğru; boş bir tablo ile güncellenecek bir şey olmazdı. Gerçek komutları gönderdiğiniz için teşekkür ederiz!
Mike T,

Bunun gibi çeşitli formlarda karmaşık verileriniz varsa GEOMETRYCOLLECTION (MULTIPOLYGON(...)), birden fazla geometrinin tespiti için sorguyu değiştirmek isteyebilirsiniz. Gibi çek ile ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1ve kullanım benzer şey USING: ile ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)veya benzeri.
Ravbaker

4

Değişim, sanmıyorum. Ancak, geom sütunu hariç, aynı yapıya sahip yeni bir tablo oluşturabilir, sonra çalıştırılabilir:

SELECT AddGeometryColumn('new-pt_table','geom',<SRID>,'MULTIPOINT',2);

INSERT INTO new_pt_table (attr1, attr2, attr3, ..., geom) 
SELECT attr1, attr2, attr3, ... , ST_Multi(geom) FROM old_pt_table;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.