J'essaie de faire une jointure spatiale un peu comme l'exemple ici: Existe - t-il une option python pour "joindre les attributs par emplacement"? . Cependant, cette approche semble vraiment inefficace / lente. Même le faire avec un modeste 250 points prend presque 2 minutes et il échoue entièrement sur les fichiers de formes avec> 1000 points. Est-ce qu'il y a une meilleure approche? Je voudrais le faire entièrement en Python sans utiliser ArcGIS, QGIS, etc.
Je serais également intéressé de savoir s'il est possible de sommer les attributs (c'est-à-dire la population) de tous les points qui se trouvent dans un polygone et de joindre cette quantité au fichier de formes du polygone.
Voici le code que j'essaie de convertir. Je reçois une erreur sur la ligne 9:
poly['properties']['score'] += point['properties']['score']
qui dit:
TypeError: type (s) d'opérande non pris en charge pour + =: 'NoneType' et 'float'.
Si je remplace le "+ =" par "=" cela fonctionne bien mais cela ne résume pas les champs. J'ai également essayé de les faire sous forme d'entiers, mais cela échoue également.
with fiona.open(poly_shp, 'r') as n:
with fiona.open(point_shp,'r') as s:
outSchema = {'geometry': 'Polygon','properties':{'region':'str','score':'float'}}
with fiona.open (out_shp, 'w', 'ESRI Shapefile', outSchema, crs) as output:
for point in s:
for poly in n:
if shape(point['geometry']).within(shape(poly['geometry'])):
poly['properties']['score']) += point['properties']['score'])
output.write({
'properties':{
'region':poly['properties']['NAME'],
'score':poly['properties']['score']},
'geometry':poly['geometry']})
la source
Réponses:
Fiona renvoie des dictionnaires Python et vous ne pouvez pas les utiliser
poly['properties']['score']) += point['properties']['score'])
avec un dictionnaire.Exemple de sommation d'attributs à l'aide des références données par Mike T:
Maintenant, nous pouvons utiliser deux méthodes, avec ou sans index spatial:
1) sans
2) avec un index R-tree (vous pouvez utiliser pyrtree ou rtree )
Résultat avec les deux solutions:
Quelle est la différence ?
Après:
Pour aller plus loin, consultez Utilisation de l'indexation spatiale Rtree avec OGR, Shapely, Fiona
la source
De plus - les géopandas incluent désormais en option
rtree
comme dépendance, voir le dépôt githubAinsi, au lieu de suivre tout le code (très agréable) ci-dessus, vous pouvez simplement faire quelque chose comme:
Pour obtenir cette fonctionnalité élégante, assurez-vous d'installer la bibliothèque C libspatialindex premier
EDIT: importations de paquets corrigées
la source
rtree
c'était facultatif. Cela ne signifie-t-il pas que vous devez installerrtree
ainsi que lalibspatialindex
bibliothèque C?rtree
lors de ma première installationlibspatialindex
... ils ont fait une version assez importante depuis, donc je suis sûr que les choses ont un peu changéUtilisation Rtree comme index pour effectuer les jointures beaucoup plus rapides, puis Shapely pour effectuer les prédicats spatiaux afin de déterminer si un point se trouve réellement dans un polygone. Si cela est fait correctement, cela peut être plus rapide que la plupart des autres SIG.
Voir des exemples ici ou ici .
La deuxième partie de votre question concernant 'SUM', utilisez un
dict
objet pour accumuler des populations en utilisant un identifiant de polygone comme clé. Cependant, ce type de chose se fait beaucoup mieux avec PostGIS.la source
Cette page Web montre comment utiliser une recherche ponctuelle dans un cadre de sélection avant la requête spatiale Within plus coûteuse de Shapely.
http://rexdouglass.com/fast-spatial-joins-in-python-with-a-spatial-index/
la source