Existe uma opção python para "juntar atributos por local"?

9

Estou tentando executar a função join attributes by locationconforme encontrado no menu QGIS Vector> Data Management Tools. Estou procurando uma opção python de código aberto para isso. Eu sei que o arcpy tem uma spatial joinfunção, mas estou tentando executar isso fora do ambiente ESRI.

mishaF
fonte
11
Eu sugeriria olhar o código fonte do Join attributes by locationcomando real do fToolsplugin:, doSpatialJoin.pyparticularmente o compute()método. Não deve ser muito difícil eliminar qualquer código de interface do usuário e reduzi-lo a uma função python simples.
Lukas Graf
Oi eu tenho um problema um pouco diferente, eu quero verificar se há uma articulação entre duas camadas! Estou procurando uma opção de código-fonte aberto python para isso. Quero testar se a função s.join foi usada e estou tentando fazer isso fora do ambiente da ESRI. Alguém pode me ajudar, por favor!
Rania ben othmen 30/11/19

Respostas:

8

Você pode dar uma olhada em Shapely e Fiona . O Fiona é um invólucro para o gdal para facilitar a importação e exportação de arquivos espaciais. Shapely fornece funcionalidade de geometria. Aqui está um exemplo muito simples para lhe dar a ideia. Ele une atributos de polígono a todos os pontos dentro desse polígono.

Os dados de exemplo que usei são esses polígonos e esses pontos .

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
fonte
Obrigado @cengel. Parece que vai me colocar no caminho certo! Na verdade, estou interessado na junção com linhas e polígonos (especificamente descobrindo onde os rios cruzam as células modelo) e acho que funcionará seguindo o seu exemplo.
mishaF
@cengel As estações qgis usando plugins que empregam esses métodos requerem a instalação de módulos e gdal?
User25976 5/05
@ user25976 Desculpe, não sei se entendi bem sua pergunta. Meu exemplo de código é um script python independente. Tanto a fiona quanto a bem torneada exigem gdal.
Cengel
@ cengel Com licença, deixe-me esclarecer (eu sou novo em programação). Em relação aos scripts python autônomos: você quer dizer que um plug-in escrito com fiona e importações bem torneadas pode ser usado pelos usuários do QGIS, mesmo que eles não possuam python ou os módulos instalados no computador?
User25976
@ user25976 Eles precisam dos módulos instalados no computador. Veja, por exemplo, aqui
cengel
2

Embora ainda seja um pouco difícil, especialmente quando se trata de documentação e exemplos, o futuro das geopandas parece brilhante. Basicamente, combina o poder dos quadros de dados do panda com os recursos geoespaciais de bem torneados.

a função que você procura é chamada de junção

Verifique se a sua máquina / instância tem memória suficiente para executar a operação

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
fonte
Esse trecho de código executa a junção espacial, mas os atributos do shapefile associado estão vazios. Alguma dica?
abril