为什么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在从点映射到多边形时返回不一致的结果

我们在这里解决了这个问题。通过SharpMap v1.0.4.1访问形状文件并不完全是线程安全的,上述函数是由同一形状文件的多个线程调用的,这导致了并发问题。删除并行化暂时解决了这个问题。最新版本的sharpmap v1.1似乎已经通过一致性解决了一些问题。

在v1.1的发行说明中发现了这一点——"修复了同时读取同一形状文件的问题(shx文件的锁定错误)"