4

タイプ「POINT」のDbGeographyオブジェクトのコレクションからタイプ「Polygon」のDbGeographyオブジェクトを作成する方法を教えてもらえますか?

これまでのところ、ポリゴンを作成するこれがありますが、最初のステップがありません。

1. DbGeography multipoint = DbGeography.MultiPointFromText("MULTIPOINT(53.095124 -0.864716, 53.021255 -1.337128, 52.808019 -1.345367, 52.86153 -1.018524)", 4326)

2. DbGeometry temp_multipoint = DbGeometry.MultiPointFromBinary(multipoint.AsBinary(), 4326)

3. DbGeography polygon = DbGeography.PolygonFromBinary(temp_multipoint.ConvexHull.AsBinary(), 4326); (RESULT)

問題は、DbGeography(POINTS)のリストから最初のマルチポイント地理オブジェクトを作成することです。

4

3 に答える 3

6

WKTを使用して、各ポイントをDbGeographyオブジェクトとして作成します。

DbGeography point1 = DbGeography.FromText("POINT(53.095124 -0.864716)", 4326);
DbGeography point2 = DbGeography.FromText("POINT(53.021255 -1.337128)", 4326);
DbGeography point3 = DbGeography.FromText("POINT(52.808019 -1.345367)", 4326);
...
DbGeography polygon = DbGeography.PolygonFromText("POLYGON((53.095124 -0.864716, 53.021255 -1.337128, 52.808019 -1.345367, 53.095124 -0.864716))", 4326);

注意すべき2つのこと:

  • WKT形式は経度、次に緯度であり、より直感的な緯度、経度ではありません
  • ポリゴンの場合、「閉じる」には、最後のポイントが最初のポイントと一致する必要があります

これがお役に立てば幸いです-私もポリゴンのことを学ぶために戦いました!

WKT形式に関する追加のヒントについては、次の記事を参照してください:http: //en.wikipedia.org/wiki/Well-known_text

于 2013-03-25T14:46:06.767 に答える
2

最終的に、WKTからポリゴンを作成せずに、複数のポイントからポリゴンを作成する方法を見つけました。以下の説明は少し簡略化されていますが、それでも

    var PolygonFromMultiplePoints = new DbGeography();

    using (var db = new LocationContext())
    {
        //Select Locations known to be within a certain area which should define the polygon.
        foreach (var item in db.Locations)
        {
            PolygonFromMultiplePoints.Union(item.GeoLocation);
        }
    }            
    var temp_multipointgeometry = DbGeometry.MultiPointFromBinary(PolygonFromMultiplePoints.AsBinary(), DbGeometry.DefaultCoordinateSystemId);            
    PolygonFromMultiplePoints = DbGeography.PolygonFromBinary(temp_multipointgeometry.ConvexHull.AsBinary(), DbGeography.DefaultCoordinateSystemId);

コードサンプルは、データベースにポイントとして保存されているdbgeographyのコレクションがすでにあることを前提としています。私のデータベース情報は、GeoNamesから場所をインポートすることで得られました。

于 2013-09-23T23:39:37.620 に答える
0

いくつかの理由から、ポイントを繰り返し追加して、実際にはC#で実行する必要があります。

  • 終了位置が開始位置と同じであることを確認する必要があります。
  • リングの向きにより、ポイントが時計回りに追加されていることを確認する必要があります。リングを裏返して反時計回りに移動できます(sqlGeography.ReorientObject();)。

あなたは空間データを扱っていますが、複雑な形状の構築はT-SQLを対象としたものではありませんでした。最悪の場合、CLR関数に入れます。

于 2013-09-22T04:48:01.127 に答える