2010-06-17 4 views
1

J'ai besoin d'aide pour combiner une procédure stockée avec une autre fonction.MySQL: Comment combiner une procédure stockée avec une autre fonction?

J'ai une procédure stockée qui tire les latitudes et les longitudes d'une base de données. J'ai une autre fonction qui vérifie si un point est à l'intérieur d'un polygone. Mon but est de combiner les deux fonctions, de sorte que je puisse vérifier si les points de latitude et de longitude tirés de la base de données sont à l'intérieur d'une zone spécifique.

Cette procédure stockée tire la latitude et la longitude de la base de données sur la base de infraction:

DROP PROCEDURE IF EXISTS latlongGrabber; 
DELIMITER $$ 
CREATE PROCEDURE latlongGrabber(IN offense_in VARCHAR(255)) 

BEGIN 
    DECLARE latitude_val VARCHAR(255); 
    DECLARE longitude_val VARCHAR(255); 
    DECLARE no_more_rows BOOLEAN; 
    DECLARE latlongGrabber_cur CURSOR FOR 

    SELECT latitude, longitude FROM myTable WHERE offense = offense_in; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_rows = TRUE; 

OPEN latlongGrabber_cur; 


the_loop: LOOP 

FETCH latlongGrabber_cur 
INTO latitude_val, longitude_val; 

IF no_more_rows THEN CLOSE latlongGrabber_cur; 
LEAVE the_loop; 
END IF; 
SELECT latitude_val, longitude_val; 
END LOOP the_loop; 
END 
$$ 
DELIMITER ; 

Cette fonction vérifie si un point est à l'intérieur d'un polygone. Je voudrais que la fonction teste les points produits par la procédure. Je peux coder en dur le polygone pour l'instant. (Une fois, je sais comment combiner ces deux fonctions, je vais utiliser le même modèle pour extraire les polygones de la base de données).

DROP FUNCTION IF EXISTS myWithin; 
DELIMITER $$ 
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 ; 

Cette fonction est appelée comme suit:

SET @point = PointFromText('POINT(5 5)') ; 
SET @polygon = PolyFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'); 
SELECT myWithin(@point, @polygon) AS result 

Je l'ai testé la procédure stockée et la fonction et ils fonctionnent bien. Je dois juste comprendre comment les combiner. Je voudrais appeler la procédure avec le paramètre d'infraction et faire tester toutes les latitudes et longitudes tirées de la base de données pour voir si elles sont à l'intérieur ou à l'extérieur du polygone.

Des conseils ou des suggestions?

Merci.

-Laxmidi

+0

Salut, Est-il possible d'appeler la fonction à partir de la procédure stockée et ont l'exécuter pour chaque ensemble de lat désire ardemment? Merci. – Laxmidi

+0

Salut, je voudrais faire quelque chose comme ceci: http://www.java2s.com/Code/SQL/Procedure-Function/Callanotherfunction.htm où la fonction est appelée à partir de la procédure stockée. Comment puis-je l'adapter à ma situation? Merci. – Laxmidi

Répondre

0

Tchad au forum de MySQL m'a aidé à résoudre ceci:

SELECT myWithin(
POINTFROMTEXT(CONCAT('POINT(', latitude, ' ', longitude, ')')) , POLYFROMTEXT('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))') 
)AS result, latitude, longitude 
FROM myTable 

je peux simplement utiliser une instruction select appelant la fonction. Je n'avais pas besoin de la procédure stockée après tout.

Merci.

-Laxmidi

Questions connexes