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>