La determinación de si punto geográfico está dentro de X metros de una frontera del estado (usando shapefile para los datos de la frontera)

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

Pregunta

Así que estoy escribiendo una aplicación Java, y tengo un archivo shape de ESRI que contiene las fronteras de todos los estados de Estados Unidos. Lo que necesito es ser capaz de determinar si cualquier lat / punto lon está dentro de una distancia especificada desde cualquier línea de frontera del estado - es decir, voy a no sea especificando una línea fronteriza en particular, sólo hay que ver si el punto está cerca de cualquier de ellos.

La solución no tiene por qué ser muy preciso en absoluto; p.ej. No necesito que se trata de medir perpendicular a la frontera, o lo que sea. Sólo la comprobación para ver si va metros X norte, sur, este u oeste daría lugar a cruzar una frontera sería más que suficiente. La solución tiene que ser computacionalmente eficiente, ya que voy a estar realizando un gran número de estos cálculos.

Estoy pensando en usar la biblioteca GeoTools (aunque si hay una opción más simple, yo soy todo para él) con el plugin Shapefile. Lo que realmente no entiendo es:? Una vez que tengo el archivo de forma cargado en la memoria, ¿cómo puedo comprobar para ver si estoy cerca de un borde

Gracias! -Dan

¿Fue útil?

Solución

JTS para la geometría que es lo que está incluido en GeoTools:

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;
}

El número doble tendrá que venir del CRS que definirá las unidades en que se llevará a cabo el cálculo.

Estas son las importaciones GeoTools:

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;

Otros consejos

Si lo que desea es saber si el punto A está dentro de X metros de la frontera con el estado y X es constante y no le importa lo que bordean lo es, se puede calcular previamente el espacio negativo como una serie de cajas. Entonces todo lo que tiene que hacer es una contiene cheque para cada una de esas cajas contra el punto. Si ninguno de ellos coincide, no estás en el espacio negativo.

Si de alguna forma puede extraer la forma para cada estado del archivo de forma, crear un sobre que es x metros de lado (con su punto en el centro exacto) y ver si esas dos formas se cruzan, se podrá responder a la pregunta.

Si yo estaba usando ArcGIS de ESRI motor, que haría uso de un ISpatialFilter con el punto definido en la geometría (posiblemente con un buffer) y consulta que contra el shapefile Unidos. Cualquier resultado (s) regresó indicaría que el punto estaba cerca de un estado. Estoy familiarizado con GeoTools y, mientras se navega a través de su documentación, no he encontrado nada que se parecía a ese tipo de funcionalidad, pero deben tenerlo. Es posible que desee buscar ejemplos de cómo utilizar GeoTools para realizar consultas espaciales en archivos de formas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top