JS+HTML5取手机经纬度和计算距离。

手机浏览器目前能够支持取得地理位置经纬度功能了。但是兼容性还有点问题。

HTML代码如下:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>

<body>
<p id="demo">点击这个按钮,获得您的坐标:</p>
<button οnclick="getLocation()">试一下</button>
你好!
</body>

<script >
    var latB=39.92; //北京纬度
    var lonB=116.46; //北京经度
    var x=document.getElementById("demo");
    function getLocation(){
        
        if (navigator.geolocation){
            navigator.geolocation.getCurrentPosition(showPosition,showError);
        }else{
            x.innerHTML="Geolocation is not supported by this browser.";
        }
    }
    
    function showPosition(position){
        var dis=GetDistance(latB,lonB,position.coords.latitude,position.coords.longitude);
        x.innerHTML="纬度: " + position.coords.latitude + "<br />经度: " + position.coords.longitude+"<br />距离北京: " +dis+"公里";
    }
    
    function showError(error)
    {
    switch(error.code)
      {
      case error.PERMISSION_DENIED:
        x.innerHTML="User denied the request for Geolocation.";
        break;
      case error.POSITION_UNAVAILABLE:
        x.innerHTML="Location information is unavailable.";
        break;
      case error.TIMEOUT:
        x.innerHTML="The request to get user location timed out.";
        break;
      case error.UNKNOWN_ERROR:
        x.innerHTML="An unknown error occurred.";
        break;
      }
    }
    
    function Rad(d){
        return d * Math.PI / 180.0;//经纬度转换成三角函数中度分表形式。
     }
     //计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度
     function GetDistance(lat1,lng1,lat2,lng2){
         var radLat1 = Rad(lat1);
         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 *6378.137 ;// EARTH_RADIUS;
         s = Math.round(s * 10000) / 10000; //输出为公里
         //s=s.toFixed(4);
         return s;
     }
 </script>
 </html>

 

=========================================

效果如下图:

测试手机小米MAX2,浏览器版本自带浏览器V10.5.1可以,用微信内置流览器不行。

图1

图2

### 回答1: 利用经纬度计算距离是一个常见的地理计算问题,可以通过 ArcGIS for JS 中的 GeometryEngine 类来实现。 首先,我们需要在计算距离之前,将经纬度转换为适用于计算的投影坐标系。ArcGIS for JS 提供了 Projection 类来进行投影转换。可以使用 `projection.load()` 方法加载投影文件或定义一个已知的投影坐标系。然后,使用 `projection.project()` 方法将经纬度点转换为投影坐标。 接下来,我们可以使用 GeometryEngine 类中的 `geodesicDistance()` 方法来计算两个点之间的距离。这个方法可以直接接受经纬度坐标作为参数,并返回以米为单位的距离值。 以下是一个简单的示例代码,展示了如何利用 ArcGIS for JS 计算经纬度之间的距离: ```javascript require([ "esri/geometry/geometryEngine", "esri/geometry/projection" ], function(GeometryEngine, Projection) { // 1. 创建投影对象 var projection = new Projection({ url: "path/to/projection-file.prj" // 这里可以是自定义的投影文件 }); // 2. 加载投影文件 projection.load().then(function() { // 3. 将经纬度转换为投影坐标 var point1 = projection.project({ x: longitude1, y: latitude1 }); var point2 = projection.project({ x: longitude2, y: latitude2 }); // 4. 计算两点之间的距离 var distance = GeometryEngine.geodesicDistance(point1, point2); console.log("距离:", distance, "米"); }); }); ``` 需要注意的是,上述代码示例中的 `longitude1`、`latitude1`、`longitude2` 和 `latitude2` 是经纬度坐标,您需要根据实际情况替换为您自己的经纬度数据。另外,投影文件需要根据您的数据源来指定。 总之,通过 ArcGIS for JS 中的 GeometryEngine 类可以方便地利用经纬度计算距离。可以通过加载投影文件和使用投影对象将经纬度转换为投影坐标,然后使用 `geodesicDistance()` 方法计算两个点之间的距离。 ### 回答2: 利用经纬度计算距离可以使用ArcGIS for JavaScript中的GeometryEngine类实现。下面是一个简单的示例代码: 首先,我们需要导入ArcGIS for JavaScript库和相关模块: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" /> <title>计算经纬度距离</title> <style> html, body, #viewDiv { padding: 0; margin: 0; height: 100%; width: 100%; } </style> <link rel="stylesheet" href="https://js.arcgis.com/4.18/esri/themes/light/main.css" /> <script src="https://js.arcgis.com/4.18/"></script> </head> <body> <div id="viewDiv"></div> <script> require([ "esri/tasks/GeometryService", "esri/geometry/Point", "esri/geometry/geometryEngine", "esri/views/MapView", "dojo/domReady!" ], function (GeometryService, Point, geometryEngine, MapView) { // 创建地图视图 var view = new MapView({ container: "viewDiv", map: map // 这里需要先创建地图对象 }); // 创建一个点对象 var point1 = new Point({ latitude: 34.0522, // 纬度 longitude: -118.2437 // 经度 }); var point2 = new Point({ latitude: 37.7749, // 纬度 longitude: -122.4194 // 经度 }); // 使用GeometryEngine计算两点之间的距离 var distance = geometryEngine.distance(point1, point2, "miles"); console.log("距离为:" + distance + "英里"); }); </script> </body> </html> ``` 在上面的代码中,我们首先导入了要使用的模块,然后创建了一个地图视图对象。接下来,我们创建了两个`Point`对象来表示两个经纬度点,分别计算了这两个点之间的距离,并将结果以英里为单位打印到控制台上。 使用ArcGIS for JavaScript的`geometryEngine`对象可以进行更多的几何计算,例如计算两个多边形之间的距离、点是否在多边形内等等。可以根据实际需求在代码中自行调整。 ### 回答3: 要在ArcGIS for JS中利用经纬度计算距离,你可以使用Geometry Engine模块提供的功能。 首先,你需要将经纬度坐标转换为ArcGIS平面坐标系统(通常是Web Mercator)。可以使用Proj4js库进行投影转换。 然后,使用Geometry Engine模块中的geodesicDistance方法,该方法可以计算两个点之间的球面距离。该方法需要传入两个点的ArcGIS平面坐标作为参数,并返回两点间的距离。 以下是一个简单的示例代码: ``` require([ "esri/geometry/geometryEngine", "esri/geometry/Point", "esri/geometry/projection" ], function (geometryEngine, Point, projection) { // 定义经纬度坐标 var longitude1 = -122.4194; var latitude1 = 37.7749; var longitude2 = -118.2437; var latitude2 = 34.0522; // 使用Proj4js进行坐标投影转换 var point1 = new Point({ x: longitude1, y: latitude1, spatialReference: { wkid: 4326 } // 纬度/经度坐标系(WGS84) }); var point2 = new Point({ x: longitude2, y: latitude2, spatialReference: { wkid: 4326 } }); // 进行坐标投影转换 projection.load().then(function () { var webMercatorRef = { wkid: 3857 }; // Web Mercator投影坐标系(Web Mercator Auxiliary Sphere) point1 = projection.project(point1, webMercatorRef); point2 = projection.project(point2, webMercatorRef); // 计算距离 var distance = geometryEngine.geodesicDistance(point1, point2, "meters"); console.log(distance); // 打印距离(单位:米) }); }); ``` 这段代码中,首先定义了两个经纬度坐标。然后,使用Proj4js将这两个坐标进行投影转换为ArcGIS平面坐标。最后,使用Geometry Engine模块的geodesicDistance方法计算两点之间的距离,并将结果打印到控制台。 它将输出两个经纬度坐标之间的距离(单位为米)。 请注意,使用Proj4js进行投影转换可能需要额外的库和配置。确保你在项目中包含了所需的依赖项,并根据所使用的地理坐标系统进行配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值