我有一個包含區域和緯度/經度位置列的 MySQL 表。每個區域都有許多位置,例如20.000
。有沒有辦法只選幾個,像是 100
,看起來在地圖上分佈得比較均勻?
分佈不一定要完美,查詢速度更重要。如果直接使用 MySQL 無法做到這一點,則可以使用非常快速的演算法來選擇均勻分佈的位置。
提前致謝。
編輯:回答評論中的一些請求。資料沒有任何可以使用的東西,它只是面積和位置座標,例如:
+-------+--------------+----------+-----------+------------+--------+--------+ | 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 | +-------+--------------+----------+-----------+------------+--------+--------+
還有一些具有特徵的列,但這些列僅用於過濾。
我確實嘗試同時獲取 nth
行,它似乎可以工作,儘管有點慢
SET @a = 0; select * from `locations` where (@a := @a + 1) % 200 = 0
使用 random()
也可以,但也有點慢。
編輯2:事實證明,在表格上新增郵遞區號很容易。有了這個,按郵遞區號分組似乎給出了一個賞心悅目的結果。唯一的問題是,有非常大的區域,大約有 3000 個不同的郵政編碼,而僅獲取 100 個可能最終會導致其中許多顯示在一個地方,因此可能需要在 PHP 中進一步處理。
Edit3,在評論中回答@RickJames 的問題,以便它們位於一個位置:
AUTO_INCRMENT
id 並且可以有間隙1000
,我們希望只顯示隨機的 100
。如果 1000
或更少,我們可以只顯示所有內容
這是一種可以滿足目標的方法。
至於“重複項”,請將此視為發現兩個項目落在同一位置的粗略方法:
“5”和“3”可以向上(或向下)調整,以保留更多(或更少)的 id。由於緯度/經度的排列方式,「5」和「3」是不同的;這個比例可能適用於大多數溫帶地區。 (在赤道附近使用相同的數量,在更高緯度使用更大的配給。)
有一個小缺陷...兩個非常接近的項目可能會跨越由
ROUNDs
創建的邊界。原表有多少行?上述查詢產生了多少行? (
SELECT COUNT(*) FROM ( ... ) x;
)