Mysql

通過 MySQL 在半徑範圍內獲取拉鍊的問題

  • January 22, 2019

我有一張郵政編碼表,其中包括每個郵政編碼的中心緯度和 lng。我用它從任意點獲取給定英里半徑內的郵政編碼列表。

我突然想到,僅僅因為拉鍊的中心點不在給定的半徑內,並不意味著拉鍊本身不在半徑內。

我在這裡用我超高級的美術技巧來說明這一點:

在此處輸入圖像描述

  • 綠色條紋斑點代表郵政編碼 A、B 和 C。
  • 紅色污點是每個郵政編碼的地理中心
  • 紫紅色點是目標位置,並且..
  • 塊狀藍色圓圈距離目標位置 1 英里半徑

如果我對粉紅色污跡半徑 1 英里範圍內的所有郵政編碼執行查詢,則僅返回郵政編碼 B 和 C,因為 zip A 的中心點不在一英里半徑範圍內,即使粉紅色污跡本身顯然在郵政編碼 A 中。

SELECT *,
       p.distance_unit
                * DEGREES(ACOS(COS(RADIANS(p.latpoint))
                * COS(RADIANS(z.y))
                * COS(RADIANS(p.longpoint) - RADIANS(z.x))
                + SIN(RADIANS(p.latpoint))
                * SIN(RADIANS(z.y)))) AS dist
 FROM standard_zip AS z
 JOIN (   /* these are the query parameters */
       SELECT  $lat  AS latpoint,  $lng AS longpoint,
               $miles AS radius,      69 AS distance_unit
   ) AS p ON 1=1
 WHERE z.y
    BETWEEN p.latpoint  - (p.radius / p.distance_unit)
        AND p.latpoint  + (p.radius / p.distance_unit)
   AND z.x
    BETWEEN p.longpoint - (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
        AND p.longpoint + (p.radius / (p.distance_unit * COS(RADIANS(p.latpoint))))
 ORDER BY dist

我該怎麼寫一個在結果中包含 zip A 的查詢?

如果需要,我可以訪問可以添加到表中的每個郵政編碼的空間/幾何,但我不知道如何在 MySQL 中將其用於此目的。


編輯:我花了一天時間閱讀有關空間數據的 Oracle 和 MySQL 文件,並成功地將我的空間數據轉換為 MySQL。如何編寫一個使用幾何列而不是緯度和經度的類似查詢?我正在使用 2D 數據..幾何只是多邊形和多面體..

我想我有點想通了。。

select
 *
from
 (
   select
     MIN(st_distance(geom, POINT(-82.765136, 28.0914015))) * 69 as miles,
     zip
   from
     zip_spatial
   group by
     zip
   order by
     miles asc
 ) d
where
 d.miles < 5

如果有人有更好、更有效的解決方案,我將暫時開放賞金。

來自Oracle® Spatial Developer’s Guide 11g Release 2 (11.2) 中的Indexing and Querying Spatial Data in Oracle :

查詢空間數據

Spatial 使用具有主過濾器和輔助過濾器操作的兩層查詢模型來解決空間查詢和空間連接。術語兩層表示執行兩個不同的操作來解析查詢。如果兩個操作都執行,則返回準確的結果集。

如果在該表上定義了空間索引,則不能將數據庫連結 (dblink) 名稱附加到查詢中的空間表名稱。

空間查詢

在空間 R-tree 索引中,每個幾何都由其最小邊界矩形 (MBR) 表示。考慮以下包含圖 1 中的幾個對象的層。每個對像都標有其幾何名稱(geom_1 表示線串,geom_2 表示四邊形多邊形,geom_3 表示三角形多邊形,geom_4 表示橢圓),每個對象周圍的 MBR 由虛線表示。

圖 1 帶有 MBR 的幾何圖形

“Figure1 Geometry with MBRs”的描述

典型的空間查詢是請求位於查詢視窗(即定義的柵欄或視窗)內的所有對象。動態查詢視窗是指在數據庫中沒有定義的矩形區域,但必須在使用前定義。圖 2 顯示了與圖 1 相同的幾何圖形,但添加了一個由粗虛線框表示的查詢視窗。

圖 2 帶有查詢視窗的圖層

“Figure2 Layer with a Query Window”的描述

在圖 2 中,查詢視窗覆蓋幾何 geom_1 和 geom_2 的部分,以及 geom_3 的 MBR 的一部分,但沒有實際的 geom_3 幾何。查詢視窗不涵蓋 geom_4 幾何或其 MBR 的任何部分。

初級過濾器運算符

SDO_FILTER 運算符實現了 Oracle Spatial 查詢處理模型中涉及的兩步過程的主要過濾器部分。主過濾器僅使用索引數據來確定一組候選對像對是否可以互動。具體來說,主過濾器檢查候選對象的 MBR 是否互動,而不是對象本身是否互動。SDO_FILTER 運算符語法如下:

SDO_FILTER(geometry1 SDO_GEOMETRY, geometry2 SDO_GEOMETRY, param VARCHAR2)

在前面的語法中:

  • geometry1 是表中 SDO_GEOMETRY 類型的列。此列必須進行空間索引。
  • geometry2 是 SDO_GEOMETRY 類型的對象。該對象可能來自也可能不來自表。如果它來自一個表,它可能會或可能不會被空間索引。
  • param 是 VARCHAR2 類型的可選字元串。它可以指定 min_resolution 和 max_resolution 關鍵字中的一個或兩個。

以下範例僅執行一次過濾操作(沒有二次過濾操作)。它們將返回圖 2 中顯示的所有幾何圖形,這些幾何圖形具有與查詢視窗互動的 MBR。以下範例的結果是幾何 geom_1、geom_2 和 geom_3。

Example1 執行主篩選操作,而不將查詢視窗插入到表中。視窗將在記憶體中建立索引,性能將非常好。

Example1帶有臨時查詢視窗的初級過濾器

SELECT A.Feature_ID FROM TARGET A  WHERE sdo_filter(A.shape, SDO_geometry(2003,NULL,NULL,
                                       SDO_elem_info_array(1,1003,3),
                                       SDO_ordinate_array(x1,y1, x2,y2))
                           ) = 'TRUE';   

在 Example1 中,(x1,y1) 和 (x2,y2) 是查詢視窗的左下角和右上角。

引用自:https://dba.stackexchange.com/questions/172289