Gibt es eine Python-Option zum "Verbinden von Attributen nach Speicherort"?

9

Ich versuche, die Funktion auszuführen, die join attributes by locationim QGIS-Menü Vektor> Datenverwaltungstools zu finden ist. Ich suche eine Open Source Python Option dafür. Ich weiß, dass arcpy eine spatial joinFunktion hat, aber ich versuche dies außerhalb der ESRI-Umgebung durchzuführen.

MischaF
quelle
1
Ich würde vorschlagen, den Quellcode des eigentlichen Join attributes by locationBefehls aus dem fToolsPlugin zu betrachten: doSpatialJoin.pyinsbesondere die compute()Methode. Es sollte nicht zu schwierig sein, UI-Code daraus zu entfernen und ihn auf eine einfache Python-Funktion zu reduzieren.
Lukas Graf
Hallo, ich habe ein etwas anderes Problem. Ich möchte überprüfen, ob es eine Verbindung zwischen zwei Schichten gibt. Ich suche eine Open-Source-Python-Option dafür. Ich möchte testen, ob die Funktion s.join verwendet wurde, und ich versuche, dies außerhalb der ESRI-Umgebung durchzuführen. Kann mir bitte jemand helfen?
Rania ben othmen

Antworten:

8

Vielleicht möchten Sie einen Blick auf Shapely und Fiona werfen . Fiona ist ein Wrapper für gdal, der den Import und Export von räumlichen Dateien vereinfacht. Bietet formell Geometriefunktionen. Hier ist ein sehr einfaches Beispiel, um Ihnen die Idee zu geben. Es verknüpft Polygonattribute mit allen Punkten innerhalb dieses Polygons.

Die Beispieldaten, die ich verwendet habe, sind diese Polygone und diese Punkte .

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
quelle
Danke @cengel. Das sieht so aus, als würde es mich auf den richtigen Weg bringen! Ich bin tatsächlich an der Verknüpfung mit Linien und Polygonen interessiert (insbesondere daran, wo Flüsse Modellzellen schneiden), und ich denke, dass dies nach Ihrem Beispiel funktionieren wird.
MischaF
@cengel Müssen QGIS-Stationen, die Plugins mit diesen Methoden verwenden, die Installation von Modulen und GDAL erfordern?
user25976
@ user25976 Entschuldigung, ich bin mir nicht sicher, ob ich Ihre Frage richtig verstehe. Mein Codebeispiel ist ein eigenständiges Python-Skript. Sowohl Fiona als auch Shaply benötigen GDAL.
Cengel
@cengel Entschuldigung, lassen Sie mich klarstellen (ich bin neu in der Programmierung). In Bezug auf eigenständige Python-Skripte: Sie meinen, dass ein mit fiona und formschönen Importen geschriebenes Plugin von QGIS-Benutzern verwendet werden kann, auch wenn sie kein Python oder keine Module auf ihrem Computer installiert haben?
user25976
@ user25976 Sie benötigen die Module auf ihrem Computer installiert. Siehe zum Beispiel hier
cengel
2

Obwohl immer noch etwas rau an den Rändern, besonders wenn es um Dokumentation und Beispiele geht, sieht die Zukunft von Geopandas vielversprechend aus. Es kombiniert im Wesentlichen die Leistung von Pandas-Datenrahmen mit den räumlichen Fähigkeiten von Shapely.

Die gesuchte Funktion heißt sjoin

Stellen Sie sicher, dass Ihr Computer / Ihre Instanz über genügend Speicher verfügt, um den Vorgang auszuführen

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
quelle
Dieser Code führt die räumliche Verknüpfung aus, aber die Attribute des verknüpften Shapefiles sind leer. Irgendwelche Hinweise?
April