Existe-t-il une option python pour «joindre les attributs par emplacement»?

9

J'essaie d'exécuter la fonction join attributes by locationtelle que trouvée dans le menu QGIS Vector> Outils de gestion des données. Je cherche une option python open source pour cela. Je sais qu'arcpy a une spatial joinfonction, mais j'essaie de réaliser cela en dehors de l'environnement ESRI.

mésaventure
la source
1
Je suggère de regarder le code source de la Join attributes by locationcommande réelle du fToolsplugin:, en doSpatialJoin.pyparticulier la compute()méthode. Il ne devrait pas être trop difficile d'éliminer tout code d'interface utilisateur de cela et de le réduire à une simple fonction python.
Lukas Graf du
Salut j'ai un problème un peu différent, je veux vérifier s'il y a un joint entre deux couches! Je cherche une option python open source pour cela. Je veux tester si la fonction s.join a été utilisée et j'essaie de le faire en dehors de l'environnement ESRI .. Quelqu'un peut-il m'aider s'il vous plaît!
Rania ben othmen

Réponses:

8

Vous voudrez peut-être jeter un œil à Shapely et Fiona . Fiona est un wrapper pour gdal pour faciliter l'importation et l'exportation de fichiers spatiaux. Shapely fournit des fonctionnalités de géométrie. Voici un exemple très simple pour vous donner l'idée. Il joint les attributs du polygone à tous les points de ce polygone.

Les données d'exemple que j'ai utilisées sont ces polygones et ces points .

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
la source
Merci @cengel. On dirait que cela me mettra sur la bonne voie! Je suis en fait intéressé par la jonction avec des lignes et des polygones (en particulier pour trouver où les rivières croisent les cellules du modèle) et je pense que cela fonctionnera en suivant votre exemple.
mishaF
@cengel Les stations qgis utilisant des plugins utilisant ces méthodes nécessitent-elles l'installation de modules et de gdal?
user25976
@ user25976 Désolé, je ne suis pas sûr de bien comprendre votre question. Mon exemple de code est un script python autonome. Les deux fiona et galbés nécessitent gdal.
cengel
@cengel Excusez-moi, permettez-moi de clarifier (je suis nouveau en programmation). En ce qui concerne les scripts python autonomes: vous voulez dire qu'un plugin écrit avec fiona et des importations galbées peut être utilisé par les utilisateurs de QGIS même s'ils n'ont pas python ou les modules installés sur leur ordinateur?
user25976
@ user25976 Ils ont besoin des modules installés sur leur ordinateur. Voir par exemple ici
cengel
2

Bien que toujours un peu rude sur les bords, surtout en ce qui concerne la documentation et les exemples, mais l'avenir des géopandas s'annonce brillant. Il combine essentiellement la puissance des trames de données pandas avec des capacités géospatiales de galbe.

la fonction que vous recherchez s'appelle sjoin

Assurez-vous que votre machine / instance dispose de suffisamment de mémoire pour effectuer l'opération

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
la source
Ce morceau de code effectue la jointure spatiale mais les attributs du fichier de formes joint sont vides. Des pointeurs?
avril