2013-12-18 10 views
6

Nie chcę uciekać się do konwertowania danych geograficznych do geometrii, aby zwracała true w STIntersect.Punkt geograficzny SQL wewnątrz wieloboku, który nie zwraca wartości true w STIntersect (ale zwraca wartość true za pomocą geometrii)

Oto kod SQL:

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326) 
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326) 

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon) 

Następujące zwraca false (0), jednak jeśli używam:

DECLARE @point GEOMETRY = GEOMETRY::Point(1, 1, 4326) 
DECLARE @polygon GEOMETRY = GEOMETRY::STGeomFromText('POLYGON((0 0, 0 2, 2 2, 2 0, 0 0))', 4326) 

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon) 

Zwraca prawda, jest tam coś mi brakuje? Wiem tylko, że geografia jest płaszczyzną 3D, a geometria jest płaską mapą, jednak używam Ziemi do obliczeń, jeśli punkt znajduje się w wielokącie.

PS: To nie działa tak dobrze z STContains, STWithin, STOverlaps

pomocą programu Microsoft SQL Server 2012

Odpowiedz

8

to działa:

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(1, 1, 4326) 
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((0 0, 2 0, 2 2, 0 2, 0 0))', 4326) 

SELECT @polygon.STIntersects(@point), @point.STIntersects(@polygon) 

Trzeba być ostrożnym z " kierunek ", w którym opisujesz wielokąt dla geography - rozważ wielokąt zdefiniowany jako okrąg wokół równika - czy zamierzałeś określić półkulę północną czy południową?

Zobacz here:

W systemie elipsoidalnym wielokąt nie ma znaczenia, czy jest niejednoznaczny, bez orientacji. Na przykład, czy pierścień wokół równika opisuje północną czy południową półkulę? Jeśli używamy typu danych geograficznych do przechowywania instancji przestrzennej, musimy określić orientację pierścienia i dokładnie opisać położenie instancji. Wnętrze wielokąta w systemie elipsoidalnym określa zasada lewostronna.

+0

Dzięki, pracowali dla mnie. – MilkTea027

+1

To jest ładny wpis na blogu wyjaśniający regułę _left-hand_: http://danielwertheim.se/2012/12/03/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position- no/ Na przykład: jeśli punkt odnosi się do _left_ wszystkich linii wielokąta, ma on _intersect_ wielobok. – bounav

+0

Adres URL powyższego wpisu na blogu wyjaśniający regułę lewej ręki powinien być następujący: http://danielwertheim.se/sqlgeography-in-sql-server-2012-polygon-must-start-on-correct-position-no/ – Daniel

Powiązane problemy