Без скрипки трудно воспроизвести проблему, которая у вас возникла со слоем круга, на первый взгляд ваши coordinates
, определенные для геометрии json, не являются допустимыми значениями. Я изменил их, и это работает.
Для ошибки на mouseenter и mouseleave в рамках событий Mapbox «this» - это сама карта ... просто попробуйте это
var map = (window.map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/light-v10',
zoom: 18,
center: [-122.3512, 47.6202],
pitch: 60,
antialias: true // create the gl context with MSAA antialiasing, so custom layers are antialiased
}));
map.on('style.load', function () {
map.addSource('cases', {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [-122.3512, 47.6202]
},
properties: {
caseId: '200',
status: 'IDENTIFIED',
address: {
barangay: 'ABCD',
municipality: 'EFGH',
province: 'IJKL'
}
}
},
{
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [-122.3513, 47.6202]
},
properties: {
caseId: '201',
status: 'CONFIRMED',
address: {
barangay: 'DCBA',
municipality: 'HGFE',
province: 'LKJI'
}
}
}
]
}
});
map.addLayer({
id: 'population',
type: 'circle',
source: 'cases',
paint: {
'circle-radius': {
base: 1.75,
stops: [
[10, 4],
[12, 4]
]
},
'circle-color': [
'match',
['get', 'status'],
'IDENTIFIED',
'#6c757d',
'CLOSED',
'#343a40',
'#ccc'
]
}
});
const popup = new mapboxgl.Popup({
closeButton: false,
closeOnClick: false
});
// tslint:disable-next-line: space-before-function-paren
map.on('mouseenter', 'population', function (e) {
this.getCanvas().style.cursor = 'pointer';
const coordinates = e.features[0].geometry.coordinates.slice();
const caseId = e.features[0].properties.caseId;
while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) {
coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360;
}
popup.setLngLat(coordinates).setText(caseId).addTo(this);
});
// tslint:disable-next-line: space-before-function-paren
map.on('mouseleave', 'population', function () {
this.getCanvas().style.cursor = '';
popup.remove();
});
});