2009-05-27 6 views
4

Also schreibe ich eine Java-App und ich habe ein ESRI-Shapefile, das die Grenzen aller US-Bundesstaaten enthält. Was ich brauche, ist in der Lage zu bestimmen, ob irgendein gegebener lat/lon Punkt innerhalb einer spezifizierten Entfernung von JEDER Staatsgrenzlinie ist - dh ich werde nicht eine bestimmte Grenzlinie spezifizieren, nur sehen müssen, ob der Punkt nah ist zu jeder von ihnen.Ermitteln, ob der geografische Punkt innerhalb von X Metern einer Staatsgrenze liegt (mit Shapefile für Grenzdaten)

Die Lösung muss NICHT sehr präzise sein; z.B. Ich muss mich nicht mit der Messung senkrecht zur Grenze befassen, oder was auch immer. Ich würde nur überprüfen, ob es mehr als ausreichend wäre, X Meter nach Norden, Süden, Osten oder Westen zu fahren, um eine Grenze zu überqueren. Die Lösung muss rechnerisch effizient sein, da ich eine große Anzahl dieser Berechnungen durchführen werde.

Ich plane, die GeoTools-Bibliothek (wenn es eine einfachere Option gibt, bin ich aber dafür) mit dem Shapefile-Plugin. Was ich nicht wirklich verstehe ist: Sobald ich die Shapefile in den Speicher geladen habe, wie überprüfe ich, ob ich in der Nähe einer Grenze bin?

Danke! -Dan

+0

gegeben "muss nicht sehr präzise sein", würde ich annehmen, dass es nicht für die Kurve der Erde verantwortlich sein muss? das klingt wie ein sehr hartes Problem zu lösen, ohne Brute zwingt es (Überprüfung jeder einzelnen Zeile) ... viel Glück – jlarson

+0

Richtig. Muss die Krümmung der Erde nicht berücksichtigen, zumindest in keinem sinnvollen Sinn. – DanM

Antwort

7

Angenommen JTS für die Geometrie das ist, was in GeoTools enthalten ist:

public boolean pointIsClose(File file, Point targetPoint,double distance) { 


    boolean ret = false; 
    Map connect = new HashMap(); 
    connect.put("url", file.toURL()); 
    DataStore dataStore = DataStoreFinder.getDataStore(connect); 


    FeatureSource featureSource = dataStore.getFeatureSource(typeName); 
    FeatureCollection collection = featureSource.getFeatures(); 
    FeatureIterator iterator = collection.features(); 



    try { 
    while (iterator.hasNext()) { 
     Feature feature = iterator.next(); 
     Geometry sourceGeometry = feature.getDefaultGeometry(); 
     ret= sourceGeometry.isWithinDistance(targetPoint, distance); 
    } 
    } finally { 
    iterator.close(); 
    } 
    return ret; 
} 

die doppelte Anzahl wird von den CRS kommen, welche die Einheiten definieren, in dem die Berechnung durchgeführt wird.

Dies sind die GeoTools Importe:

import org.geotools.data.DataStore; 
import org.geotools.data.DataStoreFinder; 
import org.geotools.data.FeatureSource; 
import org.geotools.feature.Feature; 
import org.geotools.feature.FeatureCollection; 
import org.geotools.feature.FeatureIterator; 
import org.geotools.geometry.jts.JTS; 
import org.geotools.referencing.CRS; 
import org.opengis.referencing.crs.CoordinateReferenceSystem; 
+0

Dies könnte verbessert werden, indem nur der Zustand berücksichtigt wird, in dem der Punkt liegt, indem eine contains-Abfrage verwendet wird, um nur einen Zustand zurück zu bringen. –

1

Wenn Sie die Form für jeden Zustand aus dem Shapefile irgendwie extrahieren können, erstellen Sie einen Umschlag, der x Meter auf einer Seite ist (mit Ihrem Punkt in der Mitte) und sehen, ob diese beiden Formen sich schneiden. Ich werde die Frage beantworten können.

Wenn ich die ArcGIS-Engine von ESRI verwendete, würde ich einen ISpatialFilter mit dem in der Geometrie definierten Punkt (möglicherweise mit einem Puffer) verwenden und diesen gegen das States-Shapefile abfragen. Alle zurückgegebenen Ergebnisse würden anzeigen, dass der Punkt in der Nähe eines Status war. Ich bin mit GeoTools nicht vertraut und beim Durchblättern ihrer Dokumentation bin ich auf nichts gestoßen, das nach dieser Art von Funktionalität aussah, aber sie müssen es haben. Sie können nach Beispielen für die Verwendung von GeoTools suchen, um räumliche Abfragen für Shapefiles durchzuführen.

2

Wenn Sie wollen einfach nur wissen, ob Punkt A in X Meter von einer Staatsgrenze ist und X ist konstant und Sie kümmern sich nicht, die Grenze ist es, Sie kann den negativen Raum als eine Reihe von Kästchen vorberechnen. Dann müssen Sie nur für jeden dieser Kästchen einen Häkchen-Check gegen den Punkt machen. Wenn keine von ihnen übereinstimmt, befinden Sie sich nicht im negativen Bereich.

Verwandte Themen