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 :

[MySQL 5] Selection spéciale selon les coordonnées d'une liste de points


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut [MySQL 5] Selection spéciale selon les coordonnées d'une liste de points
    Bonjour,

    Je reviens vers vous cette fois pour soumettre le cas d'une situation très tordue qui me donne du fil à retordre depuis pas mal de temps.

    J'ai pour projet de créer une table dans laquelle seront inscrit des objets primitifs cartographiques (lignes, zones, points) tous définis par une liste de points (entres autres) se présentant sous la forme suivante : x1,y1;x2,y2;x3,y3... ou x représente une latitude et y la longitude.

    Maintenant, et ce sera le mode le plus courant de sélection sur la table, j'aimerai sortir uniquement les objets ayant au moins un point dans un rectangle défini par Xmin, Xmax, Ymin et YMax.
    Le problème est qu'il va donc falloir faire des comparaisons sur les coordonnées des points de la liste de chaque objet pour déterminer si l'enregistrement correspond à la contrainte ou non et que la liste se présente de la manière donnée ci-dessus. Pas pratique!

    Les mauvaises nouvelles sont au nombre de deux :
    1 - Je ne peux pas télécharger la liste de tous mes objets pour les tester sur serveur : avec quelques centaines de milliers d'enregistrements, on fait sauter la banque.
    2 - Je ne peux pas décider de créer un table avec des points d'un coté et une jointure avec une autre table stockant les objets (sur un champ contenant les ID des points contenus dans l'objet).
    Pour les bonnes, c'est suivant vos réponses

    Comment feriez-vous donc?
    Merci par avance pour vos réponses et votre perspicacité...

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Si je comprends bien, il y aurait 2 tables : figures{id,forme} et points{id_figure,X,Y}
    et il faudrait déterminer dans figures celles qui ont au moins un point compris dans le rectangle dont tu ne fournis que les coordonnées du coin bas gauche et coin haut droit.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id, forme
    FROM figures f
    WHERE EXISTS(SELECT *
    FROM points
    WHERE id_figure= f.id
    AND X BETWEEN Xmin AND Xmax
    AND Y BETWEEN Ymin AND Ymax)
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    A la réflexion, c'est beaucoup plus complexe que ça et, selon moi, pas réalisable en SQL.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    Bonsoir Maljuna Kris

    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    Si je comprends bien, il y aurait 2 tables : figures{id,forme} et points{id_figure,X,Y}
    Non, il n'y a qu'une seule table avec un champ contenant une liste de points sous la forme d'une chaine comme celle-ci : x1,y2;x2,y2;x3,y3... ou x,y sont des paires longitude,latitude.

    Il faudrait que je sache si, dans cette liste de point, au moins une paire x,y rentre dans une zone définie par un rectangle Xmin, Xmax, Ymin et Ymax pour sortir ou non l'enregistrement concerné dans les résultats de la requête.

    A la réflexion, c'est beaucoup plus complexe que ça et, selon moi, pas réalisable en SQL.
    Voila qui est dommage.
    Comment faire alors (en évitant à tout pris la liste de points d'un coté et la liste d'objets de l'autre...)?

    Merci de ta réponse.

  5. #5
    Membre Expert
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Par défaut
    Si la liste n'est pas de taille fixe (et même là ce serait une horreur), je ne voit rien à faire en SQL.

    A la limite, il y a moyen de définir une fonction qui prend le rectangle et la chaine de caractères et fait le test. Là il y aura moyen de faire une boucle pour décoder la chaine. Mais ça va pas être terrible en termes de performances.

    Quelques centaines de milliers d'enregistrements, ce n'est pas incommensurable. Surtout que s'il y a tant de données que ça, traiter les chaines de caractère pour tous les objets va faire très mal. Ça me semble un cas tout trouvé pour les fonctionnalités GIS. Surtout que ça permettrait de bénéficier d'index spatiaux, ce genre de requête en a grand besoin.

  6. #6
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 253
    Par défaut
    Citation Envoyé par Sivrît Voir le message
    Si la liste n'est pas de taille fixe (et même là ce serait une horreur), je ne voit rien à faire en SQL.
    Oui, en effet j'ai bien conscience que ma structure n'est pas optimale. Mais sérieusement je ne vois pas d'autre solution satisfaisante.
    Sur le plan des deux tables, il serai faisable de faire une liste de points uniquement rattachés à un seul enregistrement de la liste des objets (ce qui evite toute sorte de contraintes si les points pouvaient etre commun à deux reccords).
    Mais cela ne résoud pas le probleme de la liste qui serait stockée toujours sous la forme index1,index2,index3... avec index l'index du point correspondant.

    A la limite, il y a moyen de définir une fonction qui prend le rectangle et la chaine de caractères et fait le test. Là il y aura moyen de faire une boucle pour décoder la chaine. Mais ça va pas être terrible en termes de performances.
    C'est exactement je ce que je suis entrain de tester
    On verra ce que donne la mise en charge.

    Quelques centaines de milliers d'enregistrements, ce n'est pas incommensurable. Surtout que s'il y a tant de données que ça, traiter les chaines de caractère pour tous les objets va faire très mal. Ça me semble un cas tout trouvé pour les fonctionnalités GIS. Surtout que ça permettrait de bénéficier d'index spatiaux, ce genre de requête en a grand besoin.
    Parfais ça.
    Cependant je suis sous hébergement mutalisé et j'aimerai, si possible, y developper mon systeme de sorte qu'il soit compatible sur un large ensemble de configurations (en termes de performances). Mon SGBD est sous MySQL et je vais regarder si il prend en charge ce genre de choses.

    [Edit]
    Je n'arrive pas à voir si le MySQL installé chez 1and1 le supporte.
    Le serveur est sous MySQL 5.0.81 et je stocke avec MyISAM. J'ai cru comprendre que ces fonctionnalités géospatiales étaient supportées nativement depuis MySQL 5.0.16. Est-ce vraiement le cas?
    [/Edit]

    Merci des conseils.

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Je travaille sur une application qui est confrontée à ce genre de problème et de structure. Celui qui l'a développée a traité ces cas en PHP.
    1) Extraction de la chaîne contenant les coordonnées des points du polygone
    2) Algorithmes en PHP pour les fonctions du genre "le point cliqué sur la carte fait-il partie du polygone"

    PHP est très performant pour traiter des chaînes de caractères, MySQL beaucoup moins, ce n'est pas son boulot.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. [XL-2010] Et la boucle est difficile à écrire! (executer un code selon les valeurs d'une liste)
    Par Mikayel dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/12/2014, 13h31
  2. Réponses: 18
    Dernier message: 09/12/2010, 20h40
  3. Déterminer les coordonnées d'une image
    Par blaise4714 dans le forum Images
    Réponses: 2
    Dernier message: 27/11/2006, 19h05
  4. Réponses: 12
    Dernier message: 02/05/2006, 19h37
  5. bouger une div selon les coordonnées de la souris
    Par 10-nice dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 21/09/2005, 15h31

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