自定义算法过滤定位点,实现高德轨迹纠偏

车辆轨迹数据的卡尔曼滤波平滑处理(Python实现) 什么是卡尔曼滤波在处理车辆轨迹数据时,轨迹点实际上是对车辆实际“状态”的一种“观测”信息。由于误差的存在,观测数据可能会与车辆的实际状态存在一定的偏差。如何更精确地获取车辆的实际状态呢?考虑前面小节中所提及的判断车辆轨迹是否出现漂移的方法,主要将某个轨迹点与前面的轨迹的位置比较,查看是否存在明显不合理的瞬移。这种思路其实就是根据车辆之前的轨迹,预判车辆接下来可能的位置,如果记录的下一个轨迹点远超出预期,那么就可以断定这条轨迹出现了异常。 阅读详情
AI摘要

在户外出行轨迹记录中,因基站切换定位点偏差大需纠偏。高德地图提供的纠偏 API 有适用场景限制,不适合操场、公园等。本文提出自定义算法过滤定位点实现纠偏,介绍了算法过程、对异常情况的处理,还提及判断偏移点算法流程图、代码实现及测试分析数据的方法。

自定义算法过滤定位点,实现高德轨迹纠偏

示例Demo:https://github.com/ShihooWang/TraceByAmap
一、背景

在做户外出行轨迹记录的时候,往往因为基站切换,导致定位点偏差过大,于是需要纠偏。高德地图提供了最新的纠偏算法:

然而,该API只适合将记录的行车轨迹点进行抽稀、纠偏操作,将轨迹匹配到道路上,提供平滑的绘制效果,并计算行驶里程(地图SDK V3.4.0以上支持);也可以通过结合高德定位帮助您记录真实行车轨迹(地图SDK V5.1.0版本以上支持)。换言之,不适合操场,公园等地方。
效果是这样的:

在这里插入图片描述

经过几次的测试,发现这个API不适合我的场景。

二、需求

如下图所示 我需要在实际测试中将下图中红色异常点滤掉,只留取蓝色正常点。
这个轨迹来源于高德地图demo:Amap3DDemo。
我就用它的轨迹来模拟跳点,进行测试。

在这里插入图片描述

算法过程:

  1. 我们的计算过程滞后运动过程,在经过点检验之后将有效点加入我们的距离计算过程。
  2. 有效点的判断是根据与权重点的距离进行判断的。
  3. 权重点的获取是通过前一个权威点与新的轨迹点根据一定权重得到的(一开始权威点选为首个轨迹点)。
  4. 轨迹的运行过程中,有效权重点只有一个,代表的是一段有效轨迹的稳定点,如果出现疑似偏移点的点,则再生成一个,代表新的这个疑似偏移点为开始的点的权重,如果这个新的疑似偏移点之后的5个点都没有偏移,则说明这段轨迹有效,则加入有效轨迹点中并更新权重点诶该点。
  5. 权重点代表着一段轨迹的最终稳定点,当它代表的轨迹点数小于5个则表明那段点可能是偏移点。则要被干掉。

在这里插入图片描述

这里选取的权重值为0.8:
W1 = P1 * 0.2 + P2 * 0.8

三、纠偏模型对异常情况的处理

图中的网格是定位间隔时间 2S 。假定连续的5个点的偏移值允许在误差范围内,则认定这5个点均为有效点。
误差范围可以根据不同的运动模式,选择不同的范围。比如走路 5m/s,跑步 10m/s, 骑行30m/s,登山 5m/s。

1.起始点有偏移

起始点为偏差过大的点,需要舍弃掉。

在这里插入图片描述

P1、P2为不可接受偏移点,但是在起始不知道,当p3出现之后,发现距离有点大,则为p3生成新的权重点w2,连续判断5个点没有偏差,说明这几个点的轨迹是正确的则采用,将w1代表的点干掉,并将w1更新到w2这里。

2.起始点无偏移,过程中有一个点偏移

红色位置P4,距离P3和P5均超过允许偏移值

在这里插入图片描述

通过权重点,可以将P4点滤掉,轨迹修复到P5正常点
这里有一个跳点p4,判定为可疑跳点之后,我们给他一个新的权重点w2,在接下来判断中发现p5相对于w2来说也是跳点,则把w2代表的点干掉,然后重新让他代表p5。在接下来的5次定位稳定,则将权重点更新为w1。

3.未采集到数据,造成的数据分割

中间一段数据缺失,整个数据分成两段。

在这里插入图片描述

所有的点均为正常点。

4.随机产生的偏移(偏移点少于连续5个)

随机出现P6、P7两个跳点

在这里插入图片描述

算法舍弃掉P6、P7两个点,从P8重新开始计算。

四、判断偏移点算法流程图

在这里插入图片描述

需要注意判断偏移值得时,需要考虑时间问题,这里每个定位点都使用本地时间戳。

五、代码实现

下面代码中使用的是高德定位,定位间隔2秒,AMapLocationClientOption属性设置如下:


    private AMapLocationClientOption getDefaultOption(){
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(false);//可选,设置是否gps优先,只有在单次定位高精度定位模式下有效有效。默认关闭
        mOption.setHttpTimeOut(10*1000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
        mOption.setNeedAddress(false);//可选,设置是否返回逆地理地址信息。默认是true
        mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
        mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
        mOption.setLocationCacheEnable(false); //可选,设置是否使用缓存定位,默认为true
        return mOption;
    }

 private BPLocationLatLng getLocation(AMapLocation aMapLocation,long currentStamp){
        BPLocationLatLng locationLatLng = new BPLocationLatLng();
        locationLatLng.latitude = aMapLocation.getLatitude();
        locationLatLng.longitude = aMapLocation.getLongitude();
        locationLatLng.altitude = (float) aMapLocation.getAltitude();
        locationLatLng.timestamp = currentStamp;
        locationLatLng.mapAccuracy = (int)( aMapLocation.getAccuracy()+0.5f);
        locationLatLng.mapSatellites = aMapLocation.getSatellites();
        return locationLatLng;
 }


  public class BPLocationLatLng implements Serializable {
    public double latitude;
    public double longitude;
    public long timestamp;
    public float altitude;
    public int mapAccuracy;
    public int mapSatellites;
 }

纠偏算法:


    private int SPORT_MAX_SPEED = 10; // 最大运动时长
    private int isFirst = 0;         // 是否是第一次定位点
    private BPLocationLatLng weight1;        // 权重点1
    private BPLocationLatLng weight2;                          // 权重点2
    private List<BPLocationLatLng> w1TempList = new ArrayList<>();     // w1的临时定位点集合
    private List<BPLocationLatLng> w2TempList = new ArrayList<>();     // w2的临时定位点集合
    private int w1Count = 0; // 统计w1Count所统计过的点数

 /**
     * 判断偏移点算法
     * @param aMapLocation 高德定位返回
     * @return 自定义稳定点的集合
     */
    private List<BPLocationLatLng> filterPos(AMapLocation aMapLocation) {
        long currentStamp = System.currentTimeMillis()/1000;
//        String filterString = currentStamp +" :";
        try {
            // 获取的第一个定位点不进行过滤
            if (isFirst < 2) {
                isFirst ++;
                if (isFirst < 2){
//                    filterString += "第一个定位点 : (容易漂移)不记录,不更新";
                    // 测试记录
                    weight1 = getLocation(aMapLocation,currentStamp);
                    return null;
                }
                float distance = AMapUtils.calculateLineDistance(
                        new LatLng(weight1.latitude, weight1.longitude),
                        new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()));
                weight1 = getLocation(aMapLocation,currentStamp);
//                filterString += "第二个定位点 : 与第一个点的距离:"+distance+", 重新开始记录,不更新 ,";
                // 将得到的第一个点存储入w1的缓存集合
                final BPLocationLatLng traceLocation = getLocation(aMapLocation,currentStamp);
                w1TempList.add(traceLocation);
                w1Count++;
                notifyFirstLocation(traceLocation);
                return null;
            } else {
                // 开始运动后,只针对GPS定位点且当前可用卫星数量>=8时才有效
                if (aMapLocation.getLocationType() == AMapLocation.LOCATION_TYPE_GPS && aMapLocation.getSatellites()>=8){
//                    filterString += "非第一次" + " : ";
//                // 过滤静止时的偏点,在静止时速度小于1米就算做静止状态
                    if (weight2 == null) {
//                        filterString += "weight2=null" + " : ";
                        // 计算w1与当前定位点p1的时间差并得到最大偏移距离D
                        long offsetTime = currentStamp - weight1.timestamp;
                        if (offsetTime == 0){
                            return null;
                        }
                        long MaxDistance = offsetTime * SPORT_MAX_SPEED;
                        float distance = AMapUtils.calculateLineDistance(
                                new LatLng(weight1.latitude, weight1.longitude),
                                new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()));
//                        filterString += "distance=" + distance + ", MaxDistance=" + MaxDistance + " : ";
                        if (distance > MaxDistance) {
//                            filterString += " distance>MaxDistance" + " 当前点 距离大: 设置w2位新的点,并添加到w2TempList";
                            // 将设置w2位新的点,并存储入w2临时缓存
                            weight2 = getLocation(aMapLocation,currentStamp);
                            w2TempList.add(weight2);
                            return null;
                        } else {
//                            filterString += " distance<MaxDistance" + " 当前点 距离小 : 添加到w1TempList";
                            // 将p1加入到做坐标集合w1TempList
                            BPLocationLatLng traceLocation = getLocation(aMapLocation,currentStamp);
                            w1TempList.add(traceLocation);
                            w1Count++;
                            // 更新w1权值点
                            weight1.latitude = weight1.latitude * 0.2 + aMapLocation.getLatitude() * 0.8;
                            weight1.longitude = weight1.longitude * 0.2 + aMapLocation.getLongitude() * 0.8;
                            weight1.timestamp = currentStamp;
//						if (w1TempList.size() > 3) {
//							filterString += "d1TempList.size() > 3" + " : 更新";
//							// 将w1TempList中的数据放入finalList,并将w1TempList清空
//							mListPoint.addAll(w1TempList);
//							w1TempList.clear();
//							return true;
//						} else {
//							filterString += "d1TempList.size() < 3" + " : 不更新";
//							return false;
//						}
                            if (w1Count > 3){
//                                filterString += " : 更新";
                                List<BPLocationLatLng> list = new ArrayList<>(w1TempList);
                                w1TempList.clear();
                                return list;
                            }else {
//                                filterString += " w1Count<3: 不更新";
                                return null;
                            }
                        }

                    } else {
//                        filterString += "weight2 != null" + " : ";
                        // 计算w2与当前定位点p1的时间差并得到最大偏移距离D
                        long offsetTimes = currentStamp - weight2.timestamp;
                        long MaxDistance = offsetTimes * SPORT_MAX_SPEED;
                        float distance = AMapUtils.calculateLineDistance(
                                new LatLng(weight2.latitude, weight2.longitude),
                                new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude()));
//                        filterString += "distance = " + distance + ",MaxDistance = " + MaxDistance + " : ";
                        if (distance > MaxDistance) {
//                            filterString += "当前点 距离大: weight2 更新";
                            w2TempList.clear();
                            // 将设置w2位新的点,并存储入w2临时缓存
                            weight2 = getLocation(aMapLocation,currentStamp);
                            w2TempList.add(weight2);
                            return null;
                        } else {
//                            filterString += "当前点 距离小: 添加到w2TempList";
                            // 将p1加入到做坐标集合w2TempList
                            BPLocationLatLng traceLocation = getLocation(aMapLocation,currentStamp);
                            w2TempList.add(traceLocation);

                            // 更新w2权值点
                            weight2.latitude = weight2.latitude * 0.2 + aMapLocation.getLatitude() * 0.8;
                            weight2.longitude = (weight2.longitude * 0.2 + aMapLocation.getLongitude() * 0.8);
                            weight2.timestamp = currentStamp;
                            if (w2TempList.size() > 4) {
                                List<BPLocationLatLng> list = new ArrayList<>();
                                // 判断w1所代表的定位点数是否>4,小于说明w1之前的点为从一开始就有偏移的点
                                if (w1Count > 4) {
//                                    filterString += "w1Count > 4" + "计算增加W1";
                                    list.addAll(w1TempList);
                                } else {
//                                    filterString += "w1Count < 4" + "计算丢弃W1";
                                    w1TempList.clear();
                                }
//                                filterString += "w2TempList.size() > 4" + " : 更新到偏移点";

                                // 将w2TempList集合中数据放入finalList中
                                list.addAll(w2TempList);
                                // 1、清空w2TempList集合 2、更新w1的权值点为w2的值 3、将w2置为null
                                w2TempList.clear();
                                weight1 = weight2;
                                weight2 = null;
                                return list;

                            } else {
//                                filterString += "w2TempList.size() < 4";
                                return null;
                            }
                        }
                    }
                }else {
                    LogUtil.wshLog().d("定位成功" + ", 类型:"+aMapLocation.getLocationType() + "  ----- 丢弃当前定位点 ---");
                    return null;
                }
            }
        } finally {
//            StringBuilder sb = new StringBuilder();
//            if(aMapLocation.getErrorCode() == 0){
//                sb.append("定位成功" + ", 类型:"+aMapLocation.getLocationType()+",");
//                sb.append("定位时间: ").append(AmapLLLLUtils.formatUTC(aMapLocation.getTime(), "yyyy-MM-dd HH:mm:ss")).append(", ");
//            } else {
//                //定位失败
//                sb.append("定位失败" + ", ");
//                sb.append("错误码:").append(aMapLocation.getErrorCode()).append(", ");
//                sb.append("错误信息:").append(aMapLocation.getErrorInfo()).append(", ");
//                sb.append("错误描述:").append(aMapLocation.getLocationDetail()).append(", ");
//            }
//            sb.append("---定位质量报告").append(": ");
//            sb.append("WIFI开关:").append(aMapLocation.getLocationQualityReport().isWifiAble() ? "开启":"关闭").append(", ");
//            sb.append("GPS状态:").append(getGPSStatusString(aMapLocation.getLocationQualityReport().getGPSStatus())).append(", ");
//            sb.append("GPS星数:").append(aMapLocation.getLocationQualityReport().getGPSSatellites()).append(", ");
//            sb.append("网络类型:").append(aMapLocation.getLocationQualityReport().getNetworkType()).append(", ");
//            sb.append("网络耗时:").append(aMapLocation.getLocationQualityReport().getNetUseTime()).append(", ");
//            filterString += ",------ "+sb.toString();
//            BPOutdoorLocationLogUtils.handleLogData(String.valueOf(startStamp),filterString);
//            LogUtil.wshLog().d(filterString);
        }
    }

测试时,可以将注释打开,打印Log输出。

六、测试、分析数据

借助高德demo中现有的定位点,手动模拟跳点,实现异常数据。

步骤:

  1. 在算法的每个关键步骤和分支判断加入记录,并保持到本地方便后续分析。
  2. 通过分析步骤之后确保算法大概的正确性。
  3. 通过定时任务模拟运动过程,重现轨迹运行过程,这时候因为有了真实数据,我们就可以将文件存储的结果,变成log打印来分析。
  4. 通过改变真实数据的各个值去模拟我们可能遇到的偏移点。(自定义生成跳点)
查看示例详情,请移步到:https://github.com/ShihooWang/TraceByAmap

欢迎交流~

高德地图上那种轨迹纠偏是如何实现的 原文地址: nyc taxi bootcamp 这里介绍一个好玩的开源项目Arctern。 这个项目好玩在哪里呢,下图是纽约出租车上车点的原始数据 我们可以看到 阅读详情

相关推荐

高德地图GPS定位飘移?5个开发者必知的优化技巧(附实测数据)

本文针对高德地图GPS定位飘移问题,为开发者提供了一套从原理到实战的系统性优化方案。通过分析定位技术原理、对比不同场景下的实测数据,详细解读了高德SDK三种定位模式的适用场景,并给出了定位类型过滤、精度阈值设定、位置平滑算法等5个核心优化技巧,帮助开发者构建更稳定精准的LBS应用。

weixin_29296241的博客 432

轨迹纠偏算法

轨迹纠偏算法是一种处理和修正GPS轨迹数据的方法。GPS定位技术可以用来确定人或物的位置,但是GPS信号本身是有误差的,因此GPS数据也是有误差的。轨迹纠偏算法的作用就是通过各种方法来修正GPS数据中的误差,使其更精确。这种算法的具体实现方式可能因不同的应用场景而有所差异,但一般来说,它都会利用额外的信息,如地图数据、道路信息、历史轨迹等,来修正GPS数据中的误差。 ...

weixin_35756624的博客 1603

历史轨迹组件性能优化案例

数据量分级处理小数据量(<1万点):直接渲染,无需抽稀。中数据量(1万-10万点):使用Douglas-Peucker抽稀+Redis缓存。大数据量(>10万点):结合分层渲染、Web Worker和Canvas。行业适配策略物流/交通:优先采用标记点聚合、行政区热力图。运动记录:侧重纠偏算法与动态抽稀。工业场景:关注运动学参数优化与实时反馈。性能监控指标核心指标:FPS≥60、内存增长率≤5%/小时、查询响应时间<1秒。工具推荐。

物物而不物于物,念念而不念于念 586

轨迹纠偏

轨迹记录、纠偏类需求强烈建议您使用高德开放平台提供的猎鹰SDK或者猎鹰服务API,后续版本的地图SDK会逐步停止轨迹纠偏接口的维护。 简介 轨迹纠偏可帮助您将您记录的行车轨迹点进行抽稀、纠偏操作,将轨迹匹配到道路上,提供平滑的绘制效果,并计算行驶里程(地图SDK V3.4.0以上支持);也可以通过结合高德定位帮助您记录真实行车轨迹(地图SDK V5.1.0版本以上支持)。 值得注意的是,目前该功能只支持将驾车轨迹纠正到路上。 结合定位轨迹纠偏(自5.2.0版本起支持) 第 1 步初始化LBS.

u010227042的博客 3938

Python实现轻量级地图匹配:GPS轨迹纠偏实战

地图匹配(Map Matching)是一种将带噪声的GPS轨迹点序列,结合路网拓扑与运动学约束,映射到真实道路路段上的空间数据校正技术。其核心原理在于建模轨迹的时序连续性、道路的拓扑连通性及车辆的运动学合理性,而非简单垂足投影或滤波平滑。该技术显著提升车载定位、导航路径还原与交通流分析的精度,广泛应用于智能网联汽车、共享出行轨迹清洗及离线GIS处理等场景。本文聚焦纯Python实现的LBMM(Link-Based Map Matching)方案,不依赖商业API,支持本地化部署与可复现验证,特别适合对隐私性

weixin_29054245的博客 251

Java后端+小程序地图定位实战:坐标系转换、Redis GEO与轨迹纠偏

在LBS应用开发中,坐标系转换与地理检索是核心基础。WGS-84、GCJ-02、BD-09三套坐标系并存,若未在入口统一,会导致定位漂移数百米。Java后端通过Redis GEO实现毫秒级“附近”查询,结合GeoHash前缀做区域聚合与逆地理编码缓存,可显著提升检索效率。小程序端采集需关注精度过滤与坐标系标记,避免脏数据入库。这些技术广泛应用于同城配送、打卡签到、附近门店等场景。本文围绕Java后端与小程序地图定位链路,详解坐标纠偏、存储选型与轨迹平滑的工程实践。

weixin_27741699的博客 303

高德地图纠偏不准,祭出我自己的纠偏算法

高德地图纠偏不准,祭出我自己的纠偏算法 背景: 最近使用高德地图用来记录轨迹的运动距离,使用的是api中的 原始点359个点,在经过纠偏后得到了了两个点,如下所示,是我整段轨迹,红色点是纠偏之后高德地图给我的点。经过测试几次之后我对这个api有点失望了,决定自己写纠偏,然后再做距离求解。

子敬的技术博客 2万+

Android集成高德定位

在Android中基于高德实现定位功能,代码很详细。

轨迹纠偏及高德和百度的webapi请求示例

轨迹纠偏及高德和百度的webapi请求示例

帅帅de三叔 1599

Android-TraceByAmap-自定义算法纠偏高德地图定位

TraceByAmap - 自定义算法纠偏高德地图定位

GPS漂移的处理算法

GPS漂移的处理算法,介绍处理GPS数据漂移的算法

GPS轨迹降噪API及算法

GPS轨迹数据异常点识别及剔除(噪点识别及降噪算法) (1)高德、百度相关API的使用方法(python调用API接口) (2)基于距离的降噪算法:原理及代码 (3)提供了包含异常点的GPS轨迹数据(JSON格式)

weixin_42639395的博客 1455

GPS轨迹纠偏算法,java代码,包含异常点检测、滤波平滑,

java编写的轨迹纠偏算法,包含异常点检测、滤波平滑,以及代码使用示例和结果分析

地图轨迹应用开发实战:Leaflet与高德SDK的性能优化指南

地图可视化是GIS(地理信息系统)和LBS(基于位置的服务)应用的核心技术,其原理在于将地理坐标数据通过地图服务渲染为可交互的图形界面。在工程实践中,开发者常需在地图底图上叠加动态轨迹线,以实现物流追踪、运动记录等场景。这一过程涉及瓦片加载、坐标转换、图形绘制等多个技术环节,其技术价值在于提供直观、实时的空间数据展示与决策支持。然而,海量轨迹点渲染易引发性能瓶颈,导致地图卡顿与轨迹闪烁。为此,需采用数据抽稀(如道格拉斯-普克算法)减少点数,并通过增量更新(如setLatLngs)避免重绘,从而在复杂网络环境

weixin_34357436的博客 348

国产HDMI2.0芯片GSV2011怎么选?手把手教你用它设计音视频采集卡(附FPGA/海思对接指南)

本文详细解析国产HDMI2.0芯片GSV2011在音视频采集卡设计中的应用,涵盖芯片选型、硬件设计要点及与FPGA/海思平台的对接指南。GSV2011凭借4K@60Hz支持、音频提取嵌入功能和高集成度,成为音视频设备的核心选择,助力开发者快速实现高性能采集卡设计。

weixin_30181209的博客 331

别再只调颜色阈值了!优化K210色块追踪性能的5个关键参数与实战技巧

本文深入探讨了K210色块追踪性能优化的五大核心策略,包括图像预处理参数精细调控、find_blobs参数进阶配置、运动控制算法升级、硬件时序优化以及可视化调试系统构建。通过实战技巧和参数调整方法,帮助开发者提升K210在色块追踪项目中的识别稳定性和响应速度,适用于云台追踪等应用场景。

weixin_42531588的博客 225

轨迹记录App是怎样对定位轨迹进行过滤、优化和平滑处理的

https://www.zhihu.com/question/39983016 卡尔曼滤波原理 卡尔曼滤波学习笔记  卡尔曼滤波的原理说明  http://www.cs.unc.edu/~welch/kalman/media/pdf/Kalman1960.pdf GPS纠偏算法,适用于google,高德体系的地图 GPS漂移过滤算法       Android实战技巧之四十二:加速度传感器 【An...

weixin_34082695的博客 2573

ISO 15118-20标准深度解读【精简篇】

ISO 15118-2 是开创者,它解决了“如何让电动汽车充电像给手机充电一样简单(即插即用且自动付费)”的问题,为行业奠定了基础。 ISO 15118-20 是革新者,它站在前者的肩膀上,回答了一个更宏大的问题:“如何让电动汽车深度融入未来的能源系统和智慧城市?” 它不仅是充电协议,更是一个车网互动的综合能源管理协议。简单来说,ISO 15118-2 是关于“如何充电”,而 ISO 15118-20 是关于“如何智慧地使用和管理电动汽车这块大电池”。

网络安全的研究者、新能源行业的追求者 1922

iOS Android 汽车实时行驶路程计算

找到的思路转载:https://blog.youkuaiyun.com/qq_36252003/article/details/73188188   第一版: 把每个定位点都记录下来,利用高德提供的工具一个个点距离相加. 如果点与点之间的距离大于1公里(就认为这个手机中途没信号了),那么这两个点就规划出一条路径. 这个方法能基本解决需求,但是因为点对点计算,每个点的精确度不一样,就算过滤掉基站定位的, 精...

zhouleizhao的专栏 1732

Linux中Hadoop 集群搭建

零、下载Hadoop: http://archive.cloudera.com/cdh5/cdh/5/?tdsourcetag=s_pctim_aiomsg 一、集群规划: 搭建的 hadoop 集群由 3 台服务器组成,分别叫做 master,salve1 和 slave2。其中 master 作为主节点,slave1 和 slave2 作为从节点。 二、网络配置: 1.查看 3 个节点的主机名...

白墨的小白博客 3990

【AI生成】 LoRa无中心自组网实现方案

LoRa技术是一种低功耗广域网通信技术,它采用了扩频频率调制技术,能够实现远距离的传输。LoRa在物联网中具有重要的应用价值,可以支持大规模的设备连接并且具有较低的成本。同时,LoRa具有高度的抗干扰能力和适应性,能够在复杂的环境中实现稳定的通信。通过使用无中心自组网实现方案,可以进一步提高LoRa网络的灵活性和可靠性,实现设备之间的智能互联。LoRa无中心自组网实现方案将为物联网应用提供更加便捷和高效的通信解决方案。LoRa无中心自组网实现方案一、无中心自组网概念及优势。

qq_31310977的博客 2088

高德地图如何用Paimon+StarRocks构建实时轨迹分析平台

流批一体架构正在成为大数据处理领域的重要趋势,它通过统一实时和离线数据处理管道,解决了传统Lambda架构的数据一致性和运维复杂度问题。Paimon作为新一代流式数据湖存储,原生支持变更日志和增量快照,特别适合轨迹数据这类高频更新的时序数据场景。结合StarRocks的实时分析能力,可以构建从数据接入到业务分析的全链路解决方案。在实际应用中,这种技术组合能够支撑千亿级轨迹数据的实时处理,满足导航优化、出行分析、商业选址等多样化业务需求,同时显著降低系统复杂度和运维成本。

weixin_34268310的博客 413

HC-05蓝牙模块详细配置、连接与使用过程

用手按着模块上的按键,再给蓝牙模块上电。当蓝牙模块上的灯慢闪的时候就说明进入了配置模式了。在配置蓝牙的时候一定要将串口助手按这个要求配置:设置波特率 38400,数据位 8 位,停止位 1 位,无校验位,这是固定操作! 根据蓝牙的主从模式进行不同的设置,二者主要区别就在于AT+ROLE这个指令如果这里没返回OK可能有一下几种情况:如果正常返回OK,那就可以进行下一步了 配置蓝牙密码的时候,特别是配置HC05,密码必须加双引号"",否则不能正常设置!!!! 给从机模式蓝牙配置好之后,将蓝牙重

qq_51688022的博客 2万+

外勤管理系统实战:电子围栏与轨迹优化技术解析

外勤管理系统通过物联网与移动计算技术解决传统人工管理的痛点。其核心技术原理包括基于射线法的电子围栏判定、改进卡尔曼滤波的轨迹优化算法,结合GPS、WiFi指纹和陀螺仪等多源数据融合。这类系统在物流配送、市政巡查等场景中,能显著提升工单处理效率(实测提升40%)和异常识别准确率(达92%)。关键技术难点在于平衡定位精度与隐私保护,以及通过量化考核模型实现管理闭环。本文以实战项目为例,详解如何通过微服务架构和智能算法构建高效的外勤管理解决方案。

weixin_29161785的博客 4

SAP ABAP 实用小技巧合集 (一)

本合集包含了笔者从事 ABAP 开发 17 年以来积累的小技巧。持续更新。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 3213

如何解除“无法完成操作 因为文件包含病毒或潜在垃圾软件”

当运行软件遇到“无法完成操作 因为文件包含病毒或潜在垃圾软件”时,如何解决?控制面板-系统和安全-Windows Defender防火墙-自定义设置,将专用网络及公用网络关闭。点击后,选择“病毒和威胁防护”-管理配置。进入安全中心后,选择“病毒和威胁防护”将需要排斥的选项输入后,保存配置即可。2:打开windows安全中心。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 6万+
上一篇: android进程通信值Messenger和AIDL的区别
下一篇: Visual Studio 2013 各个版本的产品密钥
王小_
博客等级 码龄11年 28粉丝 37原创
评论 23
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值