У меня есть линейный шейп-файл, представляющий дорожную сеть. Я хочу растеризовать эти данные, в результате чего полученные значения в растре показывают общую длину линий, которые попадают в растровую ячейку.
Данные представлены в проекции Британской национальной сети, поэтому единицы измерения будут метрами.
В идеале я хотел бы выполнить эту операцию с использованием R
, и я предполагаю, что rasterize
функция из raster
пакета сыграет свою роль в достижении этого, я просто не могу понять, какой должна быть примененная функция.
raster
r
line
rasterization
JPD
источник
источник
vignette('over', package = 'sp')
может помочь.Ответы:
После недавнего вопроса вы можете использовать функции, предлагаемые пакетом rgeos , для решения вашей проблемы. В целях воспроизводимости я загрузил шейп-файл танзанийских дорог из DIVA-GIS и поместил его в свой текущий рабочий каталог. Для предстоящих задач вам понадобятся три пакета:
Следовательно, ваши первые строки могли бы выглядеть так:
После этого вам необходимо импортировать данные шейп-файла. Обратите внимание, что шейп-файлы DIVA-GIS распространяются в EPSG: 4326, поэтому я спроецирую шейп-файл на EPSG: 21037 (UTM 37S), чтобы иметь дело с метрами, а не градусами.
Для последующей растеризации вам понадобится растровый шаблон, который охватывает пространственный экстент вашего шейп-файла. Растровый шаблон состоит из 10 строк и 10 столбцов по умолчанию, что позволяет избежать слишком большого времени вычислений.
Теперь, когда шаблон настроен, пройдитесь по всем ячейкам растра (который в настоящее время состоит только из значений NA). Присваивая значение '1' текущей ячейке и затем выполняя
rasterToPolygons
, результирующий шейп-файл 'tmp_shp' автоматически сохраняет экстент обработанного в данный момент пикселя.gIntersects
определяет, перекрывает ли этот экстент дороги. Если нет, функция вернет значение «0». В противном случае шейп-файл дороги обрезается текущей ячейкой, а общая длина «Пространственные линии» в этой ячейке рассчитывается с использованиемgLength
.Наконец, вы можете вставить рассчитанные длины (которые пересчитаны в километры) в шаблон растра и визуально проверить свои результаты.
источник
sapply()
наpbsapply()
и использовал аргумент кластераcl = detectCores()-1
. Теперь я могу запустить этот пример параллельно!Ниже приведено изменение решения Джеффри Эванса. Это решение намного быстрее, так как не использует растеризацию
источник
raster::intersect()
, мне нравится, что он сочетает в себе атрибуты пересекающихся объектов, в отличие отrgeos::gIntersection()
.Вам не нужен цикл for. Просто пересекайте все сразу, а затем добавьте длины линий к новым отрезкам, используя функцию SpatialLinesLengths в sp. Затем, используя функцию растрирования пакета растра с аргументом fun = sum, вы можете создать растр с суммой длины (ий) линии, пересекающей каждую ячейку. Используя приведенный выше ответ и связанные с ним данные, мы получим код, который даст те же результаты.
источник
SpatialLinesLengths
. Думаю, учиться никогда не поздно, спасибо (rasterize
хотя : занимает довольно много времени (хотя в 7 раз дольше, чем верхний подход на моей машине).rasterize()
функция включает в себя все строки, которые касаются данной ячейки. Это приводит к тому, что в некоторых случаях длины сегментов линии учитываются дважды: один раз в ячейке, к которой они должны, и один раз в соседней ячейке, к которой конечная точка линии просто касается.Вот еще один подход. Он отличается от тех, которые уже были предоставлены при использовании
spatstat
пакета. Насколько я могу судить, этот пакет имеет свою собственную версию пространственных объектов (например,im
противraster
объектов), ноmaptools
пакет позволяет конвертировать туда и обратно междуspatstat
объектами и стандартными пространственными объектами.Этот подход взят из этого поста R-sig-Geo .
Самый медленный бит - это преобразование дорог
SpatialLines
в шаблон сегмента линии (т.е.spatstat::psp
). Как только это будет сделано, вычисление фактической длины будет довольно быстрым, даже для гораздо более высоких разрешений. Например, на моем старом MacBook 2009 года:источник
Позвольте мне представить вам пакет вены с несколькими функциями для работы пространственных линий и импорта НФ и data.table
источник
Это может показаться немного наивным, но если это система дорог, выберите дороги и сохраните их в буфер обмена, а затем найдите инструмент, который позволяет добавить буфер в буфер обмена, установив его равной ширине дороги, то есть 3 метра. +/- помните, что буфер находится от центральной линии до края * 2 i для каждой стороны, поэтому 3-метровый буфер - это фактически 6-метровая дорога из стороны в сторону.
источник