为什么sharpmap在从点映射到多边形时返回不一致的结果
本文关键字:返回 不一致 结果 多边形 sharpmap 映射 为什么 | 更新日期: 2023-09-27 18:22:16
我使用的是一个shapefile(shp),它有一个名为"ID"的添加字段。shapefile是干净的,没有任何重叠的多边形。当我把这个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导致我得到不同的结果,但事实似乎也并非如此,因为当我在该函数中放置断点时,matchingRowId中总是只有一个条目。
我做错了什么吗/有没有更好的方法从形状文件中获取包含给定点的多边形?
注意:我使用的是sharpMap v1.0.4.1
我们在这里解决了这个问题。通过SharpMap v1.0.4.1访问形状文件并不完全是线程安全的,上述函数是由同一形状文件的多个线程调用的,这导致了并发问题。删除并行化暂时解决了这个问题。最新版本的sharpmap v1.1似乎已经通过一致性解决了一些问题。
在v1.1的发行说明中发现了这一点——"修复了同时读取同一形状文件的问题(shx文件的锁定错误)"