Mehr

Fragen Sie ShapeFile ab, um Informationen aus Koordinaten zu erhalten

Fragen Sie ShapeFile ab, um Informationen aus Koordinaten zu erhalten


Ich habe ein Shapefile, das alle hydrologischen Becken der Welt darstellt. Sie können die Datei hier herunterladen:

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

In dieser Datei ist die ganze Welt in Gebiete unterteilt (alle hydrologischen Becken der Welt). Ich muss eine Funktion erstellen, die das Shapefile mit Breiten- und Längengrad abfragt und die Werte dieses Punktes zurückgibt, das heißt: MAJ_BAS, MAJ_NAME und MAJ_AREA

ich muss das machen Serverseite, ohne GUI. Für mich scheint es einfach zu sein, wenn ich es in meinem QGIS mache, klicke ich einfach auf einen Punkt und bekomme die Informationen zurück, die ich brauche, also dachte ich "Es wird eine Funktion geben, die Sie Breiten- und Längengrad angeben, und die Funktion antwortet mit den Daten dieses Punktes". Aber ich suche seit 2 Tagen und bekomme immer noch keine Lösung zu diesem Problem.

Ich bin ziemlich neu bei QGIS.


Wenn Sie PyQGIS verwenden, können Sie die Methode QGSVectorLayer.select() verwenden, um Objekte in einem bestimmten Suchrechteck auszuwählen.

Siehe @nathan-w-Beispielcode hier, der ein guter Ausgangspunkt zu sein scheint: Wie erlaube ich Benutzern, Funktionen mit der Maus auszuwählen?

layer.select(layer.pendingAllAttributesList(), rect, True, True) für Feature im Layer:

Und danke für deine wertvollen Antworten! Ich sehe, dass Ihre Methoden viel strenger sind als das, was ich gestern Abend bei der Arbeit an meinem Projekt herausgefunden habe, und ich schätze alle Ihre Antworten.

Da ich nur wenige Abfragen benötige, habe ich in MySQL eine Tabelle mit Polygon-Objekten erstellt und dann den Algorithmus Punkt in Polygon verwendet. Ich habe in MySQL eine Funktion erstellt, die wie folgt aussieht

DETERMINISTIC BEGIN DECLARE n INT DEFAULT 0; DECLARE pX DEZIMAL(9,6); DECLARE pY DECIMAL(9,6); DECLARE ls LINESTRING; DECLARE poly1 PUNKT; DECLARE poly1X DECIMAL(9,6); DECLARE poly1Y DECIMAL(9,6); DECLARE poly2 PUNKT; DECLARE poly2X DECIMAL(9,6); DECLARE poly2Y DECIMAL(9,6); DECLARE i INT DEFAULT 0; DECLARE-Ergebnis INT(1) DEFAULT 0; SET pX = X(p); SET pY = Y(p); SET ls = ÄußererRing(poly); SET poly2 = Endpunkt(ls); SET poly2X = X(poly2); SET poly2Y = Y(poly2); SET n = NumPoints(ls); Während ich ( poly2Y - poly1Y ) * ( pX - poly1X ) / ( poly2X - poly1X ) + poly1Y ) ) THEN SET result = !result; ENDE WENN; SET poly2X = poly1X; SET poly2Y = poly1Y; SET i = i + 1; ENDE WÄHREND; RETURN-Ergebnis; Ende

Wenn die Funktion 1 zurückgibt, befindet sich der Punkt im Polygon. Wenn es 0 zurückgibt, ist es nicht.

Wenn ich dann herausfinden muss, ob sich ein Punkt innerhalb eines Polygons befindet, frage ich einfach so ab

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

wobei myWithin der Name der Funktion ist und das Polygon in der Polygon-Tabelle als Polygon-Objekt gespeichert wurde. Diese Funktion gibt die Polygone zurück, die diesen Punkt enthalten.

Ich weiß, das ist nicht die schnellste Lösung, aber für meinen Fall (eine einzige Abfrage nicht oft) war dies eine großartige Lösung.


Schau das Video: How to combine shapefiles in ArcGis