Есть ли опция Python для «объединения атрибутов по местоположению»?

9

Я пытаюсь выполнить функцию, join attributes by locationуказанную в меню QGIS Вектор> Инструменты управления данными. Я ищу открытый вариант Python для этого. Я знаю, что у arcpy есть spatial joinфункция, но я пытаюсь выполнить это вне среды ESRI.

mishaF
источник
1
Я бы посоветовал взглянуть на исходный код фактической Join attributes by locationкоманды из fToolsплагина: doSpatialJoin.pyособенно compute()метод. Не должно быть слишком сложно исключить любой код пользовательского интерфейса из этого и сократить его до простой функции Python.
Лукас Граф
Привет, у меня немного другая проблема, я хочу проверить, есть ли соединение между двумя слоями! Я ищу для этого открытый вариант Python. Я хочу проверить, использовалась ли функция s.join, и я пытаюсь выполнить это вне среды ESRI. Кто-нибудь может мне помочь, пожалуйста!
Рания Бен Отмен

Ответы:

8

Вы можете взглянуть на Шейпли и Фиону . Fiona - это оболочка для gdal, упрощающая импорт и экспорт пространственных файлов. Shapely обеспечивает функциональность геометрии. Вот очень простой пример, чтобы дать вам идею. Он соединяет атрибуты многоугольника со всеми точками в этом многоугольнике.

Примерные данные, которые я использовал, - это эти многоугольники и эти точки .

import fiona
from shapely.geometry import shape
from copy import deepcopy

with fiona.open("planning_neighborhoods.shp", "r") as n: 

    with fiona.open("Schools_Private_Pt.shp", "r") as s:

        # create a schema for the attributes
        outSchema =  deepcopy(s.schema)
        outSchema['properties'].update(n.schema['properties'])

        with fiona.open ("Schools_withNbhd.shp", "w", s.driver, outSchema, s.crs) as output:

            for school in s: 
                for neighborhood in n:
                    # check if point is in polygon and set attribute
                    if shape(school['geometry']).within(shape(neighborhood['geometry'])):  
                        school['properties']['neighborho'] = neighborhood['properties']['neighborho'] 
                    # write out
                        output.write({                                 
                            'properties': school['properties'], 
                            'geometry': school['geometry']
                        })
cengel
источник
Спасибо @cengel. Похоже, это поставит меня на правильный путь! Я на самом деле заинтересован в соединении с линиями и полигонами (особенно в том, чтобы найти, где реки пересекают ячейки модели), и я думаю, что это сработает, следуя вашему примеру.
mishaF
@cengel Требуется ли для модулей qgis, использующих плагины, использующие эти методы, установка модулей и gdal?
user25976
@ user25976 извините, не уверен, что я вполне понимаю ваш вопрос. Мой пример кода представляет собой автономный скрипт на Python. И Фиона и стройный требуют ГДАЛ.
Cengel
@cengel Извините, позвольте мне уточнить (я новичок в программировании). Относительно автономных скриптов на Python: вы имеете в виду, что плагин, написанный с использованием fiona и фигурного импорта, может использоваться пользователями QGIS, даже если у них нет python или модулей, установленных на их компьютере?
user25976
@ user25976 Им нужны модули, установленные на их компьютере. Смотрите, например, здесь
Cengel
2

Хотя все еще немного грубо по краям, особенно когда речь заходит о документации и примерах, но будущее геопанды выглядит блестящим. Он в основном объединяет мощь панелей данных панда с геопространственными возможностями.

функция, которую вы ищете, называется sjoin

Убедитесь, что ваш компьютер / экземпляр имеет достаточно памяти для выполнения операции

import geopandas as gpd
import pandas as pd
import os

gdfLeft = gpd.read_file(os.path.join(PATH,INPUT_FILE_NAME_1))
gdfRight = gpd.read_file(os.path.join(PATH,INPUT_FILE_NAME_2))

gdfJoined = gpd.sjoin(gdfLeft, gdfRight, how="left", op='intersects')
RutgerH
источник
Этот фрагмент кода выполняет пространственное соединение, но атрибуты объединенного шейп-файла пусты. Есть указатели?
Апрель