Suite

Interroger ShapeFile pour obtenir des informations à partir des coordonnées

Interroger ShapeFile pour obtenir des informations à partir des coordonnées


J'ai un shapefile qui représente tous les bassins hydrologiques du monde. Vous pouvez télécharger le fichier ici :

http://www.fao.org/geonetwork/srv/en/resources.get?id=38047&fname=Major_hydrological_basins.zip&access=private

Dans ce fichier, il y a le monde entier divisé en zones (tous les bassins hydrologiques du monde). Je dois créer une fonction qui interroge le fichier de formes avec la latitude et la longitude, et récupère les valeurs de ce point, à savoir : MAJ_BAS, MAJ_NAME et MAJ_AREA

Je dois le faire du côté serveur, sans interface graphique. Cela me semble simple, quand je le fais dans mon QGIS, je clique simplement sur un point et récupère les informations dont j'ai besoin, alors je me suis dit "il y aura une fonction que vous donnerez la latitude et la longitude, et la fonction répondra avec les données de ce point". Mais je cherche depuis 2 jours et je n'ai toujours pas de solution à ce problème.

Je suis assez nouveau sur QGIS.


Si vous utilisez PyQGIS, je pense que vous pouvez utiliser la méthode QGSVectorLayer.select() pour sélectionner des objets dans un rectangle de recherche donné.

Voir l'exemple de code @nathan-w ici qui semble un bon point de départ : comment puis-je permettre aux utilisateurs de sélectionner des fonctionnalités avec la souris ?

layer.select( layer.pendingAllAttributesList(), rect, True, True) pour l'entité dans la couche :

Et merci pour vos précieuses réponses ! Je vois que vos méthodes sont beaucoup plus rigoureuses que ce que j'ai découvert hier soir, en travaillant sur mon projet, et j'apprécie toutes vos réponses.

Comme je n'ai besoin que de quelques requêtes, ce que j'ai fait a été de créer une table dans MySQL avec des objets polygones, puis d'utiliser l'algorithme de point dans polygone. J'ai créé une fonction dans MySQL qui est la suivante

DETERMINISTIC BEGIN DECLARE n INT DEFAULT 0; DÉCLARER pX DECIMAL(9,6) ; DÉCLARER pY DECIMAL(9,6) ; DÉCLARER ls LINESTRING; DÉCLARER poly1 POINT; DÉCLARER poly1X DECIMAL(9,6) ; DÉCLARER poly1Y DECIMAL(9,6) ; DÉCLARER LE POINT poly2 ; DÉCLARER poly2X DECIMAL(9,6) ; DÉCLARER poly2Y DECIMAL(9,6) ; DÉCLARER i INT PAR DÉFAUT 0 ; DECLARE résultat INT(1) DEFAUT 0 ; FIXER pX = X(p); FIXER pY = Y(p); SET ls = ExteriorRing(poly); SET poly2 = EndPoint(ls); FIXER poly2X = X(poly2) ; FIXER poly2Y = Y(poly2) ; SET n = NumPoints(ls); Alors que je ( poly2Y - poly1Y ) * ( pX - poly1X ) / ( poly2X - poly1X ) + poly1Y ) ) THEN SET result = !result; FIN SI; SET poly2X = poly1X; FIXER poly2Y = poly1Y; FIXER i = i + 1 ; FIN PENDANT ; RETOUR résultat ; Finir

Si la fonction renvoie 1, le point est dans le polygone. S'il renvoie 0, ce n'est pas le cas.

Ensuite, quand j'ai besoin de trouver si un point est à l'intérieur d'un polygone, je vais simplement interroger comme ceci

select * from *Polygon_table* où myWithin(PointFromText( concat( 'POINT(', *{$long}*,", *{$lat}*, ')' ) ), *Polygon_table*.polygon )

où myWithin est le nom de la fonction et le polygone de la table Polygon a été enregistré en tant qu'objet Polygon. Cette fonction renvoie le(s) polygone(s) contenant(s) ce point.

Je sais que ce n'est pas la solution la plus rapide, mais pour mon cas (une seule requête pas souvent), c'était une excellente solution.


Voir la vidéo: Change Projection - Coordinate System in ArcMap