0

メソッドを使用して、緯度、経度座標がデータベースに格納されているポリゴンのいずれかに含まれているかどうかを判断し、該当するポリゴンのリストを返します (存在する場合)。

私は緯度/経度を持っています:

50.120578, -103.535156

ジオフェンスを作成してデータベースに保存しましたが、

CREATE TABLE [dbo].[GeoFences] (
    [Id]           INT               IDENTITY (1, 1) NOT NULL,
    [GeoPoints]    [sys].[geography] NULL,
    CONSTRAINT [PK_dbo.GeoFences] PRIMARY KEY CLUSTERED ([Id] ASC)
);

これらは GeoPoints の値です。

POLYGON ((-129.63729858398437 57.279042764977774, -92.899017333984375 56.8970039212726, -93.865814208984375 48.922499263758255, -122.86972045898437 48.806863461085172, -129.37362670898437 57.088515327886505, -129.63729858398437 57.279042764977774))

このメソッドを使用すると、ポリゴンがポイントを囲むときにその行が返されると期待しています。

public IEnumerable<GeoFence> SearchGeoPoint(DbGeography geoPoint)
        {
            try
            {
                return _geoLocationRepository.Get.Where(obj => obj.GeoPoints.Intersects(geoPoint));
            }
            catch (Exception)
            {
                return null;
            }
        }

ただし、行が返されません。例外やエラーは発生しません。単に 0 行です。

4

2 に答える 2

0

座標が間違った順序で定義されているため、ポリゴンは実際には「小さな」穴のある地球を表しています。

SqlGeography は、内部領域を常に左側に保ちながら座標を「移動」する必要があります。これは、ポリゴンで定義されたすべての穴を「反対」方向に歩く必要があることを意味します (実際にはポリゴンの内部領域を左に保ちます)。本質的に、あなたは地球内のその穴を定義しています.

つまり、正しい結果 (および探している結果) を得るには、座標の順序を逆にする必要があります。SQL Server 2012 を使用している場合は、次のReorientObject()方法を試してください。

DECLARE @geog GEOGRAPHY = (SELECT [GeoPoints].ReorientObject() FROM [dbo].[GeoFences] WHERE [Id] = <an id>);
SELECT @geog;

ReorientObject()ただし、これはこのシナリオの一時的な修正にすぎないことをお勧めします。正しい順序で定義されている場合は、保存されているすべてのポリゴンを永続的に「再配置」する必要があります。

于 2014-03-17T08:49:28.913 に答える