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.
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:
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_geom
0'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_table
ve 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';
GEOMETRYCOLLECTION (MULTIPOLYGON(...))
, birden fazla geometrinin tespiti için sorguyu değiştirmek isteyebilirsiniz. Gibi çek ile ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1
ve kullanım benzer şey USING
: ile ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)
veya benzeri.
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;