4

私は Java アプリを作成しており、米国のすべての州の境界を含む ESRI Shapefile を取得しています。私が必要としているのは、特定の緯度/経度ポイントが州の境界線から指定された距離内にあるかどうかを判断できることです。つまり、特定の境界線を指定するのではなく、そのポイントがいずれかに近いかどうかを確認するだけです。そのうちの。

解は非常に正確である必要はありません。たとえば、境界に対して垂直に測定する必要はありません。北、南、東、西に X メートル進むと国境を越えるかどうかを確認するだけで十分です。これらの計算を大量に実行するため、ソリューションは計算効率が高くなければなりません。

私は、GeoTools ライブラリを使用することを計画しています (より簡単なオプションがあれば、私はそれで十分です)。Shapefile プラグインを使用します。私がよく理解していないのは、シェープファイルをメモリにロードしたら、国境に近づいているかどうかを確認するにはどうすればよいですか?

ありがとう!-ダン

4

3 に答える 3

7

GeoToolsに含まれているものであるGeometryのJTSを想定すると:

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

二重の数値は、計算が実行される単位を定義するCRSから取得する必要があります。

これらは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;
于 2009-05-27T19:55:24.163 に答える
2

ポイントAが州の境界からXメートル以内にあり、Xが一定であり、どの境界であるかを気にしない場合は、一連のボックスとして負のスペースを事前に計算できます。次に、あなたがしなければならないのは、ポイントに対するそれらのボックスのそれぞれの包含チェックです。それらのどれも一致しない場合、あなたはネガティブスペースにいません。

于 2009-05-27T20:00:01.863 に答える
1

シェープファイルから各州の形状を何らかの方法で抽出できれば、一辺が x メートルのエンベロープを作成し (ポイントが正確に中心にあるように)、これら 2 つの形状が交差するかどうかを確認すると、質問に答えることができます。 .

ESRI の ArcGIS Engine を使用していた場合、ジオメトリで定義されたポイント (おそらくバッファーを使用) で ISpatialFilter を使用し、States シェープファイルに対してクエリを実行します。返された結果は、ポイントが州の近くにあったことを示します。私は GeoTools になじみがなく、ドキュメントを閲覧しているときに、そのタイプの機能のように見えるものに出くわしませんでしたが、GeoTools はそれを持っているに違いありません。GeoTools を使用してシェープファイルで空間クエリを実行する方法の例を探すことができます。

于 2009-05-27T19:34:50.120 に答える