Я пытаюсь выполнить пространственное соединение, очень похожее на приведенный здесь пример: есть ли опция Python для «объединения атрибутов по местоположению»? , Однако такой подход кажется действительно неэффективным / медленным. Даже выполнение этого со скромными 250 точками занимает почти 2 минуты, и оно полностью не работает на шейп-файлах с> 1000 точками. Есть ли лучший подход? Я хотел бы сделать это полностью в Python без использования ArcGIS, QGIS и т. Д.
Мне также было бы интересно узнать, возможно ли суммировать атрибуты (то есть совокупность) всех точек, которые попадают в полигон, и присоединять это количество к шейп-файлу полигона.
Вот код, который я пытаюсь преобразовать. Я получаю сообщение об ошибке в строке 9:
poly['properties']['score'] += point['properties']['score']
который говорит:
Ошибка типа: неподдерживаемые типы операндов для + =: 'NoneType' и 'float'.
Если я заменю «+ =» на «=», он будет работать нормально, но это не суммирует поля. Я также пытался сделать их как целые числа, но это тоже не получается.
with fiona.open(poly_shp, 'r') as n:
with fiona.open(point_shp,'r') as s:
outSchema = {'geometry': 'Polygon','properties':{'region':'str','score':'float'}}
with fiona.open (out_shp, 'w', 'ESRI Shapefile', outSchema, crs) as output:
for point in s:
for poly in n:
if shape(point['geometry']).within(shape(poly['geometry'])):
poly['properties']['score']) += point['properties']['score'])
output.write({
'properties':{
'region':poly['properties']['NAME'],
'score':poly['properties']['score']},
'geometry':poly['geometry']})
источник
Ответы:
Фиона возвращает словари Python, и вы не можете использовать
poly['properties']['score']) += point['properties']['score'])
со словарем.Пример суммирования атрибутов с использованием ссылок, данных Майком Т:
Теперь мы можем использовать два метода, с или без пространственного индекса:
1) без
2) с индексом R-дерева (вы можете использовать pyrtree или rtree )
Результат с двумя решениями:
В чем разница ?
После:
Чтобы продолжить, посмотрите на Использование пространственной индексации Rtree с OGR, Shapely, Fiona
источник
Кроме того - геопанда теперь необязательно включает
rtree
в качестве зависимости, см. Репозиторий githubТаким образом, вместо того, чтобы следовать всему (очень хорошему) коду выше, вы можете просто сделать что-то вроде
Чтобы получить эту привлекательную функциональность, сначала установите C-библиотеку libspatialindex.
РЕДАКТИРОВАТЬ: исправлен импорт пакетов
источник
rtree
необязательно. Разве это не означает, что вам нужно установитьrtree
так же, какlibspatialindex
C-библиотеку?rtree
когда я только что установилlibspatialindex
... с тех пор они сделали довольно серьезную версию, так что я уверен, что все немного изменилосьИспользуйте Rtree в качестве индекса для выполнения гораздо более быстрых объединений, затем Shapely для выполнения пространственных предикатов, чтобы определить, действительно ли точка находится внутри многоугольника. Если все сделано правильно, это может быть быстрее, чем большинство других ГИС.
Смотрите примеры здесь или здесь .
Вторая часть вашего вопроса о «СУММЕ» - используйте
dict
объект для накопления населения, используя идентификатор многоугольника в качестве ключа. Хотя с PostGIS этот тип вещей гораздо удобнее.источник
На этой веб-странице показано, как использовать поиск точки-полигона в ограничивающей рамке перед более дорогим пространственным запросом в Shapely.
http://rexdouglass.com/fast-spatial-joins-in-python-with-a-spatial-index/
источник