Calcul de toutes les distances d'un point unique à plusieurs polygones [fermé]


9

J'ai deux couches: une couche ponctuelle définissant les propriétés (95 objets) et une couche polygonale définissant les parcelles de terrain associées aux propriétés (211 objets). Chaque point concerne un ou plusieurs polygones. Ce que je voudrais produire, c'est un tableau des distances de chaque point à TOUS les polygones associés à ce point (le bord le plus proche ou le centroïde du polygone - l'un ou l'autre fera l'affaire). Calculer la distance la plus proche est relativement facile dans QGIS et ArcGIS, mais ces calculs omettent tous les polygones distants, au moins par les méthodes que j'ai utilisées. Idéalement, je voudrais une sortie de

Point_ID | distance to polygon 1 | distance to polygon 2 | distance to polygon 3 | etc.

Tous les pointeurs dans ArcGIS 10 ou QGIS 2.2+ seraient les plus utiles.


Cela peut être fait avec une analyse proche dans ArcGIS, mais pour le faire pour chaque point, il faudra un peu d'automatisation. Connaissez-vous les scripts python?
Emil Brundage du

Emil - Non, je ne connais pas Python, mais je devrais peut-être apprendre.
NickN

Réponses:


1

Vous pouvez utiliser la matrice de distance dans QGIS pour y parvenir. Vous devez d'abord convertir vos polygones en points centroïdes soit par vecteur > Outils de géométrie > Centroïdes polygonaux, soit via la version SAGA des centroïdes polygonaux. La raison en est que la fonction Distance Matrix ne peut analyser qu'entre 2 couches de points. De plus, la sortie serait comme ceci:

Point_1 | PolygonCentroid_1 | Distance
Point_1 | PolygonCentroid_2 | Distance
Point_1 | PolygonCentroid_3 | Distance
Point_2 | PolygonCentroid_1 | Distance
Point_2 | PolygonCentroid_2 | Distance

La sortie serait un fichier .csv afin que vous puissiez modifier manuellement la mise en page à l'aide d'un autre logiciel tel que Microsoft Excel.


Merci Joseph - Pour un nouveau venu dans le SIG comme moi, c'est le moyen le plus simple d'obtenir les réponses que je voulais.
NickN

Bienvenu mon pote! Cette procédure (et les résultats) sont basiques mais lorsque vous vous familiarisez avec le logiciel SIG, vous pouvez essayer d'utiliser des procédures plus avancées décrites dans les autres réponses.
Joseph

1
@nickN Juste une note très mineure à cette méthode, les centroïdes ne tombent pas toujours dans un polygone en fonction de sa forme. Il est possible que vous obteniez des distances / classements incorrects, mais cela dépend de vos données et de vos exigences pour savoir si ce serait un problème. Sinon, c'est essentiellement la version QGIS du GNT d'ArcGIS, sauf que ce dernier peut gérer plus de points et je ne sais pas comment QGIS gère les noms / ID dans le résultat.
Chris W

5

C'est assez simple à réaliser en utilisant QGIS (je pense que n'importe quelle version fera l'affaire) et une instruction SQL très simple dans le gestionnaire de bases de données. Mais pour cela, cela doit être dans une sorte de base de données spatiale (Postgis ou spatialite). Puisqu'il est plus accessible à la plupart des gens, je supposerai d'utiliser spatialite, mais les instructions SQL sont les mêmes pour Postgis.

  1. Créez une nouvelle base de données Spatialite;
  2. Importez vos couches de points et de polygones dans la nouvelle base de données;
  3. Ouvrez le plug-in du gestionnaire de base de données, sélectionnez la base de données et exécutez l'une des instructions SQL suivantes:

Distance de tous les points à toutes les limites des polygones

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f, 
  polygons_table AS g

Distance de tous les points aux limites des polygones associés (en supposant qu'il existe un champ commun)

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(g.geom, f.geom) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Distance à tous les points des polygones centroïdes associés :

SELECT 
  f.point_id,
  g.polygon_id,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Notez que vous pouvez ajouter n'importe quel champ de vos calques au résultat:

SELECT 
  f.point_id,
  f.point_number,
  g.polygon_id,
  g.parcel_name,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Ou même tous les domaines:

SELECT 
  f.*,
  g.*,
  st_distance(f.geom, st_centroid(g.geom)) AS distance
FROM
  points_table AS f JOIN 
  polygons_table AS g ON (g.common_field = f.common_field)

Si vous avez besoin de plus d'informations sur la façon de créer la base de données spatialite et d'importer la couche, faites-le moi savoir et je modifierai la réponse.
Alexandre Neto

Salut Alexandre, pourquoi rejoindre et pas un simple OERE?
Luigi Pirelli

Eh bien, c'est quelque chose que j'ai retenu d'une des présentations de Paul Ramsey. Je ne me souviens pas de la raison pour laquelle il préconise l'utilisation explicite de Join, mais s'il le dit ...: -PI essaiera d'exécuter EXPLAIN sur les deux requêtes pour voir s'il y a une différence.
Alexandre Neto

Je suis nouveau sur SpatialLite - cette réponse semble résoudre un problème sur lequel je travaille. Ma table est vide. Je ne comprends peut-être pas cela. J'ai une couche polygonale appelée "Pothole VRI" et une autre couche ponctuelle appelée "Grid Pothole Center". J'ajoute le code suivant en utilisant vos instructions comme ci-dessus: SELECT f.id, g.id, st_distance (f.geom, st_centroid (g.geom)) AS distance FROM 'Grid Pothole Center' AS f, 'Pothole VRI' AS g __ J'obtiens un tableau vide x avec les titres suivants: id, id: 1, distance Qu'ai-je fait de mal ici? Utilisation de QGIS 3.6
Mark Thompson

4

L' outil Générer une table proche dans ArcGIS fera ce que vous voulez, mais il nécessite une licence avancée et le fera pour tous les points / polygones - pas seulement ceux associés les uns aux autres. Cela signifie que pour chacun de vos 95 objets, vous obtiendrez la distance classée pour les 211 propriétés, donc 20 045 lignes dans le tableau. Vous devez soit filtrer la table résultante, soit comme le suggère Emil, automatiser la tâche pour créer des sélections basées sur l'association et l'exécuter uniquement sur ces groupes.

En ce qui concerne le filtrage, oui, une jointure (suivie d'une requête de définition ou d'une sélection) est tout ce dont vous avez besoin. Le résultat de l'outil vous donne IN_FID et NEAR_FID. Selon la façon dont vous exécutez l'outil (propriétés près du point ou propriété près du point), déterminez quel FID est lequel. Vous devez ensuite joindre vos tables de points et de propriétés (les deux) au résultat de l'outil en fonction du FID approprié.

Cela suppose que chacun de vos 211 enregistrements de propriété possède un attribut qui indique à lequel des 95 points ils appartiennent, car l'étape suivante consiste à sélectionner (ou à interroger la définition) tous les enregistrements des tables jointes où deux champs d'un enregistrement doivent champ de nom de point de correspondance = champ de nom de point associé à la propriété. Les cas où ils ne correspondent pas sont des polygones qui ne sont pas associés à ce point, vous ne vous souciez donc pas de leur distance par rapport à ce point.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.