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

Requêtes MySQL Discussion :

Problème avec MBRCCONTAINS


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Problème avec MBRCCONTAINS
    Bonjour,

    J'ai un souci avec la fonction MBRCONTAINS.

    J'ai des polygones dans ma base de donnée pour chaque ville française.
    Je voudrais savoir dans quelle ville se trouve un point.


    Voici un exemple de ma requete mysql:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT AsText(`SHAPE`),AREA(`SHAPE`),`nom_com` 
    FROM  `villes` 
    WHERE MBRCONTAINS(  `SHAPE` , GeomFromText(  'Point(  2.72502 48.461851)' ) )
    'SHAPE' contients tous les polygones des villes françaises.

    Le souci est que mysql me retourne deux villes ce qui n'est pas possible logiquement:


    Y'a t il une autre fonction pour trouver dans quel polygone est un point?



    Je cherche aussi à trouver un point dans des multipolygones.
    Le souci est que pour les multipolygones, à priori, la fonction retourne 1, alors que le point peut ne pas être à l'intérieur d'un des deux polygones:
    Exemple ou la fonction retourne 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set @mpoly = GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))');
    set @pnt = GeomFromText('POINT(5 10)');
    SELECT MBRContains(@mpoly, @pnt);

    D'avance merci de votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    vos deux polygones ne se recouperaient-il pas ?

    http://fr.wikipedia.org/wiki/Bois-le...eine-et-Marne)

    la réponse ...

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Malheureusement non.

    Mes polygones se touchent uniquement sur leurs côté.


    J'ai évidemment prit un point n'étant pas sur les limites du polygones mais bien à l'intérieur.
    J'ai fait plusieurs tests et à chaque fois j'ai deux ou trois villes.

  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 938
    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 938
    Points : 51 773
    Points
    51 773
    Billets dans le blog
    6
    Par défaut
    C'est normal. Vous n'utilisez pas la bonne fonction. MBRContains regarde si un point est situé dans le rectangle enveloppe de votre géométrie. Cela n'a rien à voir avec le fait qu'un point soit contenu à l'intérieur de l'enveloppe du polygone.
    Utilisez Contains !

    A +

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    J'ai testé avec Contain seulement mais ça me donne le même résultats.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set @mpoly = GeomFromText('MULTIPOLYGON(((0 0, 0 5, 5 5, 5 0, 0 0)), ((6 6, 6 11, 11 11, 11 6, 6 6)))');
    set @pnt = GeomFromText('POINT(5 10)');
    SELECT Contains(@mpoly, @pnt);
    Il me retourne toujours 1 alors que selon le dessin du premier post. il devrait être en dehors des deux polynômes.
    Je pense que la fonction regarde si le point est dans le rectangle qui regroupe les deux polynômes, non?

    N'y a t il pas une autre fonction permettant de savoir si un point est ou non dans un multipolygone?



    EDIT:
    Après plusieurs tests, il semble que les deux fonctions Contains et MBRContains prennent un carré (rouge) pour savoir si le point est situé dans le polygone (vert):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set @mpoly = GeomFromText('POLYGON((2 2, 9 6, 5 11, 1 4, 2 2))');
    set @pnt = GeomFromText('POINT(8 8)');
    SELECT Contains(@mpoly, @pnt);
    Me retourne 1 (idem avec MBRContains) alors que le point n'est pas dans mon polygone (voir capture ci dessous):

  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 938
    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 938
    Points : 51 773
    Points
    51 773
    Billets dans le blog
    6
    Par défaut
    Vous avez parfaitement raison... MySQL est inexploitable pour sa partie SIG.
    C'est une grosse merde (depuis le temps que je le répête !!!!). À lire : http://blog.developpez.com/sqlpro/?s...mit=Rechercher

    Je viens de vérifier sur la dernière version 5.2.40 revision 8790

    En comparaison, MS SQL Server donne de bons résultats !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @mpoly geometry, @pnt geometry
     
    SET @mpoly = 'POLYGON((2 2, 9 6, 5 11, 1 4, 2 2))';
    SET @pnt =   'POINT(8 8)';
    SELECT @mpoly.STContains(@pnt);
     
    -- vérification visuelle :
    SELECT @mpoly
    UNION ALL
    SELECT @pnt.STBuffer(0.2)
    http://www.developpez.net/forums/att...1&d=1338989145

    A +
    Images attachées Images attachées  

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Finalement j'ai trouvé une solution avec Mariadb qui est un clone de Mysql.
    J'ai utilisé la fonction ST_WITHIN qui permet de savoir si un point est dans un multipolygone.

    Fonctionne parfaitement.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 938
    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 938
    Points : 51 773
    Points
    51 773
    Billets dans le blog
    6
    Par défaut
    Attention, ST within ne marchera pas si l'objet touche le périmètre d'un polygone.

    A +

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juin 2012
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Es tu sur de toi?

    Car quand je teste cette requette pour un point situé sur le périmètre d'un carré, il me répond bien 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    SET @g2 = GeomFromText('Point(0 2)');
    SELECT ST_WITHIN(@g2,@g1);

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 938
    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 938
    Points : 51 773
    Points
    51 773
    Billets dans le blog
    6
    Par défaut
    Excuse moi. Pour un point c'est OK.

    A +

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 12h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 11h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 19h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 17h10

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