Czy istnieje opcja Pythona do „łączenia atrybutów według lokalizacji”?

9

Próbuję wykonać tę funkcję, join attributes by locationktóra znajduje się w menu QGIS Wektor> Narzędzia zarządzania danymi. Szukam do tego opcji python typu open source. Wiem, że arcpy ma spatial joinfunkcję, ale próbuję wykonać to poza środowiskiem ESRI.

mishaF
źródło
1
Sugerowałbym, aby spojrzeć na kod źródłowy rzeczywistego Join attributes by locationpolecenia z fToolswtyczki: doSpatialJoin.pyszczególnie compute()metody. Nie powinno być zbyt trudne wyeliminowanie z tego kodu UI i usunięcie go do zwykłej funkcji python.
Lukas Graf,
Cześć, mam trochę inny problem, chcę sprawdzić, czy istnieje połączenie między dwiema warstwami! Poszukuję w tym celu opcji python typu open source. Chcę sprawdzić, czy użyto funkcji s.join i próbuję wykonać to poza środowiskiem ESRI. Czy ktoś może mi pomóc!
Rania ben othmen

Odpowiedzi:

8

Możesz rzucić okiem na Shapely i Fionę . Fiona to opakowanie dla gdal, aby ułatwić importowanie i eksportowanie plików przestrzennych. Shapely zapewnia funkcjonalność geometrii. Oto bardzo prosty przykład, który daje ci pomysł. Łączy atrybuty wielokąta ze wszystkimi punktami w tym wielokącie.

Przykładowe dane, których użyłem, to te wielokąty i te punkty .

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
źródło
Dzięki @cengel. Wygląda na to, że postawi mnie na dobrej drodze! Tak naprawdę jestem zainteresowany połączeniem z liniami i wielokątami (konkretnie ustaleniem, gdzie rzeki przecinają komórki modelu) i myślę, że to zadziała na twoim przykładzie.
mishaF
@cengel Czy stacje qgis korzystające z wtyczek wykorzystujących te metody wymagają instalacji modułów i gdal?
user25976
@ user25976 przepraszam, nie jestem pewien, czy rozumiem twoje pytanie. Mój przykład kodu to samodzielny skrypt Pythona. Zarówno fiona, jak i zgrabna wymagają gdal.
cengel
@cengel Przepraszam, pozwól mi wyjaśnić (jestem nowy w programowaniu). Jeśli chodzi o samodzielne skrypty pythonowe: masz na myśli, że użytkownicy QGIS mogą używać wtyczki napisanej przy pomocy fiona i foremnego importu, nawet jeśli nie mają zainstalowanego Pythona ani modułów na swoim komputerze?
user25976
@ user25976 Potrzebują modułów zainstalowanych na swoim komputerze. Zobacz na przykład tutaj
cengel
2

Mimo że nadal jest nieco szorstki, szczególnie jeśli chodzi o dokumentację i przykłady, przyszłość geopandas wygląda dobrze. Zasadniczo łączy on moc ramek danych pand z możliwościami kształtowania geoprzestrzennego.

szukana funkcja nazywa się sjoin

Upewnij się, że twój komputer / instancja ma wystarczającą ilość pamięci do wykonania operacji

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
źródło
Ten fragment kodu wykonuje sprzężenie przestrzenne, ale atrybuty połączonego pliku kształtu są puste. Jakieś wskazówki?
kwietnia