Почему 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.


person KnightFox    schedule 16.09.2014    source источник
comment
Вы можете поделиться файлом shp?   -  person John Powell    schedule 17.09.2014


Ответы (1)


Мы разобрались в этом вопросе. Доступ к шейп-файлам через SharpMap v1.0.4.1 не является полностью потокобезопасным, вышеуказанная функция вызывалась несколькими потоками для одного и того же шейп-файла, что вызывало проблемы с параллелизмом. Удаление распараллеливания решило проблему на данный момент. Последняя версия Sharpmap v1.1, похоже, исправила некоторые проблемы с параллелизмом.

Нашел это в примечаниях к выпуску для версии 1.1: «Исправлена ​​проблема с одновременным чтением одного и того же шейп-файла (ошибка блокировки shx-файла)».

person KnightFox    schedule 19.09.2014