Flutter for OpenHarmony:maps_toolkit 地理空间计算工具箱,无需地图 SDK 也能玩转 GIS(距离、面积、点线关系) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:maps_toolkit 地理空间计算工具箱,无需地图 SDK 也能玩转 GIS(距离、面积、点线关系) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net

在这里插入图片描述

前言

在地图应用开发中,我们经常需要计算两个坐标点之间的距离(如打车预估)、判断一个点是否在围栏内(电子围栏)、或者计算多边形的面积(地块测量)。虽然 Google Maps 或百度地图 SDK 提供了这些功能,但它们体积庞大且依赖原生/网络。

maps_toolkit 是 Google Maps Android Utility Library 的纯 Dart 移植版。它包含了一系列轻量级、高性能的几何与球面计算算法,完全不依赖任何地图 SDK,即可进行复杂的 GIS 运算。

一、概念介绍/原理解析

1.1 基础概念

  • LatLng: 经纬度坐标 (latitude, longitude)。
  • SphericalUtil (球面工具): 计算大圆距离 (Haversine)、方位角、插值点。
  • PolygonUtil (多边形工具): 判断点在多边形内/外、是否在线段附近、面积计算。

计算距离 (球面曲率)

计算方位角

包含性判定

计算面积

坐标点 A

坐标点 B

多边形区域

坐标点 P

输出结果 (平方米)

1.2 进阶概念

地球不是完美的球体,maps_toolkit 默认采用 WGS84 椭球模型进行近似计算,精度足以满足绝大多数民用场景。

二、核心 API/组件详解

2.1 基础用法

计算两点距离。

import'package:maps_toolkit/maps_toolkit.dart';voidmain(){final p1 =LatLng(39.9042,116.4074);// 北京final p2 =LatLng(31.2304,121.4737);// 上海// 计算直线(大圆)距离,单位:米final distance =SphericalUtil.computeDistanceBetween(p1, p2);print('距离: ${(distance /1000).toStringAsFixed(2)} km');// ~1067 km}
在这里插入图片描述

2.2 电子围栏判定

判断用户位置是否在指定区域内。

bool checkGeofence(LatLng user,List<LatLng> polygon){// geodesic: true 表示考虑地球曲率(更精确),false 视为平面returnPolygonUtil.containsLocation(user, polygon,true);}
在这里插入图片描述

2.3 面积计算

double area =SphericalUtil.computeArea(polygonPoints);print('面积: $area 平方米');
在这里插入图片描述

三、常见应用场景

3.1 场景 1:打卡签到

判断员工 GPS 坐标是否在公司大楼圆心 100 米范围内。

bool canCheckIn(LatLng userPos,LatLng officePos){// 计算两点间距离(单位:米)final distance =SphericalUtil.computeDistanceBetween(userPos, officePos);return distance <=100;// 100米内允许打卡}

3.2 场景 2:共享单车禁停区

判断停车点是否位于红色的多边形禁停区内。

bool isForbiddenParking(LatLng bikePos){// 定义禁停区域(多边形顶点)final forbiddenZone =[LatLng(39.90,116.30),LatLng(39.91,116.30),LatLng(39.91,116.31),LatLng(39.90,116.31),];// true 表示测地线模式(考虑地球曲率)returnPolygonUtil.containsLocation(bikePos, forbiddenZone,true);}

3.3 场景 3:运动轨迹平滑

收到一系列稀疏的 GPS 点,利用插值算法(Interpolate)补充中间点,使路线更平滑。

List<LatLng>smoothPath(LatLng start,LatLng end){List<LatLng> path =[];// 在起点和终点之间插值 10 个点for(double f =0; f <=1.0; f +=0.1){ path.add(SphericalUtil.computeOffset(start,0,0));// 注意:maps_toolkit 的插值通常用 interpolate// 修正:使用 interpolate 方法 path.add(SphericalUtil.interpolate(start, end, f));}return path;}

四、OpenHarmony 平台适配

4.1 纯 Dart 实现

完全无原生依赖。

4.2 坐标系转换

国内地图常通过 GCJ-02 (火星坐标) 或 BD-09 (百度坐标) 加密。maps_toolkit 基于标准 WGS-84。如果输入源是高德/百度,务必先转换为 WGS-84,否则计算偏差可能达数百米。虽然库本身未内置转换,但社区有很多 Dart 实现。

五、完整示例代码

本示例构建一个简单的地理工具箱,包含距离计算器和围栏检测器。

import'package:flutter/material.dart';import'package:maps_toolkit/maps_toolkit.dart';voidmain(){runApp(constMaterialApp(home:GeometryPage()));}classGeometryPageextendsStatefulWidget{constGeometryPage({super.key});@overrideState<GeometryPage>createState()=>_GeometryPageState();}class _GeometryPageState extendsState<GeometryPage>{// 模拟故宫多边形围栏 (简化版)finalList<LatLng> _forbiddenZone =[LatLng(39.9221,116.3908),// 西北LatLng(39.9221,116.4025),// 东北LatLng(39.9130,116.4025),// 东南LatLng(39.9130,116.3908),// 西南];final _userPos =LatLng(39.9160,116.3970);// 在故宫内final _testDistPos =LatLng(39.9087,116.3975);// 天安门广场 (南侧)String _status ='';String _distanceInfo ='';@overridevoidinitState(){super.initState();_check();}void_check(){// 1. 围栏检测 bool inside =PolygonUtil.containsLocation(_userPos, _forbiddenZone,true);// 2. 距离计算 num dist =SphericalUtil.computeDistanceBetween(_userPos, _testDistPos);setState((){ _status = inside ?'⚠️ 在禁飞区内 (故宫)':'✅ 安全区域'; _distanceInfo ='距天安门广场: ${dist.toStringAsFixed(1)} 米';});}@overrideWidgetbuild(BuildContext context){returnScaffold( appBar:AppBar(title:constText('GIS 工具箱')), body:Center( child:Column( mainAxisAlignment:MainAxisAlignment.center, children:[constIcon(Icons.map, size:80, color:Colors.blue),constSizedBox(height:20),Text('当前位置: ${_userPos.latitude}, ${_userPos.longitude}'),constSizedBox(height:10),Container( padding:constEdgeInsets.all(16), color: _status.contains('⚠️')?Colors.red[100]:Colors.green[100], child:Text(_status, style:constTextStyle(fontSize:20, fontWeight:FontWeight.bold)),),constSizedBox(height:20),Text(_distanceInfo),constSizedBox(height:40),Text('围栏面积: ${SphericalUtil.computeArea(_forbiddenZone).toStringAsFixed(0)} m²', style:constTextStyle(color:Colors.grey),),],),),);}}
在这里插入图片描述

六、总结

maps_toolkit 剥离了地图 SDK 中最通用的数学部分。如果你的应用只需后台判断位置关系而不需要展示地图(如地理围栏服务),它是最佳选择。

最佳实践

  1. 坐标系:始终明确你使用的坐标系(WGS84 vs GCJ02)。
  2. 精度:对于小范围(如室内),平面几何计算可能比球面计算更快且误差可忽略;但跨城市必须用球面计算。
  3. 多边形简化:围栏点数过多会影响性能,可用道格拉斯-普克算法(Douglas-Peucker)简化轨迹。

Read more

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队

OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队 完整教程:https://awesome.tryopenclaw.asia/docs/04-practical-cases/15-solo-entrepreneur-cases.html 16.1 为什么需要多 Agent? 作为超级个体创业者,你可能需要不同类型的 AI 助手来处理不同的工作: * 主助理:使用最强大的模型(Claude Opus)处理复杂任务 * 内容创作助手:专注于文章写作、文案创作 * 技术开发助手:处理代码开发、技术问题 * AI 资讯助手:快速获取和整理 AI 行业动态 传统的单 Agent 模式需要频繁切换模型和上下文,效率低下。多 Agent 模式让你可以同时拥有多个专业助手,各司其职。

By Ne0inhk
AI小白也能快速用五分钟复现的ERNIE-4.5系列模型单卡部署与心理健康机器人实战案例

AI小白也能快速用五分钟复现的ERNIE-4.5系列模型单卡部署与心理健康机器人实战案例

* 本文重点在于文心大模型的微调 * 一起来轻松玩转文心大模型吧👉一文心大模型免费下载地址: https://ai.gitcode.com/theme/1939325484087291906 计算机配置 * 在国内部署选个自带CUDA的会快一点,不自带还得去NVIDIA下载,而其提供的CUDA依赖需要科学上网才能下载快。换阿里清华源也没用。 * 文心模型汇总 环境配置与部署 1. 更换镜像源(使用阿里云镜像源): sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's|http://archive.ubuntu.com/ubuntu|http://mirrors.aliyun.com/ubuntu|g' /etc/apt/sources.

By Ne0inhk

FPGA仿真加速器——Matlab一键生成.mif/.txt/.coe文件(函数封装与实战应用)

1. 为什么需要Matlab一键生成FPGA配置文件 做FPGA开发的朋友们都知道,每次仿真测试都要手动准备各种初始化文件,这个流程真的太繁琐了。我记得刚开始接触FPGA的时候,每次都要重复写生成.mif、.txt、.coe文件的代码,不仅浪费时间,还容易出错。后来我就想,能不能把这些操作封装成一个函数,需要的时候直接调用就好了? .mif和.coe文件在FPGA设计中特别重要,它们是存储器的初始化文件。比如做DDS信号发生器时,需要把波形数据预先存储在ROM中;设计FIR滤波器时,要把滤波系数加载到RAM里。这些场景都离不开这两种文件。而.txt文件则是Matlab和FPGA联合仿真的桥梁,测试数据通过txt文件传递,方便我们做数据对比和性能分析。 手动创建这些文件不仅效率低,还容易出错。特别是当数据量很大时,人工核对几乎不可能。所以我花了些时间把这些功能封装成一个Matlab函数,现在只需要一行代码就能生成三种格式的文件,大大提升了开发效率。 2. 深入理解三种文件格式的特点与差异 2.1 MIF文件格式详解 MIF文件是Memory Initialization F

By Ne0inhk
windows部署的OpenClaw接入飞书机器人

windows部署的OpenClaw接入飞书机器人

文章目录 * 前言 * 一、创建飞书应用 * 1.登录飞书开放平台 * 2.创建企业自建应用 * 3.发布企业自建应用 * 二、OpenClaw配置接入飞书 * 1.安装飞书插件 * 2.配置飞书事件回调 * 3.使用测试 * 总结 前言 OpenClaw 原生支持的即时通信平台主要是海外的 WhatsApp、Telegram、Discord、Slack、iMessage 等,国内用户不习惯,目前国产即时通信软件大厂也跟进了,现在钉钉,飞书等都已支持接入OpenClaw,本文主要是配置飞书机器人接入 OpenClaw,使大家可以通过飞书即可指挥OpenClaw为我们干活,当然配置钉钉接入也可以作为参考。 * windowsWindows 本地(PowerShell)一键部署 OpenClaw * 飞书账号(有飞书开放平台权限的账号) 一、创建飞书应用 1.登录飞书开放平台 1.1 网页访问,

By Ne0inhk