簡體   English   中英

MySQL 8.0 ST_CONTAINS 返回多邊形外的記錄,並錯過多邊形內的記錄

[英]MySQL 8.0 ST_CONTAINS returns records outside polygon, and misses records within polygon

我在使用 mysql 的st_contains時遇到了差異。 我有一個區域表,其中包含latitudelongitude列,我只想查詢落在多邊形內的所有記錄。

當我這樣做時,mysql 返回多邊形外的記錄,並錯過肯定在多邊形內的記錄。 我能夠使用來自 mysql 的結果的谷歌地圖創建視覺效果,以幫助我進行調試。

這是我能夠使用谷歌地圖創建的記錄的視覺效果

下面是SQL查詢

SELECT *
FROM `zones`
WHERE (ST_CONTAINS(ST_GEOMFROMTEXT('POLYGON((22.43079687220491 89.14206562499999, 33.72385081452048 96.70065937499999, 22.917381576171614 107.77487812499999, 20.796651975524764 108.12644062499999, 17.643461922028166 107.42331562499999, 7.361883956935348 117.26706562499999, 2.1060545562538273 148.54242063498816, -7.365289419995424 171.21820188498816, -25.802453489204527 171.74554563498816, -36.08590711168321 -175.3694333408895, -51.731473033051614 172.21043060460465, -44.34469762328107 138.81199310460465, -34.74750931376504 107.87449310460465, -12.04633897054804 98.73386810460465, 2.804203457833971 93.76073834567285, 16.292162960708847 90.77245709567285, 22.43079687220491 89.14206562499999, 22.43079687220491 89.14206562499999))'), POINT(latitude, longitude))) AND `zones`.`deleted_at` IS NULL

從視覺上看,它顯示了所提供的多邊形之外的記錄,並且缺少應該在多邊形內的記錄。

例如,我有一個澳大利亞黑斯廷斯的區域記錄,其latitude:-38.3longitude:145.216667顯然在多邊形中,但 mysql 永遠不會返回此記錄。 新西蘭境內也有多項記錄。

邊界是使用谷歌地圖繪圖插件生成的。

這是 mysql 錯誤,還是我做錯了什么?

我將您的多邊形定義粘貼到 WKT 可視化工具中,它看起來很奇怪,與您在此處繪制的完全不同。

我認為這是由這些細分和缺少 SRID 引起的。

-25.802453489204527 171.74554563498816, -36.08590711168321 -175.3694333408895, -51.731473033051614 172.21043060460465

如果沒有明確的 SRID 參數,MySQL 使用 SRID 0 - 抽象的、無單位的、無限的、笛卡爾平面。 https://mysqlserverteam.com/spatial-reference-systems-in-mysql-8-0/

在此段中,經度從 171 跳到 -175 並返回,穿過反子午線。 但是當 SRID = 0 時,MySQL 對反子午線一無所知,這變成了一條跨越約 346 度經度並穿過大部分圖片的長線,而不是跨越約 14 度並穿過反子午線的互補短線。

您需要提供 SRID(我猜您需要4326 )來告訴 MySQL 事情正在地球上發生。 如果您不需要精確的多邊形,或者作為簡單的解決方法 - 將-175.3694333408895替換為179.9以避免穿越反子午線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM