Esiste un'opzione python per "unire gli attributi per posizione"?


9

Sto provando a svolgere la funzione join attributes by locationcome trovata nel menu QGIS Vettore> Strumenti di gestione dei dati. Sto cercando un'opzione Python open source per questo. So che arcpy ha una spatial joinfunzione ma sto provando a farlo al di fuori dell'ambiente ESRI.


1
Vorrei suggerire di guardare il codice sorgente del Join attributes by locationcomando effettivo dal fToolsplugin:, in doSpatialJoin.pyparticolare il compute()metodo. Non dovrebbe essere troppo difficile eliminare qualsiasi codice UI da quello e rimuoverlo in una semplice funzione Python.
Lukas Graf,

Ciao, ho un problema un po 'diverso, voglio verificare se esiste un giunto tra due livelli! Sto cercando un'opzione di pitone open source per questo. Voglio verificare se è stata utilizzata la funzione s.join e sto cercando di eseguire questa operazione al di fuori dell'ambiente ESRI .. Qualcuno può aiutarmi per favore!
Rania ben othmen,

Risposte:


8

Potresti dare un'occhiata a Shapely e Fiona . Fiona è un wrapper per gdal per semplificare l'importazione e l'esportazione di file spaziali. Shapely fornisce funzionalità di geometria. Ecco un esempio molto semplice per darti l'idea. Unisce gli attributi del poligono a tutti i punti all'interno di quel poligono.

I dati di esempio che ho usato sono questi poligoni e questi punti .

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']
                        })

Grazie @cengel. Sembra che mi metterà sulla buona strada! In realtà sono interessato all'unione con linee e poligoni (in particolare trovando dove i fiumi si intersecano con le celle del modello) e penso che funzionerà seguendo il tuo esempio.
mishaF,

@cengel Le stazioni qgis che utilizzano plugin che utilizzano questi metodi richiedono l'installazione di moduli e gdal?
user25976

@utente25976 scusa, non sono sicuro di aver capito bene la tua domanda. Il mio esempio di codice è uno script Python autonomo. Sia Fiona che Shapely richiedono gdal.
Cengel,

@cengel Mi scusi, vorrei chiarire (sono nuovo nella programmazione). Per quanto riguarda gli script Python autonomi: vuoi dire che un plug-in scritto con Fiona e importazioni formose può essere utilizzato dagli utenti di QGIS anche se non hanno Python o i moduli installati sul loro computer?
user25976

@ user25976 Hanno bisogno dei moduli installati sul loro computer. Vedi ad esempio qui
cengel

2

Anche se è ancora un po 'agitato attorno ai bordi, specialmente quando si tratta di documentazione ed esempi, ma il futuro di Geopandas sembra brillante. Fondamentalmente combina la potenza dei frame di dati Panda con le capacità geospaziali di formosa.

la funzione che cerchi si chiama sjoin

Assicurarsi che la macchina / istanza disponga di memoria sufficiente per eseguire l'operazione

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')

Questo pezzo di codice esegue l'unione spaziale ma gli attributi del file di forma unito sono vuoti. Qualche puntatore?
Aprile
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.