2015-04-17 3 views
1

Я использовал ogr2ogr, чтобы сделать большую часть того, что мне нужно с шейп-файлами (включая их растворение). Тем не менее, я нахожу, что для больших, это занимает ДЕЙСТВИТЕЛЬНО долгое время.flatten/dissolve/merge whole shapefile

Вот пример того, что я делаю:

ogr2ogr new.shp old.shp -dialect sqlite -sql "SELECT ST_Union(geometry) FROM old"

В некоторых случаях, один может понадобиться растворить общие соседние формы (это то, что я думаю, что здесь происходит в команде выше) , Однако в моем случае я просто хочу сгладить весь файл и каждую фигуру в нем независимо от значений (я уже выделил нужные мне формы).

  • Есть ли более быстрый способ сделать это, когда вам не нужно заботиться о ценностях и просто хотите форму, которая описывает множество форм в файле?

ответ

0

Если вы изолировали фигуры, и у них нет общих границ, их можно легко собрать в один MULTIPOLYGON, используя ST_Collect. Это должно быть очень быстро и просто сделать:

ogr2ogr gcol.shp old.shp -dialect sqlite -sql "SELECT ST_Collect(geometry) FROM old" 

Если геометрий перекрывают друг друга и границы должны быть «растворяется», то ST_Union должен быть использован. Более быстрые пространственные объединения выполняются с использованием каскадного объединения, described here for PostGIS. Он поддерживается OGR, но, похоже, это не делается элегантно.

Вот двухэтапный SQL-запрос. Сначала сделайте MULTIPOLYGON всего с ST_Collect (это быстро), затем выполните самосоединение, которое должно вызвать вызов UnionCascaded().

ogr2ogr new.shp old.shp -dialect sqlite -sql "SELECT ST_Union(gcol, gcol) FROM (SELECT ST_Collect(geometry) AS gcol FROM old) AS f" 

Или лучше видеть фактический SQL заявление:

SELECT ST_Union(gcol, gcol) 
FROM (
    SELECT ST_Collect(geometry) AS gcol 
    FROM old 
) AS f 
+0

Спасибо, Майк. Это приятное лидерство, но, похоже, все еще навсегда. Возможно, я посмотрю PostGIS. Оставит это открытым немного дольше, а затем принять. Может быть в тупике. – stewart715

+0

@ stewart715 делает ST_Collect (only) принимать навсегда или комбинированный запрос? PostGIS более зрелый, чем SpatiaLite, где ваш исходный запрос (используя только ST_Union) должен работать. –

0

Я имел лучший успех (т.е. быстрее) путем преобразования его в растровые затем обратно в вектор. Например:

# convert the vector file old.shp to a raster file new.tif using a pixel size of XRES/YRES 
gdal_rasterize -tr XRES YRES -burn 255 -ot Byte -co COMPRESS=DEFLATE old.shp new.tif 

# convert the raster file new.tif to a vector file new.shp, using the same raster as a -mask speeds up the processing 
gdal_polygonize.py -f 'ESRI Shapefile' -mask new.tif new.tif new.shp 

# removes the DN attribute created by gdal_polygonize.py 
ogrinfo new.shp -sql "ALTER TABLE new DROP COLUMN DN"