web-dev-qa-db-fra.com

MSSQL Geography STIntersects renvoie 1 lorsque 0 est attendu

Je rencontre un problème de géographie MSSQL que je ne peux pas expliquer. Supposons que je suis confronté à des difficultés mathématiques, mais il semble que le point suivant ne doit PAS intersecter le polygone suivant:

DECLARE @t_point geography;  
DECLARE @t_polygon geography;
set @t_polygon = geography::STPolyFromText('POLYGON((1 1, 5 5, 5 0, 1 1))', 4326);
set @t_point = geography::Point(0, 0, 4326);


select
  @t_polygon.STAsText(), 
  @t_point.STAsText(),
  @t_point.STIntersects(@t_polygon), 
  @t_polygon.STIntersects(@t_point);

Cependant, lorsque j'exécute cela, j'obtiens le résultat suivant:

POLYGON ((1 1, 5 5, 5 0, 1 1))  POINT (0 0) 1   1

Les deux dernières colonnes sont toutes les deux 1 où je m'attendrais à 0. Comment un point dans l'espace à 0,0 peut-il intersecter avec un polygone qui ne touche pas ou n'englobe pas 0,0?

-1, -1 a le même comportement que 100, 100.

Même si je change le point en polygone dans un espace complètement différent, MSSQL dit qu'ils se croisent.

set @t_polygon = geography::STPolyFromText('POLYGON((10 10, 50 50, 50 10, 10 10))', 4326);
set @t_point = geography::STPolyFromText('POLYGON((1 1, 5 5, 5 0, 1 1))', 4326);

J'ai également essayé STGeomFromText ().

Je suis sûr que je dois faire quelque chose de mal, mais je ne peux pas imaginer ce que cela pourrait être.

6
Mike Forget

La raison pour laquelle vous rencontrez un problème est que le polygone est enroulé dans le mauvais sens, ce qui entraîne un polygone qui couvre le monde entier, sauf pour votre zone d'intérêt.

Essayer

DECLARE @t_point geography;  
DECLARE @t_polygon geography;
set @t_polygon = geography::STPolyFromText('POLYGON((1 1, 5 0, 5 5, 1 1))', 4326);
set @t_point = geography::Point(0, 0, 4326);

C'est un peu étrange, mais étant donné qu'avec les géographies, nous avons affaire à une sphère, il doit y avoir un moyen de déterminer de quel côté de la frontière se trouve l'intérieur du polygone. Avec SQL Server, cela se fait en définissant la limite extérieure comme anti-horaire.

Les géométries ne se soucient pas de la façon dont elles sont enroulées, mais préfèrent dans le sens inverse des aiguilles d'une montre. Il existe une fonction pour les géographies ReorientObject qui modifient la direction de l'objet.

9
MickyT