Rgeos скидає пов'язані значення при перетині полігонів


11

Я намагаюся перехрестити два SpatialPolygonsDataFrames і отримати результат SpatialPolygonsDataFrame. На жаль, використовуючи gIntersectionфункцію з rgeos(яка вражаюче швидко працює для перетину полігонів), я не можу отримати пов'язані рамки даних. Розглянемо наступний приклад:

> fracPoly <- gIntersection( toSingle, fromSingle )
> class(toSingle)
[1] "SpatialPolygonsDataFrame"
> class(fromSingle)
[1] "SpatialPolygonsDataFrame"
> class(fracPoly)
[1] "SpatialPolygons"

Я можу написати функцію обгортки, яка керує передачею data.frames, але це буде незначним болем, щоб все перевірити правильно, і до цього я сподівався, що хтось може або підтвердити, що немає кращого способу, або вказати мені на іншу функцію (або варіант для gIntersection), що дозволило б мені зберегти пов'язане data.frames.

Оновлення

При подальшому роздумі це може бути дуже навмисною поведінкою gIntersection. Зрештою, про два SPDF, чиї data.frame ви передаєте разом? Тому мені, можливо, доведеться написати обгортку, яка об'єднує два.


1
Як ви завантажуєте ваші півджіони - readShape * чи readOGR? Я отримую дивну поведінку з gIntersection залежно від того, яку бібліотеку я використовував для завантаження SPDF, яку я не дістав донизу.
Simbamangu

@Simbamangu Цікаво. Я використовую readShapePoly, а потім об'єднуються у кадр даних ....
Арі Б. Фрідман

gIntersection ПОТРІБНО надати дані.frames об'єднані для областей, що перекриваються - якщо я запускаю вектор | Geoprocessing | Intersect в QGIS, вихід - це набір об'єднаних атрибутів для перекриття, і не QGIS використовувати ту саму бібліотеку GEOS для просторових операцій, як це?
Сімбамангу

Добре, якщо так, то я наткнувся. Я вже переписав свій код, щоб об’єднати data.frames вручну і з’єднати їх назад, тому зараз я не збираюся більше витрачати на це. Але натяк на те, що читання функції у файлі форм має значення.
Арі Б. Фрідман

1
Це однозначно не є відповіддю, але мені не вистачає балів, щоб залишити коментар ... Арі, мені було цікаво, чи поділишся ти своїм кодом, щоб витягти змінні, наступні за функціями накладання rgeos. У мене виникають труднощі з обгортанням голови, щоб вдало зберегти оригінальний ідентифікатор полігону від різних операцій rgeos, таких як gUnion ...
jed.a.long

Відповіді:


2

Для якогось проекту у мене була така ж потреба. Набагато більше, ніж зберігати data.frame, нам довелося ввести подальший код для управління типом вихідної геометрії та приступити до деякого очищення (наприклад, чистих колекцій геометрії), щоб мати повний геопроцес перетину. Якщо вам все-таки потрібно виконати таке завдання в R, ви можете спробувати пакет RFigisGeo :

#install RFigisGeo
require(devtools) 
install_github("RFigisGeo", "openfigis")
require(RFigisGeo)

#compute intersection
result <- getIntersection(features1, features2)

І відповіді ваших, і @ berndv виглядають так, як вони вирішили б мою проблему. Дякую! Позначення цього з моменту його появи.
Арі Б. Фрідман

10

Поведінка gIntersection не має передавати будь-які пересічені дані за проектом:

Оскільки між пересіченими просторовими об’єктами немає загальних збігів, будь-які довільні операції над атрибутами вимагають припущень про невідомі наміри користувача. Ось чому жодні слоти даних не повинні проходити через ...

... Дизайн gIntesection () є задуманим, оскільки тільки користувач може знати, що робити з атрибутами сутностей, які змінили їх геометрію. Різні користувачі можуть робити різні припущення, але загального рішення, крім проходження ідентифікаторів пересічних геометрій, немає, як це робиться в механізмі row.names ().

На мій подив, растровий пакет має функцію перетину , яка просто перетинає і передає дані.

Растровий пакет має кілька функцій, які розширюють rgeos, намагаючись також обробляти дані атрибутів. У цьому випадку дивіться raster :: intersect І список функцій тут:? "Raster-package" (розділ XIV)

Повна інформація, яку я отримав про це: http://r-sig-geo.2731867.n2.nabble.com/Intended-usage-of-gIntersection-td7587120.html


0

Для тих (як я), для яких вищевказані відповіді не працювали, посилання тут пояснює, що ви можете зробити цю точну річ за допомогою перетину растру.

Як зберегти всі дані атрибутів під час відсікання двох многокутників у R?

Я використовував це для обрізання SpatialPointsDataFrame з форм-файлом SpatialPolygons; він створює обрізану / відрізану версію SpatialPointsDataFrame, зберігаючи вихідні дані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.