0

指定された座標間の距離を計算する必要がある関数に問題があります。私が見ることができるように、問題は負の値であり、これを解決する方法のアイデアが不足しているため、誰かが私を助けてくれれば本当に感謝しています!

DELIMITER $$

CREATE DEFINER=`sfff_user`@`%` FUNCTION `GetUserDistance`(lat VARCHAR (20), lon VARCHAR (20), userLat VARCHAR (20), userLon VARCHAR (20)) RETURNS int(11)
BEGIN
    DECLARE distance INT (11);

    IF ISNULL(lat) OR ISNULL(lon) OR lat = '' OR lon = '' THEN
        RETURN 0;
    ELSE
        SELECT
            3956 * 2 * ASIN(SQRT(POWER(SIN((lat - ABS(userLat)) * PI() / 180 / 2), 2) + COS(lat * PI() / 180) * COS(ABS(userLat) * PI() / 180) * POWER(SIN((lon - userLon) * PI() / 180 / 2), 2)))
        INTO
            distance;

        RETURN distance;
    END IF;

END

たとえば、この呼び出しの結果:

select GetUserDistance(44, 21, 44, 21) as distance;0は問題ありません

しかし、これを見てください:

select GetUserDistance('-15.4167', '28.2833', '-15.4167', '28.2833') as distance; 

正気でない2129です!

私はこれを解決したくてたまらないので、あなたが見てみることができれば、正しい機能を持っていることはとてもいいことです:(

ありがとう。

4

2 に答える 2

1

このリンクによると、式は:なしである必要がありますABS

3956 * 2 * ASIN(SQRT(POWER(SIN((lat - userLat) * PI() / 180 / 2), 2) + COS(lat * PI() / 180) * COS(ABS(userLat) * PI() / 180) * POWER(SIN((lon - userLon) * PI() / 180 / 2), 2)))
于 2012-08-02T09:57:03.757 に答える
0

安全のために、@Scharronが試してみる必要がないと言ったように、キャストする必要がありますVARCHARDECIMALABS

CREATE FUNCTION `GetUserDistance`(arg_lat VARCHAR (20), arg_lon VARCHAR (20), arg_userLat VARCHAR (20), arg_userLon VARCHAR (20)) RETURNS int(11) NO SQL
BEGIN
    DECLARE distance INT (11);
    DECLARE lat, lon, userLat, userLon DECIMAL(14,4);

    SET lat = CAST(arg_lat AS DECIMAL(14,4));
    SET lon = CAST(arg_lon AS DECIMAL(14,4));
    SET userLat = CAST(arg_userLat AS DECIMAL(14,4));
    SET userLon = CAST(arg_userLon AS DECIMAL(14,4));

    IF ISNULL(lat) OR ISNULL(lon) OR lat = '' OR lon = '' THEN
        RETURN 0;
    ELSE
        SELECT
            3956 * 2 * ASIN(SQRT(POWER(SIN((lat - userLat) * PI() / 180 / 2), 2) + COS(lat * PI() / 180) * COS(ABS(userLat) * PI() / 180) * POWER(SIN((lon - userLon) * PI() / 180 / 2), 2)))
        INTO
            distance;

        RETURN distance;
    END IF;
END
于 2012-08-02T10:00:13.490 に答える