Mapbox GL JS 在一定 zoom/distance 后不渲染图层
Mapbox GL JS does not render layers after a certain zoom/distance
我有一张用 mapbox-gl
渲染的地图,只有两层,一个标记和一个以点为中心的圆。该距离是动态的,因为它基于以米为单位的预定义距离。
但是在放大并远离中心后,图层突然从地图渲染中消失。我已经尝试在 geojson 源上实现 maxzoom 并将容差设置为 0,但是在距中心一定 zoom/distance 之后,图层似乎仍然消失了。
显示平移时发生的情况的 GIF:https://imgur.com/a/fzfX6z7
我是否遗漏了 improve/enlarge 渲染距离的某些属性?我不打算使用很多点,所以性能应该不是这个用例的问题。
<template>
<div id="mapContainer" class="basemap"></div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import mapboxgl, { CircleLayer } from 'mapbox-gl'
export default defineComponent({
name: 'Map',
mounted: function () {
mapboxgl.accessToken =
'abc'
const map: mapboxgl.Map = new mapboxgl.Map({
container: 'mapContainer',
style: 'mapbox://styles/mapbox/streets-v11',
center: [101.58165, 3.03837],
zoom: 13,
maxZoom: 17
})
const geofence = [
{
name: 'Location 1',
lat: 3.037479466090297,
lng: 101.58102250675641,
distance: 1000
}
]
map.on('load', function () {
map.loadImage('https://docs.mapbox.com/mapbox-gl-js/assets/custom_marker.png', function (error, image) {
if (error) throw error
if (image) {
map.addImage('custom-marker', image)
map.addSource('points', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [geofence[0].lng, geofence[0].lat]
},
properties: {
title: geofence[0].name,
distance: geofence[0].distance
}
},
maxzoom: 22,
tolerance: 0
})
map.addLayer({
id: 'points',
type: 'symbol',
source: 'points',
layout: {
'icon-image': 'custom-marker',
'text-field': ['get', 'title'],
'text-font': ['Open Sans Semibold'],
'text-offset': [0, 1.25],
'text-anchor': 'top'
}
})
const circleLayer: CircleLayer = {
id: 'geofence',
type: 'circle',
source: 'points',
paint: {
'circle-radius': {
stops: [
[0, 0],
[21, metersToPixelsAtMaxZoom(geofence[0].distance, geofence[0].lat)]
],
base: 2
},
'circle-opacity': 0.5,
'circle-color': 'blue',
'circle-stroke-width': 2,
'circle-stroke-color': 'black'
}
}
map.addLayer(circleLayer)
}
})
})
}
})
const metersToPixelsAtMaxZoom = (meters: any, latitude: any) => meters / 0.075 / Math.cos((latitude * Math.PI) / 180)
</script>
<style lang="scss">
#mapContainer {
width: auto;
height: 400px;
}
</style>
显示的代码是在 TypeScript 中,但我相信删除类型也会同样呈现它。
我认为您遇到了 Mapbox GL JS 并不真正支持的边缘情况。
处理此问题的更好方法是使用 TurfJS 创建具有 circle()
的多边形并将其添加为 geojson
层。
我有一张用 mapbox-gl
渲染的地图,只有两层,一个标记和一个以点为中心的圆。该距离是动态的,因为它基于以米为单位的预定义距离。
但是在放大并远离中心后,图层突然从地图渲染中消失。我已经尝试在 geojson 源上实现 maxzoom 并将容差设置为 0,但是在距中心一定 zoom/distance 之后,图层似乎仍然消失了。
显示平移时发生的情况的 GIF:https://imgur.com/a/fzfX6z7
我是否遗漏了 improve/enlarge 渲染距离的某些属性?我不打算使用很多点,所以性能应该不是这个用例的问题。
<template>
<div id="mapContainer" class="basemap"></div>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import mapboxgl, { CircleLayer } from 'mapbox-gl'
export default defineComponent({
name: 'Map',
mounted: function () {
mapboxgl.accessToken =
'abc'
const map: mapboxgl.Map = new mapboxgl.Map({
container: 'mapContainer',
style: 'mapbox://styles/mapbox/streets-v11',
center: [101.58165, 3.03837],
zoom: 13,
maxZoom: 17
})
const geofence = [
{
name: 'Location 1',
lat: 3.037479466090297,
lng: 101.58102250675641,
distance: 1000
}
]
map.on('load', function () {
map.loadImage('https://docs.mapbox.com/mapbox-gl-js/assets/custom_marker.png', function (error, image) {
if (error) throw error
if (image) {
map.addImage('custom-marker', image)
map.addSource('points', {
type: 'geojson',
data: {
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [geofence[0].lng, geofence[0].lat]
},
properties: {
title: geofence[0].name,
distance: geofence[0].distance
}
},
maxzoom: 22,
tolerance: 0
})
map.addLayer({
id: 'points',
type: 'symbol',
source: 'points',
layout: {
'icon-image': 'custom-marker',
'text-field': ['get', 'title'],
'text-font': ['Open Sans Semibold'],
'text-offset': [0, 1.25],
'text-anchor': 'top'
}
})
const circleLayer: CircleLayer = {
id: 'geofence',
type: 'circle',
source: 'points',
paint: {
'circle-radius': {
stops: [
[0, 0],
[21, metersToPixelsAtMaxZoom(geofence[0].distance, geofence[0].lat)]
],
base: 2
},
'circle-opacity': 0.5,
'circle-color': 'blue',
'circle-stroke-width': 2,
'circle-stroke-color': 'black'
}
}
map.addLayer(circleLayer)
}
})
})
}
})
const metersToPixelsAtMaxZoom = (meters: any, latitude: any) => meters / 0.075 / Math.cos((latitude * Math.PI) / 180)
</script>
<style lang="scss">
#mapContainer {
width: auto;
height: 400px;
}
</style>
显示的代码是在 TypeScript 中,但我相信删除类型也会同样呈现它。
我认为您遇到了 Mapbox GL JS 并不真正支持的边缘情况。
处理此问题的更好方法是使用 TurfJS 创建具有 circle()
的多边形并将其添加为 geojson
层。