Почему sharpmap возвращает противоречивые результаты при отображении из точки в полигон?
Я использую шейп-файл (shp), который имеет поле дополнения под названием "ID". Шейп-файл чистый и не имеет перекрывающихся полигонов. Когда я передаю этот shapeFile следующей функции, я получаю противоречивые результаты. (Идентификатор, возвращаемый не всегда одинаков для одинакового набора широты и долготы).
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 заставляет меня получать разные результаты, но это также не похоже на случай, потому что когда я помещаю точку останова в эту функцию, у меня всегда есть только одна запись в MatchRowIds,
Я делаю что-то не так / Есть ли лучший способ получить полигон, который содержит данную точку из шейп-файла?
Примечание: я использую sharpMap v1.0.4.1
1 ответ
Мы поняли проблему здесь. Доступ к шейп-файлам через SharpMap v1.0.4.1 не является полностью потокобезопасным, указанная выше функция вызывалась несколькими потоками для одного и того же файла формы, что вызывало проблемы с параллелизмом. Удаление распараллеливания решило проблему на данный момент. В последней версии sharpmap v1.1, похоже, исправлены некоторые проблемы с параллелизмом.
Об этом говорится в примечаниях к выпуску v1.1 - "Исправлена проблема с одновременным считыванием одного и того же шейп-файла (ошибка блокировки shx-файла)"