显示你的位置
https://developers.arcgis.com/javascript/latest/tutorials/display-your-location/
概览
学习在地图上发现与追踪你的设备位置.
简单的说就是手机设备上的 H5 Geolocation API 可以获得用户的定位 (经纬度), 然后利用 ArcGIS 来显示当前位置.
其中使用到了 Locate 和 Track 小部件.
需要注意的是, 必须在 https 下运行. 可以借助与
localhost
来实现
要点
- 使用 H5 的 API 获取经纬度
- 使用 Locate 小部件来显示定位, 通过实现 goToOverride
- 使用 Track 小部件来显示定位,使用 Graphic 来显示位置
补充: Geolocation API 的使用
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition((pos: GeolocationPosition) => {
console.log('定位坐标: ', pos);
})
} else {
console.log('浏览器不支持 Geolocation 接口')
}
基本步骤
- 创建项目
- 获取 APIKey
- 修改 basemap 和 map position
- 获得你的位置
- 跟踪你的位置
- 运行 App
详细步骤
创建项目 (略)
设置 api key (略)
修改 basemap
以及地图的位置
在 map 对象中, 将 basemap
设置为 arcgis/navigation
, 该 basemap 为定位做了优化. 并设置视图中的 缩放与经纬度.
const map = new Map({
basemap: 'arcgis/navigation'
})
const view = new MapView({
map: map,
container: div.value,
center: [-40, 28],
zoom: 2
})
发现你的位置
Find your geolocation
ArcGIS 提供了 Locate
小部件 (widget), 该小部件使用 H5 的 API, 获得浏览器的定位. 将其添加到地图中, 使用该小部件来获取你的位置.
基本方式:
- 实例化小部件, 并进行配置.
- 调用 view (
MapView
实例)的ui.add
方法将其添加到页面中.
import Locate from '@arcgis/core/widgets/Locate'
const locate = new Locate({
view: view,
useHeadingEnabled: false, // 控制地图不会旋转
goToOverride: function (view, options) {
options.target.scale = 1500 // 设置缩放比
return view.goTo(options.target) // 定位
}
})
view.ui.add(locate, 'top-left')
然后运行程序即可看到定位工具, 点击后即可进行定位, 当前位置会在一个蓝色小点上呈现, 单击小点有额外操作.
跟踪你的位置
Track your location
Track
小部件可以跟踪你的位置, 并且默认会根据设备情况旋转地图.
通常只需要一个地理定位小部件, 因此移除 Locate
小部件, 添加 Track
小部件
const track = new Track({
view: view,
graphic: new Graphic({
symbol: {
type: "simple-marker",
size: "12px",
color: "green",
outline: {
color: "#efefef",
width: "1.5px"
}
}
}),
useHeadingEnabled: false
});
view.ui.add(track, "top-left");
jk: 这里对这个类, 属性都有一些盲点
在 TS 的语法校验下, 该代码会报错, 语法校验显示只允许有 color 属性.
2023年11月13日 原因已找到, ArcGis 遵循了 OOP 语言描述的类结构, 这里的 Symbol, Geometry 等都是抽象类, 需要具体的类来实现, 而具体类中已经定义了只读的 type 等属性, 而抽象类中有没有一些公共属性, 所以会报错. 这里是因为使用
SimpleMarkerSymbol
类型, 这里使用构造函数来实例化对象, 写成下面样子就可以了:import SimpleMarkerSymbol from '@arcgis/core/symbols/SimpleMarkerSymbol' // ... const track = new Track({ view: view, graphic: new Graphic({ symbol: new SimpleMarkerSymbol({ // type: "simple-marker", // 类型中已内置, 不用提供该属性 size: "12px", color: "green", outline: { color: "#efefef", width: "1.5px" } }) }), useHeadingEnabled: false }); view.ui.add(track, "top-left");
置于类型引用的路径可以通过查阅文档来参考:
然后运行程序:
注意, 好像手机上要获取定位信息, 需要使用
https
协议.