「ID」という追加フィールドを持つシェープファイル(shp)を使用しています。シェープファイルはクリーンで、重なり合うポリゴンはありません。この shapeFile を次の関数に渡すと、一貫性のない結果が得られます。(返される Id は、緯度経度の同じセットに対して常に同じとは限りません)。
public static long? GetIdFromLatLong(IProvider provider, double lat, double lon)
{
var matchingRowIds = new Collection<uint>();
var vertex = new GeoAPI.Geometries.Coordinate(lon, lat);
var ntsPoint = new NetTopologySuite.Geometries.Point(vertex.X, vertex.Y);
var envelop = new GeoAPI.Geometries.Envelope(vertex);
if (!provider.IsOpen)
{
provider.Open();
}
var ids = provider.GetObjectIDsInView(envelop);
foreach (uint id in ids)
{
var geom = provider.GetGeometryByID(id);
if (geom.Contains(ntsPoint))
{
matchingRowIds.Add(id);
}
}
// Get region Id from RowId
var matchedId = matchingRowIds.Count == 0
? null
: matchingRowIds.Select(i => (long?) provider.GetFeature(i)["ID"]).FirstOrDefault(i => i != 0);
return matchedId;
}
最初は、一致する複数のポリゴンがあり、FirstOrDefault によって異なる結果が得られるのではないかと疑っていましたが、この関数にブレークポイントを設定すると、常に matchingRowIds にエントリが 1 つしかないため、そうではないようです。 .
私は何か間違ったことをしていますか/シェープファイルから特定のポイントを含むポリゴンを取得するより良い方法はありますか?
注:sharpMap v1.0.4.1を使用しています