SQL Server 2012, география.STContains, неправильный результат?
Я использую SQL Server 2012, geography.STContains
(документация ) и я не понимаю, почему код ниже терпит неудачу.
Если я переключаюсь на geometry
, это работает.
Может кто-нибудь объяснить?
/ / Даниэль
declare @geo geography
set @geo = geography::STPolyFromText('POLYGON ((17.519133203852 59.8297423369731, 17.5190071588812 59.8296936773323, 17.5189979955459 59.8298203729009, 17.5191345140461 59.8298223425544, 17.519133203852 59.8297423369731))', 4326)
-- Is not within
declare @p1 geography
set @p1 = geography::STPointFromText('POINT(17.5184709839477 59.829925754067)', 4326)
-- Is within
declare @p2 geography
set @p2 = geography::STPointFromText('POINT(17.519060 59.829774)', 4326)
select
@geo.STContains(@p1), -- should be 0 is 1
@geo.STContains(@p2) -- should be 1 is 0
Обновлено: Если я инвертирую их, это работает просто отлично, но тогда я не получаю этого:
declare @geo geography
set @geo = geography::STPolyFromText('POLYGON ((17.519133203852 59.8297423369731, 17.5190071588812 59.8296936773323, 17.5189979955459 59.8298203729009, 17.5191345140461 59.8298223425544, 17.519133203852 59.8297423369731))', 4326)
select
@geo.STAsText() Polygon,
@geo.STPointN(1).STAsText() Point1,
@geo.STPointN(1).Lat Point1Latitud,
@geo.STPointN(1).Long Point1Longitude
Что приводит к следующему:
Polygon
POLYGON ((17.519133203852 59.8297423369731, 17.5190071588812 59.8296936773323, 17.5189979955459 59.8298203729009, 17.5191345140461 59.8298223425544, 17.519133203852 59.8297423369731))
Point1
POINT (17.519133203852 59.8297423369731)
Point1Latitud
59,8297423369731
Point1Longitude
17,519133203852
1 ответ:
Теперь я нашел проблему. Пользователь нарисовал многоугольник, начиная снизу справа, и пошел по часовой стрелке. Если я переупорядочиваю точки от самой большой широты,а затем иду против часовой стрелки, сортируя по длине, то это работает. Нашел помощника для этого, но это работает только в том случае, если вы "знаете, что это неправильно":
if(sqlGeography.EnvelopeAngle() > 90) sqlGeography ? sqlGeography.ReorientObject();
Просто соберите небольшое решение, которое исправит мои значения: https://github.com/danielwertheim/GeographyFactory
И блог-пост об этом: http://danielwertheim.se/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position/
И продолжение о реальной "проблеме", правиле левой руки:
Http://danielwertheim.se/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position-no/