Cordova插件开发二:高精度定位之卫星数据解析

这篇具有很好参考价值的文章主要介绍了Cordova插件开发二:高精度定位之卫星数据解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.最终效果预览

Cordova插件开发二:高精度定位之卫星数据解析,Cordova插件开发实战,cordova,高精度定位,卫星解析

2.坐标获取方法

 let obj = Object.assign({}, this.mapConfig.mapLocationObj)
     obj.isKeepCallBack = false
 let res = await this.utilsTools.getXYLocationDataByDeviceType(obj)

mapLocationObj值为配置文件封装的公共参数

public mapLocationObj = {
		packageName: 'com.xx.xxx',
		delayTime: 2000,
		intervalTime: 1000,
		rodHeight: '0.5',
		isKeepCallBack: false,
		paramKey: 'getKeepData'
	}

res中返回的数据即为获取到的坐标数据

3.在公共类中封装获取坐标的通用方法

async getXYLocationDataByDeviceType(obj) {
		let res;
		if (this.isAndroid()) {
			if (localStorage.getItem('deviceType') == '2') {
				res = await this.returnNmeaDataNew(obj)
			} else if (localStorage.getItem('deviceType') == '3') {
				res = await this.settingRTKLocation(obj)
			} else {
				res = await this.returnGaoDeData()
			}
		} else {
			res = {
				latitude: 0,
				longitude: 0,
				altitude: 0,
				gpsStatue: 0,
				code: 500,
			}
		}
		return res
	}

res = await this.returnNmeaDataNew(obj)即为高精度坐标数据获取方法

returnNmeaDataNew(obj) {
		return new Promise((resolve, reject) => {
			GeolocationManager.startGeoLocation(obj, res => {
				resolve(res)
			}, fail => {
				resolve(fail)
			})
		});

	}

4.插件js中封装startGeoLocation方法

startGeoLocation:function(options,onSuccess,onError){
			exec(onSuccess, onError, "GeolocationManager", "startGeoLocation", [options]);
		}

5.插件主界面封装的方法

public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if ("startGeoLocation".equals(action)) {
            message = args.getJSONObject(0);
            delayTime = message.getInt("delayTime");
            intervalTime = message.getInt("intervalTime");
            isKeepCallBack = message.getBoolean("isKeepCallBack")||false;
            this.singleLocaiton(callbackContext, message);
            return true;
        }
        return false;
    }

单次定位方法

/**
     * 调用单次定位
     * @param callbackContext
     * @param message
     */
    public void singleLocaiton(CallbackContext callbackContext, JSONObject message) throws JSONException {
        try {
            singleLocaitonCC = callbackContext;
            this.getLocation();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

getLocation中获取坐标并持续更新坐标值

 @SuppressLint("MissingPermission")
    public void getLocation() {
        if (mLocationManager == null)
            mLocationManager = (LocationManager) cordova.getContext().getSystemService(Context.LOCATION_SERVICE);
        if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
                mLocationManager.addNmeaListener(mNmeaListener);
            } else {
                mNmeaListener2 = new OnNmeaMessageListener() {
                    @Override
                    public void onNmeaMessage(String arg1, long l) {
                        if (arg1 != null) {
                            processNmeaData(arg1);
                            updateView();
                        }else{
                            updateView();
                        }
                    }
                };
                if(mNmeaListener2!=null){
                    mLocationManager.addNmeaListener(mNmeaListener2);
                }

            }
        }
    }

卫星数据解析

 @SuppressLint("DefaultLocale")
    public void processNmeaData(String nmea) {
        if (nmea.length() == 0)
            return;
        if (!checkNMEAData(nmea)) {
            // 可能是A318的命令返回值
            return;
        }
        if (!nmea.startsWith("$GPPWR,") && !nmea.startsWith("$GNGST,")
                && !nmea.startsWith("$GPGST,") && !nmea.startsWith("$GLGSV,")
                && !nmea.startsWith("$GNGSV,") && !nmea.startsWith("$BDGSV,")
                && !nmea.startsWith("$GPZDA,") && !nmea.startsWith("$GPGSA,")
                && !nmea.startsWith("$GNVTG,") && !nmea.startsWith("$GPVTG,")
                && !nmea.startsWith("$GNGSA,") && !nmea.startsWith("$GPNTR,")
                && !nmea.startsWith("$GNGGA,") && !nmea.startsWith("$GPGGA,")
                && !nmea.startsWith("$GPRMC,") && !nmea.startsWith("$GPGSV,")
                && !nmea.startsWith("$BDGSA,"))
            return;
        String[] sField = nmea.split(",");
        int iFieldNum = stringNumbers(nmea, ",");
        if (sField == null)
            return;
        if ((sField[0].equalsIgnoreCase("$GPGGA") || sField[0]
                .equalsIgnoreCase("$GNGGA")) && iFieldNum >= 14) {
            if (sField[6].trim().length() > 0) {
                switch (Integer.parseInt(sField[6])) {
                    case 0:// 无效解
                        gpsStatue = 0;
                        break;
                    case 1:// 单点解
                        gpsStatue = 1;
                        break;
                    case 9:
                    case 2:// 差分解
                        gpsStatue = 2;
                        break;
                    case 3:
                    case 4:// 固定解
                    case 8:
                        gpsStatue = 4;
                        break;
                    case 5:// 浮点解
                        gpsStatue = 5;
                        break;

                }

                if (sField[2].trim().length() > 3) {
                    latitude = Double.parseDouble(sField[2].substring(0, 2))
                            + Double.parseDouble(sField[2].substring(2)) / 60;
                }
                if (sField[3] == "S")
                    latitude *= -1.0;
                if (sField[4].trim().length() > 4) {
                    longitude = Double.parseDouble(sField[4].substring(0, 3))
                            + Double.parseDouble(sField[4].substring(3)) / 60;
                }
                if (sField[5] == "W") {
                    longitude *= -1.0;
                    longitude += 360;
                }
                if (sField[7].trim().length() > 0) {
                    m_SatNum = Integer.parseInt(sField[7]);
                } else {
                    m_SatNum = 0;
                }
                if (sField[9].trim().length() > 0) {
                    if (sField[11].trim().length() == 0)
                        sField[11] = "0";
                    altitude = Double.parseDouble(sField[9]) + Double.parseDouble(sField[11]);
                    dUndulation = Double.parseDouble(sField[11]);
                }
            }
            if (sField[13].trim().length() > 0) {
                age = Double.parseDouble(sField[13]);
            } else {
                age = 99;
            }

            int m_Sec = 1, iSecOff = 0;
            int m_Hour = 1, m_Min = 1;
            if (sField[1].trim().length() >= 6) {
                m_Hour = Integer.parseInt(sField[1].substring(0, 2));
                m_Min = Integer.parseInt(sField[1].substring(2, 4));
                m_Sec = Integer.parseInt(sField[1].substring(4, 6));
            }
            if (m_Sec > 59) {
                iSecOff = m_Sec - 59;
                m_Sec = 59;
            }
            if (m_Hour < 0 || m_Hour > 23 || m_Min < 0 || m_Min > 59
                    || iSecOff > 60) {
                return;
            }
        } else if (((sField[0].equalsIgnoreCase("$GPGST")) || (sField[0]
                .equalsIgnoreCase("$GNGST"))) && iFieldNum >= 8) {

            if (sField[7].trim().length() > 0) {
                SigmaEast = Double.parseDouble(sField[7]);
            }
            if (sField[6].trim().length() > 0) {
                SigmaNorth = Double.parseDouble(sField[6]);
            }
            if (sField[8].contains("*")) {
                sField[8] = (sField[8].substring(0, sField[8].indexOf("*")));//
            }
            if (sField[8].trim().length() > 0) {
                vrms = Double.parseDouble(sField[8]);
            }
            hrms = Math.sqrt(SigmaEast * SigmaEast + SigmaNorth * SigmaNorth);
            rms = Math.sqrt(hrms * hrms + vrms * vrms);
        }
    }

持续更新坐标数据

void updateView() {
        String s = "解状态:";
        switch (gpsStatue) {
            case 0:
                s += "无效解";
                break;
            case 1:
                s += "单点解";
                break;
            case 2:
                s += "差分解";
                break;
            case 4:
                s += "固定解";
                break;
            case 5:
                s += "浮点解";
                break;

        }
        gpsStatueStr = s;
        try {
            if (null != singleLocaitonCC) {
                PositionInfo();
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

将插件中获取的坐标数据返回文章来源地址https://www.toymoban.com/news/detail-739716.html

/**
     * 实现单次定位 委托
     * @throws JSONException
     */
    @Override
    public void PositionInfo() throws JSONException {
        sendPositionInfo(singleLocaitonCC);
    }

    /**
     * 返回定位 json
     * @throws JSONException
     */
    public void sendPositionInfo(CallbackContext c) throws JSONException {
        if(0.0 == latitude){
            try {
                Thread.sleep(delayTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if(!isKeepCallBack){
            locationDestory();
        }


        JSONObject json = new JSONObject();
        json.put("latitude",latitude);
        json.put("longitude",longitude);
        json.put("altitude",altitude);
		json.put("hrms",hrms);
		json.put("vrms",vrms);
		json.put("rms",rms);
        json.put("type","highGps");
		json.put("gpsStatue",gpsStatue);
        if (0.0 != latitude) {
            json.put("code", "200");
            PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, json);
            pluginResult.setKeepCallback(isKeepCallBack);
            c.sendPluginResult(pluginResult);
        } else {
            json.put("code", "500");
            PluginResult pluginResult = new PluginResult(PluginResult.Status.ERROR, json);
            pluginResult.setKeepCallback(isKeepCallBack);
            c.sendPluginResult(pluginResult);
        }
    }

到了这里,关于Cordova插件开发二:高精度定位之卫星数据解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【分享】高精度RTK定位解决方案

    高精度RTK定位系统采用高精度定位标签,通过计算机技术、地理信息技术、移动定位技术、通信技术、网络技术,为生产现场作业人员配发定位终端,实时追踪其位置信息进行相关管控,为其活动提供安全技术保障。   近年来,随着铁路建设的不断推进,我国铁路行业不断发

    2024年02月03日
    浏览(44)
  • 北斗高精度定位,破解共享单车停车乱象

    如今,共享单车已经成为了许多人出行的首选方式,方便了市民们的“最后一公里”,给大家的生活带来了很多便利。然而,乱停乱放的单车也给城市治理带来了难题。在这种情况下,相关企业尝试将北斗导航定位芯片装载到共享单车上,通过高精度的位置识别,来破解乱停

    2024年02月09日
    浏览(42)
  • 【Java】UWB高精度工业人员安全定位系统源码

    基于Vue+Spring boot前后端分离架构开发的一套UWB技术高精度定位系统源码。 UWB高精度人员定位系统提供实时定位、电子围栏、轨迹回放等基础功能以及各种拓展功能,用户可根据实际需要任意选择搭配拓展功能。该系统简易部署,方便使用,实时响应。UWB高精度定位采用应用层

    2024年02月14日
    浏览(36)
  • 【分享】5G+北斗RTK高精度人员定位解决方案

    5G+北斗RTK高精度定位系统旨在通过5G网络实时提供亚米级、厘米级、毫米级高精度定位服务,构建全天候、全天时、全地理的精准时空服务体系。 伴随着信息技术日新月异的发展,各类“智慧”顺势而出,智慧城市、智慧医院、智慧工厂、智慧电厂等等如雨后春笋,与工业

    2023年04月09日
    浏览(34)
  • 免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)

    免费开源的高精度OCR文本提取,支持 100 多种语言、自动文本定位和脚本检测,几行代码即可实现离线使用(附源码)。 要从图像、照片中提取文本吗?是否刚刚拍了讲义的照片并想将其转换为文本?那么您将需要一个可以通过 OCR(光学字符识别)识别文本的应用程序。 图

    2024年02月01日
    浏览(104)
  • 基于24位Δ-ΣADC和FPGA的高精度数据采集系统开发

    基于24位Δ-ΣADC和FPGA的高精度数据采集系统开发 数据采集是许多应用领域中的关键任务之一,需要高精度和可靠性。本文介绍了一种基于24位Δ-Σ(Delta-Sigma)ADC(模数转换器)和FPGA(现场可编程门阵列)的高精度数据采集系统的开发方法。该系统利用Matlab进行算法设计和验证

    2024年02月04日
    浏览(33)
  • (基础算法)高精度加法,高精度减法

    什么叫做高精度加法呢?包括接下来的高精度减法,高精度乘法与除法都是同一个道理。正常来讲的话加减乘除,四则运算的数字都是整数,也就是需要在int的范围之内,但当这个操作数变得非常\\\"大\\\"的时候( 其实就是一个字符串,比方说有一个数是20位,如果用整数视角来

    2024年02月01日
    浏览(34)
  • C++高精度算法

    目录 前言:  思路: 高精度加法: 高精度减法: 高精度乘法: 高精度除法:  代码: 一、高精度加法 二、高精度减法  三、高精度乘法  四、高精度除法 最后         计算机最初、也是最重要的应用就是数值运算。在编程进行数值运算时,有时会遇到运算的精度要求特

    2024年02月14日
    浏览(32)
  • 高精度加法

    高精度问题是指两个数字非常大,超过了 int ,甚至 long long 的范围,数字的位数甚至能达到 (10^5) ,那么如果要实现这样两个大数字的运算,需要解决以下两个问题: 如何存储? 这样的两个数字相加是不可能用普通类型来存储的,所以我们第一个要解决的问题就是如何存储

    2024年02月08日
    浏览(32)
  • 高精度/前缀和/差分

    存储方式: 整数的长度一般小于1e6 大整数的每一位存储到数组里 存储时低位在前,高位在后,方便进位 高精度加法 每一位相加Ai + Bi + t, t表示进位取值0/1,逢十进一 模板: 高精度减法 每一位相减Ai - Bi - t, t 表示借位取值0/1 模板: 高精度乘法 A * b ,b=10000, len(A) = 1e6 , 乘的

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包