Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Implementasi MySQL dari Algoritma ray-casting?

Fungsi berikut (algoritma Raycasting versi MYSQL) mengguncang dunia saya :

CREATE FUNCTION myWithin(p POINT, poly POLYGON) RETURNS INT(1) DETERMINISTIC 
BEGIN 
DECLARE n INT DEFAULT 0; 
DECLARE pX DECIMAL(9,6); 
DECLARE pY DECIMAL(9,6); 
DECLARE ls LINESTRING; 
DECLARE poly1 POINT; 
DECLARE poly1X DECIMAL(9,6); 
DECLARE poly1Y DECIMAL(9,6); 
DECLARE poly2 POINT; 
DECLARE poly2X DECIMAL(9,6); 
DECLARE poly2Y DECIMAL(9,6); 
DECLARE i INT DEFAULT 0; 
DECLARE result INT(1) DEFAULT 0; 
SET pX = X(p); 
SET pY = Y(p); 
SET ls = ExteriorRing(poly); 
SET poly2 = EndPoint(ls); 
SET poly2X = X(poly2); 
SET poly2Y = Y(poly2); 
SET n = NumPoints(ls); 
WHILE i<n DO 
SET poly1 = PointN(ls, (i+1)); 
SET poly1X = X(poly1); 
SET poly1Y = Y(poly1); 
IF ( ( ( ( poly1X <= pX ) && ( pX < poly2X ) ) || ( ( poly2X <= pX ) && ( pX < poly1X ) ) ) && ( pY > ( poly2Y - poly1Y ) * ( pX - poly1X ) / ( poly2X - poly1X ) + poly1Y ) ) THEN 
SET result = !result; 
END IF; 
SET poly2X = poly1X; 
SET poly2Y = poly1Y; 
SET i = i + 1; 
END WHILE; 
RETURN result; 
End; 

Tambahkan

  DELIMITER ;; 

sebelum fungsi sesuai kebutuhan. Penggunaan fungsi adalah:

 SELECT myWithin(point, polygon) as result;

dimana

 point  = Point(lat,lng) 
 polygon = Polygon(lat1 lng1, lat2 lng2, lat3 lng3, .... latn lngn, lat1 lng1)

Harap dicatat bahwa poligon harus ditutup (biasanya ditutup jika Anda mengambil data kml atau googlemap standar tetapi pastikan itu - perhatikan lat1 lng1 set diulang di akhir)

Saya tidak memiliki titik dan poligon di database saya sebagai bidang geometris, jadi saya harus melakukan sesuatu seperti:

 Select myWithin(PointFromText( concat( "POINT(", latitude, " ", longitude, ")" ) ),PolyFromText( 'POLYGON((lat1 lng1, ..... latn lngn, lat1 lng1))' ) ) as result

Saya harap ini bisa membantu seseorang.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. BULAN () Contoh – MySQL

  2. Bagaimana cara menggabungkan string dari subquery menjadi satu baris di mysql?

  3. kesalahan fatal yang ditemui selama eksekusi perintah selama pembaruan

  4. Campuran MySQL dan Mongodb dalam sebuah aplikasi

  5. Menghapus MySQL 5.7 Sepenuhnya