Mysql

為什麼我不能使用這個距離函式計算 MySql 表的固定點和幾何欄位之間的距離?

  • November 13, 2018

我不太喜歡數據庫和 GIS,我有以下問題。

我已經定義了這個函式,它返回由 2 個欄位表示的空間中 2 個點之間的距離:

CREATE FUNCTION earth_circle_distance(point1 point, point2 point) RETURNS double
   DETERMINISTIC
begin
 declare lon1, lon2 double;
 declare lat1, lat2 double;
 declare td double;
 declare d_lat double;
 declare d_lon double;
 declare a, c, R double;

 set lon1 = X(GeomFromText(AsText(point1)));
 set lon2 = X(GeomFromText(AsText(point2)));
 set lat1 = Y(GeomFromText(AsText(point1)));
 set lat2 = Y(GeomFromText(AsText(point2)));

 set d_lat = radians(lat2 - lat1);
 set d_lon = radians(lon2 - lon1);

 set lat1 = radians(lat1);
 set lat2 = radians(lat2);

 set R = 6372.8; -- in kilometers

 set a = sin(d_lat / 2.0) * sin(d_lat / 2.0) + sin(d_lon / 2.0) * sin(d_lon / 2.0) * cos(lat1) * cos(lat2);
 set c = 2 * asin(sqrt(a));

 return R * c;
end

它工作得很好,我嘗試將 2 點傳遞給它:

SET @point1= GeomFromText('POINT(41.772683, 12.241714)'); 
SET @point2 = GeomFromText('POINT(42.1212121, 13.1212121)'); 

問題是我想在查詢中使用這個函式來計算一個設定點和我的住宿表記錄表示的另一個點之間的距離。

所以我嘗試過這樣的事情:

SET @fiumicino = GeomFromText('POINT(41.772683, 12.241714)'); 

SELECT a.accomodation_name as name, 
      AsText(a.geographical_position) as position,
      X(a.geographical_position) as lat,
      Y(a.geographical_position) as lon,
      earth_circle_distance(@fiumicino, a.geographical_position)
FROM accomodation a

我想計算住宿表的geography_position欄位表示的所有點與設置點**@fiumicino**的距離。

geometry_position欄位的數據類型是GEOMETRY (因為在 Java 中我使用 Hibernate 與****POINT數據類型互動有一些問題,我無法更改它)。

問題是執行上一個查詢是我收到以下錯誤消息:

#1064 - 您的 SQL 語法有錯誤;檢查與您的 MariaDB 伺服器版本相對應的手冊,以在第 3 行的 ’ (a.geographical_position), @Y(a.geographical_position), earth_circle_d’附近使用正確的語法

**執行earth_circle_distance(@fiumicino, a.geographical_position)**時會出現問題。

事實上從我的查詢中刪除這個語句,所以執行這個不計算距離的簡化查詢:

SET @fiumicino = GeomFromText('POINT(41.772683, 12.241714)'); 

SELECT a.accomodation_name as name, 
      AsText(a.geographical_position) as position,
      X(a.geographical_position) as lat,
      Y(a.geographical_position) as lon
FROM accomodation a

name                            position                    lat                     lon 
--------------------------------------------------------------------------------------------------------------------------- 
Grand Hotel Marina de Ostia     POINT(41.729086 12.278478)  41.729086               12.278478
Motel La Bettola                POINT(41.883991 12.33544)   41.883991               12.33544
HOTEL 1                         POINT(41.82703258287677     12.266217163303374)     41.82703258287677   12.266217163303374
HOTEL 2                         POINT(41.816297452855096 12.239581452630633)        41.816297452855096  12.239581452630633

因此,如您所見,用於earth_circle_distance(@fiumicino, a.geographical_position)的****a.geographical_position欄位的值類似於POINT(41.883991 12.33544)。但是這種方式不起作用。

為什麼?怎麼了?我錯過了什麼?

我還通過**@X(a.geographical_position)@Y(a.geographical_position)檢索了我的點的緯度經度**值。

如果我知道怎麼做,我可以用以前的值創建一個新點作為第二個參數傳遞給這個earth_circle_distance()函式。如何獲取固定點與目前記錄的a.geographical_position表示的點之間的距離?

該錯誤只是抱怨,因為沒有@Y()功能,它只是ST_Y(首選)或Y()(舊廢話)

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