Bestimmen, ob geographischer Punkt X liegt innerhalb Meter einer Staatsgrenze (unter Verwendung von Formdatei für die Grenzdaten)

StackOverflow https://stackoverflow.com/questions/917484

Frage

So eine Java-Anwendung Ich schreibe, und ich habe eine ESRI-Shape-Datei bekommen, die die Grenzen aller US-Staaten enthält. Was ich brauche, ist in der Lage sein, um zu bestimmen, ob eine lat / lon Punkt gegeben ist, innerhalb einer bestimmten Entfernung von jedem Staat Grenzlinie - dh ich will nicht sein, eine bestimmte Grenze Zeile angeben, muß nur sehen, ob der Punkt in der Nähe von jeder von ihnen.

Die Lösung muss gar nicht sehr genau sein; z.B. Ich brauche nicht mit der Messung senkrecht zur Grenze zu tun hat, oder was auch immer. Sie prüft, nur wenn Norden X Meter gehen, Süden, Osten oder Westen würde in einen Grenzübergang wäre mehr als ausreichend. Die Lösung hat rechnerisch effizient sein, da ich eine große Anzahl dieser Berechnungen würde.

Ich plane die GeoTools Bibliothek zu verwenden (obwohl, wenn es eine einfachere Möglichkeit ist, ich alle für sie bin) mit der Shape-Datei Plugin. Was ich nicht wirklich verstehen, ist: Sobald ich die Shape-Datei in den Speicher geladen haben, wie kann ich überprüfen, um zu sehen, ob ich in der Nähe einer Grenze bin

Danke! -Dan

War es hilfreich?

Lösung

Unter der Annahme, JTS für 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 Zahl wird von der CRS welche die Einheiten, in denen definieren wird 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;

Andere Tipps

Wenn Sie nur wissen wollen, ob Punkt A in X Meter von einer Staatsgrenze ist und X ist konstant und Sie kümmern sich nicht, die Grenze ist, können Sie den negativen Raum als eine Reihe von Boxen vorauszuberechnen. Dann alles, was Sie tun müssen, ist ein enthält Scheck für jede dieser Boxen gegen den Punkt. Wenn keiner von ihnen entsprechen, sind Sie nicht in den negativen Raum.

Wenn Sie irgendwie die Form für jeden Zustand aus der Shape-Datei extrahieren, erstellen Sie einen Umschlag, die x Meter auf einer Seite (mit dem Punkt genau in der Mitte) und sehen, ob diese beiden Formen schneiden, Sie in der Lage sein zu die Frage beantworten.

Wenn ich mit ArcGIS Engine ESRI, würde ich einen ISpatialFilter mit dem Punkt in der Geometrie definiert verwenden (möglicherweise mit einem Puffer) und Abfrage, die gegen die Staaten Shape-Datei. Jedes Ergebnis (en) zurückgegeben würde darauf hinweisen, dass der Punkt in der Nähe eines Staates. Ich bin nicht vertraut mit GeoTools und, während des Surfens durch ihre Dokumentation, ich kam nicht über alles, was nach dieser Art von Funktionalität geachtet, aber sie müssen es haben. Sie können für Beispiele aussehen wollen, wie GeoTools zu verwenden, räumliche Abfragen auf Shape-Dateien auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top