Wählen Sie einige Koordinaten aus einer großen Menge von Koordinaten aus, die gleichmäßig über die Fläche verteilt zu sein scheinen
P粉262113569
P粉262113569 2024-02-26 16:23:02
0
1
348

Ich habe eine MySQL-Tabelle mit den Spalten „Region“ und „Breitengrad/Längengrad“. In jedem Gebiet gibt es viele Orte, wie zum Beispiel 20.000。有没有办法只选择几个,比如 100, die scheinbar gleichmäßig auf der Karte verteilt sind?

Die Verteilung muss nicht perfekt sein, die Abfragegeschwindigkeit ist wichtiger. Sollte dies mit MySQL nicht direkt möglich sein, kann ein sehr schneller Algorithmus verwendet werden, um gleichmäßig verteilte Standorte auszuwählen.

Vielen Dank im Voraus.

EDIT: Beantwortung einiger Anfragen in den Kommentaren. Die Daten haben nichts, mit dem man arbeiten kann, es sind lediglich die Gebiets- und Standortkoordinaten, zum Beispiel:

+-------+--------------+----------+-----------+------------+--------+--------+
| 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  |
+-------+--------------+----------+-----------+------------+--------+--------+

Es gibt auch einige Spalten mit Merkmalen, diese dienen jedoch nur der Filterung.

Ich habe versucht, beide nth Reihen zu bekommen und es scheint zu funktionieren, wenn auch etwas langsam

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

Die Verwendung von random() funktioniert auch, ist aber etwas langsam.

EDIT 2: Es stellt sich heraus, dass das Hinzufügen von Postleitzahlen zu einem Formular einfach ist. Dabei scheint die Gruppierung nach Postleitzahl ein erfreuliches Ergebnis zu liefern. Das einzige Problem ist, dass es sehr große Gebiete gibt, etwa 3000 verschiedene Postleitzahlen, und wenn man nur 100 davon hat, kann es sein, dass viele von ihnen an einem Ort angezeigt werden, sodass möglicherweise eine weitere Verarbeitung in PHP erforderlich ist.

Bearbeiten3, beantworte die Fragen von @RickJames in den Kommentaren, damit sie an einem Ort sind:

  1. Bitte definieren Sie „gleichmäßige Verteilung“ – gleichmäßige Verteilung im Breitengrad? Sind zwei Menschen nicht „nahe“ beieinander? USW.
    • „Gleichmäßig verteilt“ ist eine schlechte Wortwahl. Wir wollten nur einige Standorte in der Umgebung zeigen, aber nicht alle an einem Ort
  2. Ist die „Fläche“ ein Rechteck? Hexagon? Oder Gerrymandering?
    • Man kann sie sich grob als Rechtecke vorstellen, aber das spielt keine Rolle. Ich habe das Wichtige übersehen: Wir müssen auch den Standort mehrerer Regionen anzeigen. Regionen können weit voneinander entfernt oder benachbart sein (aber nicht überlappend). In diesem Fall möchten wir 100 Proben auf verschiedene Regionen verteilen.
  3. Ist „100 pro Region“ festgelegt? Oder es könnte „ungefähr 100“ sein
    • Es ist nicht behoben, es sind ungefähr 100, aber wenn es nicht gut aussieht, können wir es ändern
  4. Ist eine AUTO_INCRMENT-ID auf dem Tisch? Gibt es einen zahlenmäßigen Unterschied?
    • Ja, es gibt einen AUTO_INCRMENT Ausweis und es kann Lücken geben
  5. Hat sich die Frage von „100 pro Region“ auf „1 pro Postleitzahl“ geändert?
    • Nein, das Problem ist immer noch das gleiche: „Zeige 100 von jedem Bereich, aber nicht alle am selben Ort“, egal wie es gemacht wird
  6. Wie hoch ist die Gesamtzahl der Zeilen und die erforderliche Anzahl der Zeilen in der Ausgabe?
    • Die Gesamtzahl der Zeilen hängt von der Region und dem Standard ab, bis zu 40.000 für eine Region. Wenn die Gesamtsumme mehr als 1000,我们希望仅显示随机的 100。如果 1000 oder weniger beträgt, können wir einfach alles anzeigen
  7. Benötige ich jedes Mal ein anderes Beispiel, wenn ich die Abfrage ausführe?
    • Die gleiche Probe oder verschiedene Proben (auch mit dem gleichen Standard) sind in Ordnung
  8. Möchten Sie der Tabelle eine Spalte hinzufügen?
    • Es liegt nicht an mir, aber wenn ich ein gutes Argument habe, können wir wahrscheinlich eine neue Kolumne hinzufügen

P粉262113569
P粉262113569

Antworte allen(1)
P粉982054449

这是一种可以满足目标的方法。

  1. 对表格进行预处理,创建一个新表格,以删除“重复”的项目。
  2. 如果新表足够小,对其进行完整扫描可能会足够快。

至于“重复项”,请将此视为发现两个项目落在同一位置的粗略方法:

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

“5”和“3”可以向上(或向下)调整,以保留更多(或更少)的 id。由于纬度/经度的排列方式,“5”和“3”是不同的;这个比例可能适用于大多数温带地区。 (在赤道附近使用相同的数量,在更高纬度使用更大的配给。)

有一个小缺陷...两个非常接近的项目可能会跨越由 ROUNDs 创建的边界。

原表有多少行?上述查询生成了多少行? ( SELECT COUNT(*) FROM ( ... ) x; )

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!