ベクターデータセットからジオメトリを取得し、ハッシュに縮小したいと思います。次に、このハッシュを使用して、そのデータの整合性を検証し、同一のジオメトリを識別します。
使用できる適切なアルゴリズムはありますか?どのような落とし穴に遭遇する可能性がありますか?
ベクターデータセットからジオメトリを取得し、ハッシュに縮小したいと思います。次に、このハッシュを使用して、そのデータの整合性を検証し、同一のジオメトリを識別します。
使用できる適切なアルゴリズムはありますか?どのような落とし穴に遭遇する可能性がありますか?
回答:
また、同一のジオメトリを識別します。
識別にハッシュコードを使用することはできません。以下の場合、ハッシュ衝突あなたは常に後処理として、より高価な比較方法が必要になりますので、あなたは、異なるオブジェクトに対して同じハッシュコードを得ることができます。しかしもちろん、ハッシュの衝突を減らすために、ハッシュ方式を調整することもできます。
単純にしたい場合は、MD5または任意のハッシュを使用しますが、ハッシュの衝突の確率をさらに減らすことができます。ジオメトリが変換または回転されておらず、整数のハッシュコードが必要な場合、メソッドは次のようになります。
int hash = numberOfPoints * 37;
hash += geometryType * 37;
...
for(point : points) {
hash = hash XOR geohash(point.lat, point.lon)
}
以下のためにジオハッシュ方法もに見ていた空間キーエリアの境界が世界の境界よりも小さい場合にはより多くのメモリ効率的で、より正確である(「バイナリジオハッシュを」)。また、私のJava実装を調べることもできます。
ポイントの差を使用して中心点を計算している場合は、ハッシュ衝突の可能性をさらに減らすことができます。
int hash = numberOfPoints;
hash += 37 * geometryType;
...
hash = hash XOR geohash(someCenterPoint.lat, someCenterPoint.lon);
for(point : points) {
hash += 37 * latToInteger(previousPoint.lat - point.lat);
hash += 37 * lonToInteger(previousPoint.lon - point.lon);
}
たとえば緯度を整数に変換するには、次のようにします。
latAsInt = latitudeFloatValue * (Integer.MAX / 90)
または経度の場合:
lonAsInt = longitudeFloatValue * (Integer.MAX / 180)
GRASS GISソフトウェアでは、MD5を使用して2つのマップが同一かどうかを確認します。
http://svn.osgeo.org/grass/grass-addons/grass7/general/g.compare.md5/g.compare.md5.html
あなたのケースでは、アタッチされたDB(属性)もチェックする必要があります。