Determinar se o ponto geográfico está dentro metros X de uma fronteira nacional (usando arquivo de forma para os dados de fronteira)

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

Pergunta

Então, eu estou escrevendo um aplicativo Java, e eu tenho um arquivo shape ESRI que contém as fronteiras de todos os estados dos EUA. O que eu preciso é ser capaz de determinar se qualquer lat / ponto de lon está dentro de uma distância especificada de qualquer linha de fronteira do Estado - ou seja, vou não ser especificando uma linha de fronteira particular, só preciso ver se o ponto está perto de qualquer deles.

A solução não tem que ser muito preciso em tudo; por exemplo. Eu não preciso de estar lidando com medição perpendicular à fronteira, ou o que quer. Apenas verificando para ver se vai metros X norte, sul, leste ou oeste resultaria em atravessar uma fronteira seria mais do que suficiente. A solução tem de ser computacionalmente eficiente, como eu vou estar realizando um grande número destes cálculos.

Estou a planear utilizar a biblioteca GeoTools (embora se há uma opção mais simples, eu sou todo para ele) com o plugin Shapefile. O que eu realmente não entendo é:? Uma vez eu tenho o shapefile carregado na memória, como faço para verificar para ver se estou perto de uma fronteira

Obrigado! -Dan

Foi útil?

Solução

Assumindo JTS para a geometria que é o que está incluído na 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;
}

O número dupla terá que vir a partir do CRS que vai definir as unidades em que o cálculo serão realizados.

Estas são as GeoTools importações:

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;

Outras dicas

Se você só quer saber se o ponto A é a poucos metros X de uma fronteira nacional e X é constante e você não se importa que fazem fronteira que é, você pode precompute o espaço negativo como uma série de caixas. Então tudo que você tem a fazer é um contém verificação para cada uma dessas caixas contra o ponto. Se nenhum deles corresponder, você não está no espaço negativo.

Se você pode de alguma forma extrair a forma para cada estado do shapefile, criar um envelope que é x metros de lado (com o seu ponto no centro exato) e ver se essas duas formas se cruzam, você vai ser capaz de responder à pergunta.

Se eu estava usando Motor ArcGIS da ESRI, eu usaria um ISpatialFilter com o ponto definido na geometria (possivelmente com um buffer) e consulta que contra o shapefile Unidos. Qualquer resultado (s) voltou indicaria que o ponto estava perto de um estado. Eu estou familiarizado com GeoTools e, enquanto navega através da sua documentação, eu não encontrei nada parecido com esse tipo de funcionalidade, mas eles devem ter. Você pode querer olhar para exemplos de como usar GeoTools para executar consultas espaciais em shapefiles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top