sql >> Databáze >  >> RDS >> Mysql

MySQL implementace ray-casting algoritmu?

Následující funkce (MYSQL verze algoritmu Raycasting) otřásla mým světem:

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; 

Přidat

  DELIMITER ;; 

před funkcí podle potřeby. Použití pro funkci je:

 SELECT myWithin(point, polygon) as result;

kde

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

Vezměte prosím na vědomí, že polygon by měl být uzavřen (normálně je uzavřen, pokud načítáte standardní data kml nebo googlemap, ale ujistěte se, že jsou - všimněte si, že sada lat1 lng1 se na konci opakuje)

V databázi jsem neměl body a polygony jako geometrická pole, takže jsem musel udělat něco jako:

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

Doufám, že to někomu pomůže.



  1. Javascript a PHP odpočítávací časovač, který zobrazuje všem stejně

  2. Sloučit hodnoty řádků do CSV (neboli GROUP_CONCAT pro SQL Server)

  3. GPL a libmysqlclient

  4. Jak mohu vložit data do SQL Server pomocí VBNet