Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL triển khai Thuật toán truyền tia?

Hàm sau (phiên bản MYSQL của thuật toán Raycasting) đã làm rung chuyển thế giới của tôi:

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; 

Thêm

  DELIMITER ;; 

trước hàm theo yêu cầu. Cách sử dụng cho hàm là:

 SELECT myWithin(point, polygon) as result;

ở đâu

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

Xin lưu ý rằng đa giác phải được đóng (thông thường nó sẽ được đóng nếu bạn đang truy xuất dữ liệu kml hoặc googlemap chuẩn nhưng chỉ cần đảm bảo là có - lưu ý bộ lat1 lng1 được lặp lại ở cuối)

Tôi không có điểm và đa giác trong cơ sở dữ liệu của mình dưới dạng các trường hình học, vì vậy tôi phải làm điều gì đó như:

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

Tôi hy vọng điều này có thể giúp ai đó.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thoát% khỏi truy vấn mysql python

  2. trung bình chạy trong mysql

  3. Tải CSV vào bảng MySQL bằng PHP

  4. Hàm tổng hợp trong MySQL - danh sách (như LISTAGG trong Oracle)

  5. Loại dữ liệu của kết quả SUM trong MySQL