SQL Server 2008 приближает .STWithin () для столбца данных Geography - PullRequest
0 голосов
/ 27 февраля 2011

Я использую тип данных SQL 2008 Geography для проекта, который занимается отображением некоторых областей.Мне нужно проверить, чтобы убедиться, что меньшая область полностью находится в пределах большей области.С типом Geometry я мог бы просто использовать .STWithin () .

Я бы просто сделал geometry типы данных многоугольника, а также geography, но я не уверен, что использование многоугольника, сопоставленного с координатами geography, будет работать, как ожидается, если его использовать какgeometry type.

Есть ли способ сделать что-то вроде .STWithin() для типа данных geography?

1 Ответ

1 голос
/ 05 марта 2011

Ну, это не такой чистый подход, как использование STWithin, но вы могли бы сделать это с помощью "STDifference". Я подготовил небольшой пример:

По сути, есть большой прямоугольник, который служит контейнером. Также есть два прямоугольника, «внутри» и «снаружи», где первый полностью содержится в «контейнере», а второй только частично.

Идея состоит в том, чтобы просто проверить, имеет ли STDifference между ребенком и родителем какие-либо точки (трюк в направлении вызова).

declare @container geography;
declare @inside geography;
declare @outside geography;

select @container = geography::STGeomFromText('POLYGON((-10 10, -10 0, 0 0, 0 10, -10 10))', 4326);  -- large rectangle (container)

select @inside = geography::STGeomFromText('POLYGON((-9 9, -9 1, -1 1, -1 9, -9 9))', 4326); -- smaller rectangle (fully contained)

select @outside = geography::STGeomFromText('POLYGON((-9 9, -9 1, 2 1, 2 9, -9 9))', 4326); -- smaller rectangle (partially contained)

select @inside.STDifference(@container).STNumPoints() as [Points Outside Container] -- returns 0

select @outside.STDifference(@container).STNumPoints() as [Points Outside Container] -- returns > 0
...