私は 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である必要があるのか も疑問に思っていますか?