cari

Rumah  >  Soal Jawab  >  teks badan

Pilih beberapa koordinat daripada set koordinat yang besar yang nampaknya diagihkan sama rata di kawasan tersebut

Saya mempunyai jadual MySQL dengan lajur lokasi wilayah dan latitud/longitud. Setiap kawasan mempunyai banyak lokasi, seperti 20.000。有没有办法只选择几个,比如 100, yang kelihatan sekata pada peta?

Pengedaran tidak semestinya sempurna, kelajuan pertanyaan adalah lebih penting. Jika ini tidak dapat dilakukan menggunakan MySQL secara langsung, algoritma yang sangat pantas boleh digunakan untuk memilih lokasi teragih sama rata.

Terima kasih terlebih dahulu.

EDIT: Menjawab beberapa permintaan dalam ulasan. Data tidak mempunyai apa-apa untuk digunakan, ia hanya koordinat kawasan dan lokasi, sebagai contoh:

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

Terdapat juga beberapa lajur dengan ciri, tetapi ini hanya digunakan untuk penapisan.

Saya cuba mendapatkan kedua-dua baris nth dan nampaknya berkesan, walaupun agak perlahan

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

Menggunakan random() juga berfungsi, tetapi ia agak perlahan.

EDIT 2: Ternyata menambah kod zip pada borang adalah mudah. Dengan ini, pengumpulan mengikut kod zip nampaknya memberikan hasil yang menggembirakan. Satu-satunya masalah ialah, terdapat kawasan yang sangat besar, sekitar 3000 poskod yang berbeza, dan hanya mendapat 100 daripadanya mungkin berakhir dengan banyak daripadanya muncul di satu tempat, jadi yang mungkin memerlukan pemprosesan lanjut dalam PHP.

Edit3, jawab soalan @RickJames dalam ulasan supaya mereka berada di satu tempat:

  1. Sila takrifkan "taburan seragam" - taburan seragam dalam latitud? Bukankah dua orang "dekat" antara satu sama lain? DAN LAIN-LAIN.
    • “Teragih sama rata” ialah pilihan perkataan yang kurang baik. Kami hanya mahu menunjukkan beberapa lokasi di kawasan itu, tetapi bukan semua di satu tempat
  2. Adakah "kawasan" itu adalah segi empat tepat? heksagon? Atau gerrymandering?
    • Ia boleh dianggap secara kasar sebagai segi empat tepat, tetapi itu tidak begitu penting. Saya terlepas perkara penting, kita juga perlu menunjukkan lokasi berbilang wilayah. Kawasan mungkin berjauhan antara satu sama lain atau bersebelahan (tetapi tidak bertindih). Dalam kes ini, kami ingin mengedarkan 100 sampel ke pelbagai wilayah.
  3. Adakah "100 setiap wilayah" ditetapkan? Atau boleh jadi "kira-kira 100"
    • Bukan tetap, lebih kurang 100, tapi kalau nampak tak elok kita boleh ubah
  4. Adakah id AUTO_INCRMENT di atas meja? Adakah terdapat perbezaan dalam nombor?
    • Ya, ada AUTO_INCRMENT id dan mungkin ada jurang
  5. Adakah soalan berubah daripada "100 setiap wilayah" kepada "1 setiap poskod"?
    • Tidak, masalahnya masih sama, "tunjukkan 100 setiap kawasan, tetapi tidak semua di lokasi yang sama", tidak kira bagaimana ia dilakukan
  6. Apakah jumlah bilangan baris dan bilangan baris yang diperlukan dalam output?
    • Jumlah bilangan baris bergantung pada rantau dan standard, sehingga 40k untuk satu rantau. Jika jumlahnya lebih daripada 1000,我们希望仅显示随机的 100。如果 1000 atau kurang, kita boleh tunjukkan semuanya
  7. Adakah saya memerlukan contoh yang berbeza setiap kali saya menjalankan pertanyaan?
    • Sampel yang sama atau sampel yang berbeza (walaupun dengan standard yang sama) adalah OK
  8. Adakah anda ingin menambah lajur pada jadual?
    • Ia bukan terpulang kepada saya, tetapi jika saya mempunyai hujah yang baik maka kita mungkin boleh menambah lajur baharu

P粉262113569P粉262113569274 hari yang lalu363

membalas semua(1)saya akan balas

  • P粉982054449

    P粉9820544492024-02-27 00:20:37

    Ini adalah cara yang boleh memenuhi matlamat anda.

    1. Praproses jadual dan buat jadual baharu untuk mengalih keluar item "pendua".
    2. Jika meja baru cukup kecil, imbasan penuh mungkin cukup pantas.

    Bagi "pendua", anggap ini sebagai cara kasar untuk melihat dua item jatuh ke tempat yang sama:

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

    "5" dan "3" boleh dilaraskan ke atas (atau ke bawah) untuk mengekalkan lebih banyak (atau kurang) id. Oleh kerana susunan latitud/longitud, "5" dan "3" adalah berbeza; (Gunakan jumlah yang sama berhampiran khatulistiwa, gunakan catuan yang lebih besar di latitud yang lebih tinggi.)

    Ada kecacatan kecil...dua item yang sangat rapat mungkin melintasi sempadan yang dicipta oleh ROUNDs.

    Berapa banyak baris jadual asal? Berapakah bilangan baris yang dijana oleh pertanyaan di atas? ( SELECT COUNT(*) FROM ( ... ) x; )

    balas
    0
  • Batalbalas