0

私は SQL Server 内でポリゴンの交差を計算しており、次の例に基づいて次の表を作成しています

+--------+----------------------+------------------------------------+------------+
| ZoneId |     Coordinates      |        Coordinates_OGC_WKT         |  ZoneName  |
+--------+----------------------+------------------------------------+------------+
|      1 | 0xE61000000 [etc...] | POLYGON ((-122.358 47.653 [etc...] | Polygon    |
|      2 | 0xE61000000 [etc...] | LINESTRING (-122.36 47 [etc...]    | Linestring |
+--------+----------------------+------------------------------------+------------+

以下のように提案された SP をテストしましたが、機能しますが、「ZoneName」フィールドも返す方法がわかりません。これは重要です。

DECLARE @geocoords geography;
DECLARE @geoline geography;
DECLARE @result geography;

SELECT @geocoords = Coordinates FROM SpatialZonePolygons WHERE ZonePolygonId = 1;
SELECT @geoline = Coordinates FROM SpatialZonePolygons WHERE ZonePolygonId = 2;
SELECT @result = @geoline.STIntersection(@geocoords);
SELECT @result.STAsText() AS WKT;

結果には交差座標が表示されますが、ポリゴン座標を保持するデータベース内の行は示されません。交差点が発生する 'ZoneName' を取得しようとしています (これは必須です):

+---------------------------------------------------------------+
|                              WKT                              |
+---------------------------------------------------------------+
| LINESTRING (-122.35800000000017 47.656000130337446, [etc...]) |
+---------------------------------------------------------------+

これは簡単なはずですが、私は苦労しています。

- - 編集 - -

これは機能するはずで、機能するように見えます...しかし、ポリラインの近くにないゾーンを取得しています:

SELECT *
FROM dbo.SpatialZonePolygons
WHERE Coordinates.STIntersects(geography::STGeomFromText('LINESTRING(51.46276 -0.106, 51.46275 -0.10604, 51.46248 -0.10672, 51.46262 -0.10687, etc...)', 4326))>0

Google マップに手動でプロットして、ポリラインが正しいことを確認しました。同じことを行ってポリゴン座標が正しいことも確認しましたが、なぜデータベースはポリラインから 50 マイルも離れた交点のないゾーンを返すのでしょうか?

テストとして、ポリラインはロンドンを通過するので、ブリュッセルのゾーンも返されるかどうかを確認しようと思いました.そうではありませんでした. したがって、これは精度の問題でしょうか? プロットされたポリラインが正確にレンダリングされ、ゾーンの近くには行かないので、私はそれを疑っています.

私は今少し必死になっているので、座標を正しい順序(lat lng)で保存しているのか、それともlng latである必要があるのか​​ も疑問に思っていますか?

4

2 に答える 2

0

「特定の線と交差するようなテーブルからポリゴンを返す」というあなたのコメントを要件として取っています。

create procedure findPolygons (
   @line geography
)
as
begin

    select ZoneId, Coordinates
    from SpatialZonePolygons 
    where Coordinates.STIntersects( @line ) = 1

end
于 2014-08-08T15:07:19.983 に答える