Вы должны перевернуть значения на geography::Point
, так как первое значение - это долгота, а второе значение - широта:
Тип Point для типа данных geography представляет одно местоположение, где x и y представляют значения долготы и широты соответственно.
источник: https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/bb964737 (v = sql .105)
См. Следующее сравнение между использованием типа данных Point
напрямую или получением объекта Point
с geometry::STGeomFromText
. Порядок долготы и долготы различается .
-- get the Point from text using geography::STGeomFromText
SELECT geography::STGeomFromText('POINT(51.519425 -0.127029)', 4326).Lat -- -0,127029
SELECT geography::STGeomFromText('POINT(51.519425 -0.127029)', 4326).Long -- 51,519425
-- get the Point directly using geography::Point
SELECT geography::Point(51.519425, -0.127029, 4326).Lat -- 51,519425
SELECT geography::Point(51.519425, -0.127029, 4326).Long -- -0,127029
Итак, у вас есть две возможности решить эту проблему:
1. переверните значения Point
:
SELECT geography::STGeomFromText('POLYGON ((51.561283 -0.199251
,51.562136 -0.045443
,51.468985 -0.045443
,51.472407 -0.197878
,51.561283 -0.199251))', 4326
).STIntersects(geography::Point(-0.127029, 51.519425, 4326))
2. укажите Point
с помощью текста:
SELECT geography::STGeomFromText('POLYGON ((51.561283 -0.199251
,51.562136 -0.045443
,51.468985 -0.045443
,51.472407 -0.197878
,51.561283 -0.199251))', 4326
).STIntersects(geography::STGeomFromText('POINT(51.519425 -0.127029)', 4326))
Поскольку вы работаете с географическими данными, убедитесь, что многоугольник соответствует правильной области, чтобы получить правильные данные. Вы можете использовать следующий многоугольник для соответствия ожидаемой площади:
SELECT geography::STGeomFromText('POLYGON((
-0.199251 51.561283,
-0.197878 51.472407,
-0.045443 51.468985,
-0.045443 51.562136,
-0.199251 51.561283))', 4326
)
Теперь вы можете использовать следующее решение, чтобы проверить, находится ли точка внутри многоугольника:
SELECT geography::STGeomFromText('POLYGON((
-0.199251 51.561283,
-0.197878 51.472407,
-0.045443 51.468985,
-0.045443 51.562136,
-0.199251 51.561283))', 4326
).STIntersects(geography::Point(51.519425, -0.127029, 4326))