2011-06-29 14 views
0

Vous ne savez pas si c'est une question logique ou une question MySQL ... mais vous avez encore besoin d'aide.Instruction imbriquée MySQL pour les coordonnées géographiques

J'ai une liste de régions, avec des coordonnées dans chacune d'elles. La taille de la base de données est d'environ 115 Mo. Voici un échantillon des dossiers:

| PC1 | PC2 | CITY | PROV | AREACODE | LAT  |  LNG  | 
| A1A | 0B8 | ST. JOHNS | NL | 709 |47.5986880000|-52.7255210000| 
| A1A | 0B9 | ST. JOHNS | NL | 709 |47.5505750000|-52.7460720000| 

ainsi de suite, et ainsi de suite ...

Ce que je dois faire, est d'obtenir l'enregistrement dans chaque ville qui représente la latitude maximale et valeur de longitude , puis la latitude maximale et valeur de longitude minimale, puis l'enregistrement avec la valeur latitudinale minimale et valeur longitudinale minimale, puis l'enregistrement avec la valeur latitudinale minimale et la valeur longitudinale maximale.

Ce que j'ai commencé avec était:

SELECT MAX(lat), MAX(lng), MIN(lat), MIN(lng), city FROM places GROUP BY city 

Cela m'a donné un enregistrement par ville, avec les valeurs MAX/MIN Je lui demandais, mais ces min et max représentés requêtes individuelles pour la latitude minimum, maximum latitude, etc ... ce qui m'a donné une assez bonne estimation de la surface pour que je puisse dessiner un polygone sur une carte Google ... mais ce sont des carrés, et il y a beaucoup de chevauchement, et je sais que je peux faire mieux. Ces résultats représentent le MAXIMUM nord, sud, est, ouest de tout enregistrement dans le groupe d'enregistrements de la ville ..

Ce que je veux faire, c'est de rechercher un enregistrement qui h comme la valeur latitudinale max et max longitudinale, puis la valeur longitudinale maximale et min longitudinale, ... etc ..

Vous ne savez pas comment imbriquer ces instructions SQL ... J'ai essayé quelques instructions IN, mais toujours entraîné dans un enregistrement qui ne représentait pas tout à fait les valeurs max ou min.

Répondre

0

Pas sûr si je bien compris votre question, mais vous pouvez regarder dans la clause HAVING

SELECT lat, lng, city FROM places GROUP BY city HAVING lat=MAX(lat) 

ou UNION

(SELECT MAX(lat), MAX(lng), city FROM places GROUP BY city) 
UNION 
(SELECT MAX(lat), MIN(lng), city FROM places GROUP BY city) 

ou un mélange des deux

(SELECT MAX(lat), MAX(lng), city FROM places GROUP BY city HAVING lat=MAX(lat)) 
UNION 
(SELECT MAX(lat), MIN(lng), city FROM places GROUP BY city HAVING lng=MIN(lng)) 
+0

Pour décrire plus en détail la question: au lieu d'avoir quatre résultats, la valeur latitudinale maximale et longitudinale, et latitudinale minimale et longitudinale dans une série de coordonnées regroupées par ville .... Je veux quatre registres; la ville qui a la coordonnée latitudinale et longitudinale maximale, la ville qui a la coordonnée longitudinale maximale et longitudinale minimale, la ville qui a la coordonnée longitudinale minimale et la coordonnée longitudinale minimale et la ville qui a les coordonnées latitudinales minimales et latitudinales maximales. –

+0

Vous pouvez UNION autant de fois que vous le souhaitez. Vous devez jouer sur les coords et choisir un prévalent dans le cas où vous avez un positionnement rhomboïdal – Fabrizio

0

Ce que je veux faire, c'est rechercher un disque qui a s la latitudinale maximale et la valeur longitudinale maximale

Mais il n'y aura presque certainement pas d'enregistrement ayant à la fois le lat lat max et le max long. Quel est le résultat souhaité quand un endroit est plus au nord mais qu'un autre endroit est plus à l'est?

Êtes-vous à la recherche de l'endroit le plus au nord-est par ville? Dans ce cas:

SELECT * FROM places WHERE city='ST. JOHNS' 
ORDER BY MAX(lat+lng) DESC LIMIT 1; 

et de même avec MIN et/ou lat-lng pour les autres directions diagonales. Pour obtenir le plus au nord-est pour chaque ville, vous avez un problème de 'maximum par groupe', ce qui est un problème SQL courant.Voir par exemple this question pour la discussion. Un exemple de plus nord-lieu-par-ville:

SELECT p0.* 
FROM places AS p0 
LEFT JOIN places AS p1 ON p1.city=p0.city AND p1.lat+p1.lng>p0.lat+p0.lng 
WHERE p1.city IS NULL 

Cependant, ces requêtes d'ordre calculé sont unindexable si probablement inefficace à moins que vous ajoutez en fait une colonne indexée pour + lat lng.

Ensuite, vous avez le problème d'essayer de répondre aux quatre requêtes (les versions NE, SE, SW et NW) dans la même requête. La meilleure façon de résoudre ce problème est généralement de ne pas: Faire quatre requêtes distinctes. Généralement, les diverses contorsions que vous faites vous-même en essayant de presser les quatre opérations séparées en une seule requête vous laissent avec quelque chose de moins efficace et beaucoup moins lisible que quatre requêtes séparées. En tout cas, je ne vois pas vraiment où cela vous mène. Si vous essayez de dessiner un poly non rectangulaire minimal autour d'un ensemble de points de carte, vous devez sélectionner chaque point pour une ville et utiliser un convex hull algorithm ou un quadtree quelconque. Beaucoup trop impliqué pour le faire en SQL.

Questions connexes