IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[SQL2K8][GIS] Vérifier qu'un point est dans un polygone géographique


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut [SQL2K8][GIS] Vérifier qu'un point est dans un polygone géographique
    Bonjour,

    Je cherche à vérifier qu'un point, de type GEOGRAPHY, est situé ou non dans l'aire définie par un polygone, de type GEOGRAPHY également.

    Cela est possible avec le type GEOMETRY, car il implémente la méthode STContains, mais je ne vois pas comment le faire pour le type GEOGRAPHY.

    En effet, même en créant les lignes (LINESTRING) qui relient la position aux points qui définissent le polygone pour vérifier que les lignes coupent le polygone à l'aide de la méthode STIntersects.
    Or, si la position est en dehors du polygone, les lignes coupent le polygone ...

    Passer par une moyenne des distances séparant la position des points définissant le polygone me semble complexe et hasardeux, et j'ai besoin d'une vitesse de calcul quasi-temps réel ...

    Merci de votre aide

    @++

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Et si vous respectiez la charte de postage en nous postant le DDL de vos tables, ainsi qu'un exemple avec un jeu d'essais !!!!

    hein! ;-)
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    OK, je prends mon 0

    J'ai donc relevé 4 points à l'aide de Google Earth qui sont à proximité des angles de la place du Capitole pour créer mon polygone comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @g GEOGRAPHY
     
    SET @g = GEOGRAPHY::STGeomFromText
    		(
    			'POLYGON
    			(
    				(43.604832 1.442787,43.60492 1.443754,43.603922 1.443987,43.603823 1.443028,43.604832 1.442787)
    			)',
    			4326
    		);
    Ensuite j'ai également relevé un point sur la Croix du Languedoc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE @pCroix GEOGRAPHY
    SET @pCroix = GEOGRAPHY::Point(43.604386,1.443304, 4326)
    Et un point dans l'hôtel de ville, qui est donc en dehors de la place du Capitole :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE @pHotelDeVille GEOGRAPHY
    SET @pHotelDeVille = GEOGRAPHY::Point(43.604526,1.444323, 4326)
    Évidemment, comme un polygone n'est pas une surface, si nous exécutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @g.STIntersects(@pCroix)
    Nous obtenons 0.

    J'en suis donc venu à penser qu'avec les lignes que l'on peut construire, toujours avec le type GEOGRAPHY, entre le point et les points qui définissent le polygone, je pourrai vérifier que le point est dans le polygone.
    Mais l'intersection fonctionnera également si le point de trouve en dehors du polygone.

    Les polygones ne seront pas des carrés comme on aurait pu le penser parce que j'ai pris pour exemple la place du Capitole, sinon on aurait pu trouver assez facilement une solution.

    En revanche, le type GEOMETRY implémente une méthode STContains qui permet de savoir si une instance du type GEOMETRY est contenue dans une autre instance du type GEOMETRY.
    Dommage qu'elle n'ait pas d'équivalent dans le type GEOGRAPHY...

    @++

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    CREATE TABLE T (Nom VARCHAR(8) PRIMARY KEY NOT NULL,
                      G GEOGRAPHY)
     
     INSERT INTO T VALUES ('Capitole', GEOGRAPHY::STGeomFromText
    		(
    			'POLYGON
    			(
    				(43.604832 1.442787,43.60492 1.443754,43.603922 1.443987,43.603823 1.443028,43.604832 1.442787)
    			)',
    			4326
    		));
     
     
    INSERT INTO T VALUES ('Croix', GEOGRAPHY::Point(1.443304, 43.604386, 4326));
     
     
    INSERT INTO T VALUES ('HotelDV', GEOGRAPHY::Point(1.444323, 43.604526, 4326));
     
    SELECT * FROM T
     
    SELECT CAST(T1.G.STIntersection(T2.G) AS VARCHAR(max))
    FROM   T AS T1
           CROSS JOIN T AS T2
    WHERE  T1.Nom = 'Capitole'
      AND  T2.Nom = 'Croix'   
     
     
    SELECT CAST(T1.G.STIntersection(T2.G) AS VARCHAR(max))
    FROM   T AS T1
           CROSS JOIN T AS T2
    WHERE  T1.Nom = 'Capitole'
      AND  T2.Nom = 'HotelDV'
    Tu as inversé les coordonnées des points qui "tournent" dans le sens inverse des multipolygones !!!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    J'ai conservé le même sens que pour les polygones, latitude puis longitude pour définir le point, et je me suis fait avoir ...

    Merci

    @++

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Entre nous, c'est un piège à c....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [3D] Comment savoir si un point est dans mon champ de vision
    Par patmaba dans le forum Développement 2D, 3D et Jeux
    Réponses: 10
    Dernier message: 04/11/2018, 13h20
  2. [JavaScript] [Google Maps]Tester si un point est dans un Polygone
    Par NoSmoking dans le forum Contribuez
    Réponses: 1
    Dernier message: 08/08/2011, 17h48
  3. Savoir si un point est dans un polygone.
    Par poly128 dans le forum Langage
    Réponses: 8
    Dernier message: 18/11/2008, 09h34
  4. Trouver si un point est dans un polygone
    Par Mucho dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 15/09/2006, 17h36
  5. vérifier si un scalaire est dans une un tableau
    Par STEPH69000 dans le forum Langage
    Réponses: 6
    Dernier message: 04/06/2006, 17h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo