2017-01-10 1 views
0

J'essaie de déterminer si un point est dans un polygone. Les résultats que je récupère semblent toujours revenir 1, que le point soit dans la limite ou non.Géographie SQL Intersect renvoie toujours 1

DECLARE @point GEOGRAPHY = GEOGRAPHY::Point(54.2225,-4.5366, 4326) 
DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326) 

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

J'utilise SQL Express 2014 fonctionnant localement

Répondre

4

Vous avez un problème classique. L'ordre dans lequel vous spécifiez des points dans un polygone de géométrie est significatif. Comme vous l'avez défini, vous avez créé un polygone qui est le globe entier moins un trou minuscule. Heureusement, le test de ce problème et le correctif sont assez faciles.

DECLARE @polygon GEOGRAPHY = GEOGRAPHY::STGeomFromText('POLYGON((54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420))', 4326) 
set @polygon = @polygon.ReorientObject(); 
select @polygon.EnvelopeAngle() 

Si vous commentez l'appel à ReorientObject(), vous verrez que l'angle d'enveloppe est de 180 degrés. C'est l'heuristique que j'utilise personnellement pour voir s'il y a un problème d'orientation en anneau. Vous pouvez également vérifier la zone avec STArea(). De toute façon, l'objet réorienté est ce que vous attendiez probablement et devrait vous donner de meilleurs résultats lors des tests d'intersection!

+0

Merci pour la réponse - cela a beaucoup de sens. J'utilise maintenant le code suivant mais je reçois toujours la valeur de retour '0' 'DECLARE @point GEOGRAPHY = GEOGRAPHY :: Point (54.1826, -4.5420, 4326) --INSIDE --DECLARE @point GEOGRAPHY = GEOGRAPHIE :: Point (57.1826, -3.5420, 4326) --OUTSIDE DECLARE @polygon GEOGRAPHIE = GEOGRAPHIE :: STGeomFromText ('POLYGONE (' 54.2826 -4.4420, 54.2904 -4.6564, 54.0467 -4.7031, 54.2826 -4.4420)) ', 4326 si @ polygon.EnvelopeAngle() = 180 \t set @polygon = @ polygon.ReorientObject(); SELECT @ polygon.STContains (@point) ' – Braydie

+2

Vous allez aimer ceci: La méthode' POINT() 'prend les arguments dans l'ordre inverse de la WKT que vous fournissez pour le polygone! C'est-à-dire, comme vous l'avez défini, vous avez changé la latitude et la longitude. Vérifiez 'SELECT @ polygon.STPointN (1). [Lat], @point. [Lat]' –

+0

Ah wow, je n'aurais jamais trouvé ça! Merci encore! J'ai inversé l'ordre de mes coordonnées dans le ctor of the Point, mais semble toujours obtenir zéro ... Mon cerveau est un peu fuzzed maintenant, mais je ne pense pas que c'est correct ..? – Braydie