mapbox - 将点(或 PointLike)转换为 LngLat 对象
问题描述
我有一个 mapbox 地图,我想添加一个固定标记。“固定”是指在absolute
地图 div 容器方面如此固定的东西。
例子:
(0,0) (200,0)
+-------------+
| |
| |
| |
| * |
| |
| |
| |
+-------------+
(0,300) (200, 300)
在这种情况下,标记 * 位于地图的中心,因此我可以使用:
.marker {
position: absolute;
top: 50%;
left: 50%
}
然后使用getCenter()
:
const lngLatObj = map.getCenter()
但是,如果我希望标记不在中心,而是在左侧 20% 和顶部 90% 处?
(0,0) (200,0)
+-------------+
| |
| |
| |
| |
| |
| |
| * |
+-------------+
(0,300) (200, 300)
在这里,您可以看到地图容器和该地图*
上的标记。
假设我有 的像素坐标*
,如何找到该点的经度和纬度?
我想像:
const x = 40
const y = 270
const point = new mapboxgl.Point(x, y)
const lngLat = point.??
我没有鼠标或触摸事件。该点是固定的,但用户可以缩放和平移地图。
使用标记我的意思不是一个地图框Marker
,而是一个简单的 div 元素。
非常感谢
这是一个可重现的例子
解决方案
如果您知道像素的宽度和高度以及该点的像素坐标,则可以根据宽度/高度的百分比计算相应的纬度/经度值,并使用这些值来抵消地图框的LngLatBounds。
根据所需的精度,一个简单的插值可能会做到这一点:
var width = 200;
var height = 300;
var x = 40;
var y = 270;
var xPercentage = x / width;
var yPercentage = y / height;
var bounds = map.getBounds();
var long = bounds.getEast() + (xPercentage * (bounds.getEast() - bounds.getWest()));
var lat = bounds.getNorth() + (yPercentage * (bounds.getNorth() - bounds.getSouth()));
如果您需要更高的精度,则必须使用球面计算,但方法是相同的。
推荐阅读
- sql - 替换 Firebird 中的空格
- swift - 使用 ReusableKit swift 注册 UITableViewCell
- sql - SQL 从两个等于相同搜索结果的字段中选择结果
- python - 在机器人框架中定义一个关键字以仅在失败时调用
- laravel - Laravel 8.x,3 个模型和多对多关系
- angular - 仅当 Rxjs 轮询上的某些属性更改时才调度 NgRx 操作
- bash - 将容器的环境变量用于命令谎言
- windows - 如何使用 grafana 在 Windows 10 上监控 POS 应用程序并在应用程序关闭时发送警报
- pine-script - 带 SMA 功能的偏移量
- yii2 - 如何在记录更新中隐藏 TIME 值?