我正在使用 MapBox GL API (v0.39.1) 和 RoR 开发地图样式应用程序,但我找不到解决问题的方法。我会尽量解释清楚,提供代码示例。
假设我们有 10.000 个位置。对于每个位置,我想显示一个带有特定图像的自定义标记。当然,我们不能加载包含 10.000 个位置和图像的地图,因为它会滞后并导致浏览器崩溃。
解决方案是仅显示地图视点上可见的位置(基本上仅显示地图边界中可见的位置)。并在地图“移动”或“缩放”时执行 AJAX 调用以获取新位置。
# The code use for the solution
map.on 'load', (e) ->
# Creat markers visible in the maps view point
mapbox.setContent()
# Add 'mooved' event to the map
map.on('moveend', mapbox.move_event)
mapbox.setContent = ->
$.ajax
url: location.protocol + "//" + location.host + "/api/map_data"
type: "GET"
# Send map coordinates
data:
sw_lng: map.getBounds()._sw.lng,
ne_lng: map.getBounds()._ne.lng,
ne_lat: map.getBounds()._ne.lat,
sw_lat: map.getBounds()._sw.lat
success: (data) ->
window.locations_data = data
for i in data.features
# Simply adds a new marker to the map with custom image from the GeoJSON
mapbox.createMarkers(i)
mapbox.move_event = ->
mapbox.setContent()
因此,每次地图“moveend”时,都会使用地图参数将 AJAX 调用发送到服务器,并获取地图视点中的位置。
# location.rb Location model, each location represents a marker on the map
def self.build_geojson(sw_lng, ne_lng, ne_lat, sw_lat)
locations = self.where("longitude > ? AND longitude < ? AND latitude < ? AND latitude > ?", sw_lng, ne_lng, ne_lat, sw_lat)
# Function that builds the GeoJSON from the locations
return build(locations)
场景如下:
- 地图已加载,显示 130 个位置。
- 用户移动地图,发送 AJAX,现在应该显示 150 个位置。
- 在 150 个位置中,有 90 个已从初始加载 (130) 中显示
我怎样才能只删除 40 (130 - 90) 个标记?因为我不想删除所有最初的 130 个标记。然后添加 150 个标记。我没有找到任何“好”的方法来做到这一点。
我需要非常聪明地处理这个问题,因为 MapBox GL 的代码效率低下正在消耗资源、内存、CPU 等。
请帮忙,谢谢!