Большой шейп-файл в растр

13

У меня большой шейп-файл (1 ГБ), и мне нужно растеризовать его. Я уже попробовал следующее.

1.) Импортировать его в GRASS, используя v.in.ogrэту ошибку, с сообщением об ошибке: ОШИБКА: G_realloc: невозможно выделить 498240036 байт в break_polygons.c: 188

2.) Моя вторая идея заключалась в использовании PostGIS. Импортируйте шейп-файл, измените его выборку в точке x, y сетки, а затем экспортируйте эти точки и создайте сетку из xyz. Я успешно импортировал шейп-файлы (полигоны и точки), но пересечение 1 миллиона полигонов с 300k точек кажется очень медленным. Я использовал следующий пост PostGIS, возможно, есть место для улучшения.

select polygons.land_id,grid.geom from grid,polygons where grid.geom && polygons.geom and within(grid.geom,polygons.geom)

3.) Я также пытался использовать simplify()в PostGIS. Но я проиграл многим маленьким полигонам (то есть некоторые области, которые были покрыты только маленькими полигонами, стали нулевыми).

Любые идеи очень приветствуются.

Johannes
источник
1
Какую версию GRASS вы использовали? Должно быть как минимум 6.4. Обратите внимание, что в GRASS 7 поддержка больших файлов реализована также для векторных карт, что должно помочь преодолеть указанную проблему (также это намного быстрее).
markusN
В настоящее время я использую GRASS 6.4. Скоро обновлю до 7, спасибо за подсказку.
Йоханнес
Вы можете получить последние предварительно скомпилированные двоичные файлы winGRASS 7 здесь: wingrass.fsv.cvut.cz/grass70
markusN

Ответы:

14

Вы можете попробовать gdal_rasterize , хотя я не использовал его с таким большим шейп-файлом, поэтому у вас могут возникнуть те же проблемы, что и с GRASS. Я считаю, что что-то вроде следующего должно работать (с GDAL> = 1.8.0):

gdal_rasterize -a AN_ATTRIB -l THE_LAYER -a_nodata -9999 -a_srs EPSG:27700 -co TILED=YES -tr 10 10 -ot Float32 src.shp dest.tif

Конечно, вам придется поэкспериментировать с некоторыми из опций в зависимости от вашего исходного шейп-файла. Наиболее важным параметром является -tr, который определяет разрешение пикселя; без него вы можете оказаться с очень большим растром ...

Если вы хотите придерживаться GRASS, попробуйте установить меньший экстент для растеризации и разделите процесс на управляемые куски, а затем объедините растры в один.

MerseyViking
источник
1
Gdal растеризовал все это за 5 минут :). Большое спасибо за это!
Йоханнес
Здорово! Я рад, что это сработало.
MerseyViking
3

Что касается вашего первого намерения, не могли бы вы попробовать запустить команду v.in.ogr на машине с большим объемом оперативной памяти или дискового пространства подкачки?

Если нет, вы можете разбить его на несколько файлов и растеризовать каждый из них, прежде чем объединить их снова.

Симо
источник
1

Если вам нужно больше контроля при выполнении растеризации, посмотрите сценарий perrygeo poly_density.py, который использует GDAL под капотом, но может использоваться для перекрывающихся функций или добавления условных оценок, помимо тех, которые возможны gdal_rasterizeтолько с помощью одного.

SCW
источник
0

Как и Джек Потрошитель, делай это по частям. Из postgis экспортируем кусочки данных, импортируем в траву и конвертируем.

Pablo
источник