楼主: Canny陈
49 0

[互联网] 使用高德地图实现地理围栏 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-4-6
最后登录
2018-4-6

楼主
Canny陈 发表于 2025-11-25 10:02:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

地理围栏(Geo-fencing)是LBS服务中的一项重要技术,它通过在地图上设定一个虚拟的边界区域,实现对设备位置变化的监控。当用户的移动设备进入、离开某一特定地理范围,或在该区域内产生活动时,系统可自动触发通知或执行预设操作。这项技术广泛应用于位置社交、智能提醒、物流追踪等领域。例如,用户一到达某商圈,即可收到商家推送的优惠信息。

在实际开发过程中,使用高德地图等平台实现地理围栏功能,需要特别关注地理坐标系的一致性问题,以确保定位精度和围栏判断的准确性。

常见地理坐标系及其特点

我们通常使用经纬度来标识地理位置,但不同数据源提供的坐标可能基于不同的坐标体系,这会导致位置偏移,影响应用效果。以下是几种常见的坐标系统:

  • WGS-84:全称为“世界大地测量系统1984”,是全球通用的标准坐标系,GPS设备直接获取的原始经纬度即为此格式。大多数国际地图服务及底层定位接口(如HTML5 Geolocation、iOS/Android原生API)返回的数据均为WGS-84坐标。
  • GCJ-02:又称“火星坐标系”,由中国国家测绘局制定,是在WGS-84基础上加入非线性加密偏移后的结果。根据国家规定,所有在中国大陆公开发布的地理数据必须经过GCJ-02加密处理。因此,高德地图、腾讯地图以及谷歌中国区地图均采用此坐标系。
  • BD-09:百度地图专用的坐标系统,其在GCJ-02的基础上再次进行了额外变换,主要目的是增强用户隐私保护。从百度地图相关接口获取的坐标属于BD-09类型。

常用坐标系对照表

坐标系 坐标格式 说明
WGS84[lng,lat]世界通用坐标系,GPS设备输出的标准经纬度
GCJ02[lng,lat]国测局加密坐标系,用于高德、阿里云、搜搜地图等
BD09[lng,lat]百度地图使用的经纬度坐标
BD09LL[lng,lat]与BD09相同
BD09MC[x,y]百度米制坐标,单位为米
BD09Meter[x,y]同BD09MC
Baidu[lng,lat]BD-09别名
BMap[lng,lat]百度地图坐标系别名
AMap[lng,lat]高德地图坐标,等同于GCJ-02
WebMercator[x,y]墨卡托投影坐标,即EPSG:3857,单位为米
WGS1984[lng,lat]WGS-84别名
EPSG4326[lng,lat]WGS-84标准编号,与WGS84一致
EPSG3857[x,y]Web Mercator投影,常用于在线地图展示
EPSG900913[x,y]同WebMercator

地理围栏中的GeoJSON数据结构

地理围栏的数据通常遵循RFC 7946规范,采用GeoJSON格式进行描述。这种格式支持多种几何对象和特征集合,适用于表达复杂的地理区域。

GeoJSON中最基本的对象类型包括:

GeoJSON
对象 和
Feature
对象, 其中每一个对象由 geometry(几何体)和 properties(属性)组成。

支持的几何类型有:

Point
MultiPoint
LineString
MultiLineString
Polygon
MultiPolygon
GeometryCollection

每个地理围栏特征都应在属性中包含一个唯一的标识字段:

geometryId
,用于识别不同的围栏区域。

对于使用点(Point)、多点(MultiPoint)、线(LineString)、多线(MultiLineString)等作为几何类型的特征,必须在其属性中定义:

radius
,表示该点为中心的监测半径。该值以米为单位,取值范围限定在1至10000之间。

而像面(Polygon)和多面(MultiPolygon)这类封闭区域,则不需要设置半径属性,因为其边界已由坐标点明确界定。

polygon
multipolygon
类型的几何对象不包含
radius
属性。

此外,

validityTime
是一个可选的时间控制属性,允许开发者为地理围栏设置有效时间段或过期时间。若未设置此项,则默认该围栏数据长期有效且永不过期。

当请求查询的时间晚于

expiredTime
所指定的过期时刻,系统将不再匹配该围栏数据,并将其 geometryId 添加到响应结果中的
expiredGeofenceGeometryId
数组中,表示已失效。

validityPeriod
则用于定义围栏生效的时间区间列表。如果当前请求时间
userTime
不在任何一个有效时段内,即使位置符合条件,也不会触发围栏事件。

FeatureCollection
对象 和
Feature
对象 同样属于GeoJSON的核心组成部分,分别代表地理要素集合与独立要素。
FeatureCollection
对象可用于组织多个围栏形成一组管理单元。

当某条地理围栏数据的值超出其设定的有效时段时,该数据将被认定为无效,系统不会对其进行查询。此类地理围栏的 geometryId 将包含在地理围栏响应的数组中。

invalidPeriodGeofenceGeometryId

validityPeriod 元素属性说明

下表列出了 validityPeriod 所包含的各项属性及其定义:

名称 类型 必需 说明
startTime datetime 有效时段的起始时间。
endTime datetime 有效时段的结束时间。
recurrenceType 字符串 false 表示时段重复的类型,可选值包括:
Daily
Weekly
Monthly
Yearly
。 默认值为
Daily
businessDayOnly Boolean false 用于标识该数据是否仅在工作日有效。默认值为
false

所有坐标均按照“经度,纬度”的格式进行表示,符合以下规范:

WGS84

对于包含以下特征类型的每个元素 ——

MultiPoint
MultiLineString
MultiPolygon
GeometryCollection
,其属性将统一应用于该特征中的所有组成部分。例如,在
MultiPoint
中的所有点都将使用相同的半径,生成多个圆形地理隔离区域。

GeoJSON 标准支持的几何类型

根据 GeoJSON 规范,仅支持以下几何类型:

  • 点 (Point)
  • 线 (LineString)
  • 多边形 (Polygon)
  • 点集合 (MultiPoint)
  • 线集合 (MultiLineString)
  • 多边形集合 (MultiPolygon)
  • 空间数据集合 (GeometryCollection)

示例数据结构

点 (Point)
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [125.6, 10.1]
},
"properties": {
"name": "Dinagat Islands"
}
}
线 (LineString)
{
"type": "LineString",
"coordinates": [
[30.0, 10.0], [10.0, 30.0], [40.0, 40.0]
]
}
多边形 (Polygon)
{
"type": "Polygon",
"coordinates": [
[[30.0, 10.0], [40.0, 40.0], [20.0, 40.0], [10.0, 20.0], [30.0, 10.0]]
]
}
{
"type": "Polygon",
"coordinates": [
[[35.0, 10.0], [45.0, 45.0], [15.0, 40.0], [10.0, 20.0], [35.0, 10.0]],
[[20.0, 30.0], [35.0, 35.0], [30.0, 20.0], [20.0, 30.0]]
]
}
点集合 (MultiPoint)
{
"type": "MultiPoint",
"coordinates": [
[10.0, 40.0], [40.0, 30.0], [20.0, 20.0], [30.0, 10.0]
]
}
线集合 (MultiLineString)
{
"type": "MultiLineString",
"coordinates": [
[[10.0, 10.0], [20.0, 20.0], [10.0, 40.0]],
[[40.0, 40.0], [30.0, 30.0], [40.0, 20.0], [30.0, 10.0]]
]
}
多边形集合 (MultiPolygon)
{
"type": "MultiPolygon",
"coordinates": [
[
[[30.0, 20.0], [45.0, 40.0], [10.0, 40.0], [30.0, 20.0]]
],
[
[[15.0, 5.0], [40.0, 10.0], [10.0, 20.0], [5.0, 10.0], [15.0, 5.0]]
]
]
}
{
"type": "MultiPolygon",
"coordinates": [
[
[[40.0, 40.0], [20.0, 45.0], [45.0, 30.0], [40.0, 40.0]]
],
[
[[20.0, 35.0], [10.0, 30.0], [10.0, 10.0], [30.0, 5.0], [45.0, 20.0], [20.0, 35.0]],
[[30.0, 20.0], [20.0, 15.0], [20.0, 25.0], [30.0, 20.0]]
]
]
}
空间数据集合 (GeometryCollection)
{
"type": "GeometryCollection",
"geometries": [
{
"type": "Point",
"coordinates": [40.0, 10.0]
},
{
"type": "LineString",
"coordinates": [
[10.0, 10.0], [20.0, 20.0]
]
}
]
}
[
[10.0, 10.0], [20.0, 20.0], [10.0, 40.0]
],
[
[40.0, 40.0], [20.0, 45.0], [45.0, 30.0], [40.0, 40.0]
]
]
}
},
{
"type": "Polygon",
"coordinates": [
[
[[40.0, 40.0], [20.0, 45.0], [45.0, 30.0], [40.0, 40.0]]
]
]
}
]

GeoJSON 扩展支持:圆形与矩形

尽管标准的 GeoJSON 规范并未原生支持圆形和矩形这两种几何类型,但在实际开发中,常通过扩展方式实现。以下为常见自定义表示方法。

圆形 (Circle)

由于 GeoJSON 不直接支持圆形,通常使用点(Point)对象结合特定属性来扩展表示。

Circle

用于表示圆形的几何结构需满足以下条件:

  • 圆心 (Center):以 Point 类型的坐标表示圆心位置。
    GeoJSON Point
  • 半径 (Radius):通过属性字段定义半径大小,
    radius
    其值以米为单位,且数据类型必须为数值型(Number)。
    GeoJSON Feature
    double
  • 子类型 (subType):必须在属性中包含
    subType
    字段,并将其设置为 "Circle",以标识该要素为圆形。 此字段属于
    GeoJSON Feature
    的一部分。

示例 GeoJSON 片段如下:

{
  "type": "Feature",
  "geometry": {
    "type": "Point",
    "coordinates": [-122.126986, 47.639754]
  },
  "properties": {
    "subType": "Circle",
    "radius": 500
  }
}
GeoJSON Point Feature
GeoJSON Feature

矩形 (Rectangle)

同样,矩形也非标准 GeoJSON 支持的几何类型,一般通过多边形(Polygon)进行扩展表达。

Rectangle

此类结构主要被 Web SDK 中的“绘图工具”模块所采用。

使用 Polygon 表示矩形时,应遵循以下规则:

  • 内角坐标:矩形的四个角由五个坐标点定义,
    GeoJSON Polygon
    其中首尾坐标相同,用于闭合多边形环。这些点默认按顺序排列,开发者可根据需要旋转或调整方向。
  • 子类型 (subType):必须在 properties 中声明
    subType
    属性,作为
    GeoJSON Feature
    的一部分,其值设为 "Rectangle"

示例代码如下:

{
  "type": "Feature",
  "geometry": {
    "type": "Polygon",
    "coordinates": [[[5,25],[14,25],[14,29],[5,29],[5,25]]]
  },
  "properties": {
    "subType": "Rectangle"
  }
}
GeoJSON Polygon Feature

高德地图中的地理围栏功能

高德地图提供多种 API 工具支持地理围栏的创建与管理,主要包括以下几类:

  • GeoJSON 工具类
  • 编辑器工具类
  • 鼠标工具插件
AMap.GeoJSON
AMap.PolyEditor
AMap.PolygonEditor
AMap.CircleEditor
AMap.RectangleEditor
AMap.EllipseEditor
AMap.BezierCurveEditor
AMap.MouseTool

1. GeoJSON 工具类

该类可用于解析符合标准格式的 GeoJSON 数据。但需注意,仅支持特定结构形式的数据输入。

FeatureCollection

使用示例如下:

const geoJson = new AMap.GeoJSON({
  geoJSON: geoJsonObject,
  getMarker: function (geoJson, lngLats) {
    console.log('点', lngLats);
  },
  getPolyline: function (geoJson, lngLats) {
    console.log('线', lngLats);
  },
  getPolygon: function (geoJson, lngLats) {
    console.log('面', lngLats);
  },
});

2. 矢量图形类

通过 AMap.Polygon 创建多边形覆盖物,可实现自定义围栏区域。

function createPolygon(path: any, addToMap: boolean, fitView: boolean) {
  const polygon = new AMap.Polygon({
    path: path,
    strokeColor: '#FF33FF',
    strokeWeight: 6,
    strokeOpacity: 0.2,
    fillOpacity: 0.4,
    fillColor: '#1791fc',
    zIndex: 50,
  });

  polygon.on('mouseover', () => {
    polygon.setOptions({
      fillOpacity: 0.7,
      fillColor: '#7bccc4'
    });
  });

  polygon.on('mouseout', () => {
    polygon.setOptions({
      fillOpacity: 0.5,
      fillColor: '#ccebc5'
    });
  });

  if (addToMap) {
    map.add(polygon);
  }

  if (fitView) {
    setFitView();
  }

  currentGeofence = polygon;
  return polygon;
}

3. 编辑器工具类

提供可视化编辑能力,便于用户交互式绘制和修改地理围栏形状,常配合地图实例进行集成使用。

它支持多种图形绘制,包括:圆形、折线、多边形、贝塞尔曲线、椭圆和矩形。 尽管圆形与矩形的绘制实现较为简单,但在实际应用中真正具备广泛用途的是: **多边形** ```javascript // 编辑多边形 function editPolygon(path: any, open: boolean) { closePolygonEditor(); // 创建编辑器实例 polygonEditor = new AMap.PolyEditor(map); if (path.length > 0) { const polygon = createPolygon(path, true, false); // 启用吸附功能 polygonEditor.addAdsorbPolygons(polygon); // 设定当前编辑目标 polygonEditor.setTarget(polygon); // 双击时开启编辑模式 polygon.on('dblclick', () => { polygonEditor.setTarget(polygon); polygonEditor.open(); }); } else { polygonEditor.setTarget(); } // 监听新增节点事件 polygonEditor.on('add', function (event) { console.log(event); const polygon = event.target; polygonEditor.addAdsorbPolygons(polygon); polygon.on('dblclick', () => { polygonEditor.setTarget(polygon); polygonEditor.open(); }); }); // 编辑结束后的回调 polygonEditor.on('end', function (event) { const paths = event.target.getPath(); console.log('结束多边形编辑', event.target, paths); }); // 根据参数决定是否立即开启编辑 if (open) polygonEditor.open(); } ``` 特别注意以下几点: - 绘制生成的路径必须**倒序读取**,这是因为标准 GeoJSON 遵循右手法则,确保面域方向正确。 - 生成的路径默认**未闭合**,因此在使用前需手动确保起始点与终点为同一坐标点,以形成封闭区域。 - 若希望数据能被
AMap.GeoJSON
正确解析,则必须将 GeoJSON 数据按照特定结构进行封装,具体格式应符合
FeatureCollection
所定义的标准。 关于鼠标工具插件的说明: 该插件在实际开发中实用性较低,存在操作不稳定、功能冗余等问题,建议不再使用,可直接通过核心绘图接口实现所需功能。 参考资料: - 地理围栏技术 - GeoJSON 官方 Wiki - GeoJSON Viewer 工具 - geojson.io 在线编辑平台 - 高德地图 JS API 参考手册 - 高德地图 JS API 示例文档
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:高德地图 Coordinates coordinate Collection Properties

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-4 10:19