GIS定位偏移过大;GIS定位相关

11 篇文章 0 订阅
7 篇文章 0 订阅

解决方案无非两种
1、切换GIS地图
2、转换坐标

解决方案 1

//切换地图就不多说看文档
esri-》Map-》basemap

解决方案 2

	//首先查看GIS坐标系
	map.spatialReference // 102100 投影坐标系
	//若在此时创建点线面位置一定会报错
	//解决方案  看文档 esri/geometry/webMercatorUtils
	geographicToWebMercator(geometry)//Converts geometry from geographic units to Web Mercator units.
	lngLatToXY(long, lat)//Converts geometry from geographic units to Web Mercator units.
	//不过多复制 举个栗子即可 完全可解决你的问题

下面说一个我自己项目中的实例

采用H5 中`

plus.geolocation.getCurrentPosition(//使用的gcj02坐标系
                    (position)=>{ 
                        onSuccess(position,getGpsTime)  
                    },
                    onError,
                    {
                        enableHighAccuracy:true, 
                        provider:'amap',
                        timeout:2000,    
                        coordsType:'gcj02'
                    }
             ); 
             //获取后 转换为 wgs84 
             CoordinateUtil.gcj02towgs84(position.coords.longitude,position.coords.latitude) 
             //然后GIS通过 转换为 投影坐标 
             webMercatorUtils.xyToLngLat(x, y) 
             
                /**
                 * @原算法 https://www.jianshu.com/p/57ca061f3987
                 * @根据该作者的修改成JS版的
                 * @time 2019-7-17 09:58:42
                 * @description bd09 转WGS84,精准度高
                 * */
                var CoordinateUtil = {
                    x_pi: 3.14159265358979324 * 3000.0 / 180.0,
                    //pai
                    pi: 3.1415926535897932384626,
                    //离心率
                    ee: 0.00669342162296594323,
                    //长半轴
                    a: 6378245.0,
                    //百度转国测局
                    bd09togcj02: function(bd_lon, bd_lat) {
                        var x = bd_lon - 0.0065;
                        var y = bd_lat - 0.006;
                        var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * CoordinateUtil.x_pi);
                        var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * CoordinateUtil.x_pi);
                        var gg_lng = z * Math.cos(theta);
                        var gg_lat = z * Math.sin(theta); 
                        return [gg_lng, gg_lat ]
                    },
                    //国测局转百度
                    gcj02tobd09: function(lng, lat) {
                        var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * CoordinateUtil.x_pi);
                        var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * CoordinateUtil.x_pi);
                        var bd_lng = z * Math.cos(theta) + 0.0065;
                        var bd_lat = z * Math.sin(theta) + 0.006;
                        return {
                            lng: bd_lng,
                            lat: bd_lat
                        };
                    },
                    //国测局转84
                    gcj02towgs84: function(lng, lat) {
                        var dlat = CoordinateUtil.transformlat(lng - 105.0, lat - 35.0);
                        var dlng = CoordinateUtil.transformlng(lng - 105.0, lat - 35.0);
                        var radlat = lat / 180.0 * CoordinateUtil.pi;
                        var magic = Math.sin(radlat);
                        magic = 1 - CoordinateUtil.ee * magic * magic;
                        var sqrtmagic = Math.sqrt(magic);
                        dlat = (dlat * 180.0) / ((CoordinateUtil.a * (1 - CoordinateUtil.ee)) / (magic * sqrtmagic) * CoordinateUtil.pi);
                        dlng = (dlng * 180.0) / (CoordinateUtil.a / sqrtmagic * Math.cos(radlat) * CoordinateUtil.pi);
                        var mglat = lat + dlat;
                        var mglng = lng + dlng;
                        return {
                            lng: lng * 2 - mglng,
                            lat: lat * 2 - mglat
                        };
                    },
                    //经度转换
                    transformlat: function(lng, lat) {
                        var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
                        ret += (20.0 * Math.sin(6.0 * lng * CoordinateUtil.pi) + 20.0 * Math.sin(2.0 * lng * CoordinateUtil.pi)) * 2.0 / 3.0;
                        ret += (20.0 * Math.sin(lat * CoordinateUtil.pi) + 40.0 * Math.sin(lat / 3.0 * CoordinateUtil.pi)) * 2.0 / 3.0;
                        ret += (160.0 * Math.sin(lat / 12.0 * CoordinateUtil.pi) + 320 * Math.sin(lat * CoordinateUtil.pi / 30.0)) * 2.0 / 3.0;
                        return ret;
                    },
                    //纬度转换
                    transformlng: function(lng, lat) {
                        var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
                        ret += (20.0 * Math.sin(6.0 * lng * CoordinateUtil.pi) + 20.0 * Math.sin(2.0 * lng * CoordinateUtil.pi)) * 2.0 / 3.0;
                        ret += (20.0 * Math.sin(lng * CoordinateUtil.pi) + 40.0 * Math.sin(lng / 3.0 * CoordinateUtil.pi)) * 2.0 / 3.0;
                        ret += (150.0 * Math.sin(lng / 12.0 * CoordinateUtil.pi) + 300.0 * Math.sin(lng / 30.0 * CoordinateUtil.pi)) * 2.0 / 3.0;
                        return ret;
                    },
                    getWgs84xy:function(x,y){
                        //先转 国测局坐标
                        var doubles_gcj = CoordinateUtil.bd09togcj02(x, y); //(x 117.   y 36. )
                        //国测局坐标转wgs84
                        var doubles_wgs84 = CoordinateUtil.gcj02towgs84(doubles_gcj.lng, doubles_gcj.lat);
                        //返回 纠偏后 坐标
                        
                        return doubles_wgs84;
                    }
              
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Web_Lys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值