为什么在从点到多边形映射时,sharpmap会返回不一致的结果?

时间:2014-09-16 19:36:42

标签: c# .net geospatial sharpmap nettopologysuite

我正在使用一个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导致我得到不同的结果,但似乎并非如此,因为当我在此函数中放置一个断点时,我总是只有一个matchRowIds中的条目。

我做错了什么/有没有更好的方法来获取包含shapefile中给定点的多边形?

注意:我使用的是sharpMap v1.0.4.1

1 个答案:

答案 0 :(得分:0)

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

在v1.1的发行说明中找到了这个 - &#34;修复了同一个shapefile的同时读者的问题(shx文件的锁定错误)&#34;