Sélectionnez certaines coordonnées parmi un grand ensemble de coordonnées qui semblent être uniformément réparties sur la zone.
P粉262113569
P粉262113569 2024-02-26 16:23:02
0
1
357

J'ai une table MySQL avec des colonnes de région et de localisation latitude/longitude. Chaque zone comporte de nombreux emplacements, tels que 20.000。有没有办法只选择几个,比如 100, qui semblent être répartis uniformément sur la carte ?

La distribution ne doit pas nécessairement être parfaite, la vitesse des requêtes est plus importante. Si cela n'est pas possible en utilisant directement MySQL, un algorithme très rapide peut être utilisé pour sélectionner des emplacements uniformément répartis.

Merci d'avance.

EDIT : Je réponds à certaines demandes dans les commentaires. Les données n'ont rien avec quoi travailler, ce sont juste les coordonnées de la zone et de l'emplacement, par exemple :

+-------+--------------+----------+-----------+------------+--------+--------+
| id    | area         | postcode | lat       | lon        | colour | size   |
+-------+--------------+----------+-----------+------------+--------+--------+
| 16895 | Athens       |    10431 | 37.983917 | 23.7293599 | red    | big    |
| 16995 | Athens       |    11523 | 37.883917 | 23.8293599 | green  | medium |
| 16996 | Athens       |    10432 | 37.783917 | 23.7293599 | yellow | small  |
| 17000 | Thessaloniki |    54453 | 40.783917 | 22.7293599 | green  | small  |
+-------+--------------+----------+-----------+------------+--------+--------+

Il existe également des colonnes avec des caractéristiques, mais celles-ci ne sont utilisées que pour le filtrage.

J'ai essayé d'obtenir les deux lignes nth et cela semble fonctionner, bien qu'un peu lent

SET @a = 0;
select * from `locations` where (@a := @a + 1) % 200 = 0

Utiliser random() fonctionne également, mais c'est un peu lent.

EDIT 2 : Il s'avère que l'ajout de codes postaux sur un formulaire est facile. Avec cela, le regroupement par code postal semble donner un résultat satisfaisant. Le seul problème est qu'il existe de très grandes zones, environ 3 000 codes postaux différents, et en obtenir seulement 100 pourrait aboutir à ce que beaucoup d'entre eux apparaissent au même endroit, ce qui pourrait nécessiter un traitement supplémentaire en PHP.

Edit3, répondez aux questions de @RickJames dans les commentaires pour qu'elles soient au même endroit :

  1. Veuillez définir « distribution uniforme » – distribution uniforme en latitude ? Deux personnes ne sont-elles pas « proches » l’une de l’autre ? ETC.
    • « Uniformément réparti » est un mauvais choix de mots. Nous voulions juste montrer certains endroits de la région, mais pas tous au même endroit
  2. La « zone » est-elle un rectangle ? hexagone? Ou du gerrymandering ?
    • Ils peuvent être grossièrement considérés comme des rectangles, mais cela n'a pas vraiment d'importance. J'ai raté l'important, nous devons également montrer l'emplacement de plusieurs régions. Les régions peuvent être éloignées les unes des autres ou adjacentes (mais sans se chevaucher). Dans ce cas, nous souhaitons distribuer 100 échantillons dans différentes régions.
  3. Est-ce que « 100 par région » est fixe ? Ou cela pourrait être "environ 100"
    • Ce n'est pas fixe, c'est environ 100, mais si ça ne semble pas bon, nous pouvons le changer
  4. Y a-t-il un identifiant AUTO_INCRMENT sur la table ? Y a-t-il une différence de chiffres ?
    • Oui, il existe un AUTO_INCRMENT identifiant et il peut y avoir des lacunes
  5. La question est-elle passée de « 100 par région » à « 1 par code postal » ?
    • Non, le problème est toujours le même, "afficher 100 de chaque zone, mais pas tous au même endroit", peu importe comment c'est fait
  6. Quel est le nombre total de lignes et le nombre requis de lignes dans la sortie ?
    • Le nombre total de lignes dépend de la région et de la norme, jusqu'à 40 000 pour une région. Si le total est supérieur à 1000,我们希望仅显示随机的 100。如果 1000 ou inférieur, nous pouvons simplement tout montrer
  7. Ai-je besoin d'un exemple différent à chaque fois que j'exécute la requête ?
    • Le même échantillon ou des échantillons différents (même avec le même standard) sont OK
  8. Voulez-vous ajouter une colonne au tableau ?
    • Cela ne dépend pas de moi, mais si j'ai un bon argument alors nous pourrons probablement ajouter une nouvelle colonne

P粉262113569
P粉262113569

répondre à tous(1)
P粉982054449

C'est une façon qui peut atteindre vos objectifs.

  1. Pré-traitez le tableau et créez un nouveau tableau pour supprimer les éléments « en double ».
  2. Si la nouvelle table est suffisamment petite, une analyse complète de celle-ci peut être assez rapide.

En ce qui concerne les « doublons », considérez-les comme un moyen approximatif de repérer deux éléments tombant au même endroit :

SELECT  ROUND(latitude * 5),
         ROUND(longitude * 3),
         MIN(id) AS id_to_keep
     FROM tbl
     GROUP BY 1,2

"5" et "3" peuvent être ajustés vers le haut (ou vers le bas) pour conserver plus (ou moins) d'identifiants. En raison de la disposition latitude/longitude, « 5 » et « 3 » sont différents ; ce rapport est probablement vrai pour la plupart des régions tempérées. (Utilisez les mêmes quantités près de l'équateur, utilisez des rations plus importantes aux latitudes plus élevées.)

Il y a un petit défaut... deux éléments très proches peuvent franchir une frontière créée par ROUNDs.

Combien de lignes le tableau d'origine comporte-t-il ? Combien de lignes la requête ci-dessus a-t-elle générée ? ( SELECT COUNT(*) FROM ( ... ) x; )

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal