数据库中计算两地图坐标点之间的距离

CREATE OR REPLACE FUNCTION DISTANCEBYLNGLAT(LNG1 IN NUMBER,
                                            LAT1 IN NUMBER,
                                            LNG2 IN NUMBER,
                                            LAT2 IN NUMBER) RETURN NUMBER IS
  /********************
  数据库中计算两地图坐标点之间的距离
  返回公里数
  ********************/
  RADLAT1 NUMBER;
  RADLAT2 NUMBER;
  A       NUMBER;
  B       NUMBER;
  S       NUMBER;
BEGIN
  RADLAT1 := (LAT1 * ACOS(-1)) / 180.0;
  RADLAT2 := (LAT2 * ACOS(-1)) / 180.0;
  A       := RADLAT1 - RADLAT2;
  B       := ((LNG1 * ACOS(-1)) / 180.0) - ((LNG2 * ACOS(-1)) / 180.0);
  S       := 2 *
             ASIN(SQRT(POWER(SIN(A / 2), 2) +
                       COS(RADLAT1) * COS(RADLAT2) * POWER(SIN(B / 2), 2)));
  S       := S * 6378137.0; --取WGS84标准参考椭球中的地球长半径(单位:M)
  S       := ROUND(S * 10) / 10000;
  RETURN S;
END DISTANCEBYLNGLAT;

 附带javascript

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
    <script type="text/javascript">  
    function distanceByLnglat(lng1,lat1,lng2,lat2)
{
    var radLat1 = Rad(lat1);
	alert(lat1+"-->"+radLat1);
    var radLat2 = Rad(lat2);
    var a = radLat1 - radLat2;
    var b = Rad(lng1) - Rad(lng2);
    var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
    s = s * 6378137.0;// 取WGS84标准参考椭球中的地球长半径(单位:m)
    s = Math.round(s * 10000) / 10000;
alert(s);
// //下面为两点间空间距离(非球面体)
// var value= Math.pow(Math.pow(lng1-lng2,2)+Math.pow(lat1-lat2,2),1/2);
// alert(value);
}

function Rad(d)
{
    return d * Math.PI / 180.0;
}
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div onclick ="distanceByLnglat(116.95400,39.95400,116.95300,39.95300);">
    test me
    </div>
    </form>
</body>
</html>

猜你喜欢

转载自thomas0988.iteye.com/blog/2115258