2

「ID」という追加フィールドを持つシェープファイル(shp)を使用しています。シェープファイルはクリーンで、重なり合うポリゴンはありません。この 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 によって異なる結果が得られるのではないかと疑っていましたが、この関数にブレークポイントを設定すると、常に matchingRowIds にエントリが 1 つしかないため、そうではないようです。 .

私は何か間違ったことをしていますか/シェープファイルから特定のポイントを含むポリゴンを取得するより良い方法はありますか?

注:sharpMap v1.0.4.1を使用しています

4

1 に答える 1

0

ここで問題を解決しました。SharpMap v1.0.4.1 を介したシェープファイルへのアクセスは、完全にスレッドセーフではありません。上記の関数は、同じシェープ ファイルに対して複数のスレッドによって呼び出され、同時実行性の問題を引き起こしていました。並列化を削除すると、今のところ問題が修正されました。Sharpmap v1.1 の最新バージョンでは、同時実行に関する問題の一部が修正されたようです。

v1.1のリリースノートでこれを見つけました-「同じシェープファイルの同時リーダーに関する問題を修正しました(shxファイルのロックエラー)」

于 2014-09-19T16:02:26.150 に答える