Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL реализация на алгоритъм за прехвърляне на лъчи?

Следната функция (MYSQL версия на алгоритъма Raycasting) разтърси моя свят:

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; 

Добавете

  DELIMITER ;; 

преди функцията според изискванията. Използването на функцията е:

 SELECT myWithin(point, polygon) as result;

където

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

Моля, имайте предвид, че многоъгълникът трябва да бъде затворен (обикновено е затворен, ако извличате стандартни данни от kml или googlemap, но просто се уверете, че е така - забележете, че lat1 lng1 наборът се повтаря в края)

Нямах точки и многоъгълници в моята база данни като геометрични полета, така че трябваше да направя нещо като:

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

Надявам се това да помогне на някой.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да оптимизирате заявки за Entity Framework

  2. Как да настроите отдалечена MySQL връзка

  3. Вмъкване на списък, съдържащ множество стойности в MySQL с помощта на pymysql

  4. #1115 - Неизвестен набор от знаци:'utf8mb4'

  5. MySQL - Как да хвърля изключение в съхранената процедура?