Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Implementacja algorytmu ray-castingu w MySQL?

Poniższa funkcja (wersja algorytmu Raycastingu MYSQL) wstrząsnęła moim światem:

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; 

Dodaj

  DELIMITER ;; 

przed funkcją zgodnie z wymaganiami.Zastosowanie funkcji to:

 SELECT myWithin(point, polygon) as result;

gdzie

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

Pamiętaj, że wielokąt powinien być zamknięty (zwykle jest zamknięty, jeśli pobierasz standardowe dane kml lub googlemap, ale po prostu upewnij się, że jest - zauważ, że zestaw lat1 lng1 jest powtarzany na końcu)

Nie miałem w bazie punktów i wielokątów jako pól geometrycznych, więc musiałem zrobić coś takiego:

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

Mam nadzieję, że to może komuś pomóc.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysqli lub PDO - jakie są plusy i minusy?

  2. Pomoc dotycząca haszowania PHP i SQL:Co robię źle?

  3. Dostrajanie MySQL do szybkiego tworzenia kolumn/indeksów podczas rozwoju

  4. Railsy `gdzie` na czas krótszy niż zapytania

  5. Drukowanie tabeli w poziomie zamiast w pionie za pomocą PHP