标签: mapbox

传单 - 瓷砖加载事件

我目前正在开发一个基于地图的应用程序,需要一种方法在Leaflet从 中提取图块时收到通知TileProvider(在我的例子中是MapBox)。我阅读了Leaflet 文档,特别是TileLayer的部分。目前,我正在使用以下代码来附加tileload处理程序:

map.eachLayer(function (layer) {
    layer.on('tileload', function(e) {
        console.log(e);
    });
});
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来获取TileLayer当前地图的?这种方法的一个问题是我将处理程序挂钩到所有层(虽然只会TileLayers引发事件,但将其挂钩到所有层是不干净的)。或者我可以以某种方式将处理程序直接附加到地图实例吗?

更新

我使用以下MapBox代码片段初始化地图:

map = L.mapbox.map( element, '...', mapOptions );
Run Code Online (Sandbox Code Playgroud)

这会自动创建一个TileLayer(以及其他几个层),将它们附加到该map对象并返回该对象以供以后使用。

javascript leaflet mapbox

5
推荐指数
2
解决办法
4120
查看次数

如何使用 Swift 将 Mapbox 缩放到给定半径(以公里为单位)?

我最近从旧版 Mapbox SDK(版本 1.6)更新到最新的 Mapbox iOS SDK 3.x。

在新版本中,我无法弄清楚如何将 Mapbox MGLMapView 缩放到给定的半径(以公里为单位)以适合屏幕。

在旧版本(版本 1.6)中,RMMapView.zoomWithLatitudeLongitudeBoundsSouthWest方法的工作如下:

func centerAndZoom(center: CLLocationCoordinate2D, kilometers: Float) {
    let meters = Double(kilometers * 1000)
    let region = MKCoordinateRegionMakeWithDistance(center, meters / 2, meters / 2);

    let northEastLat = center.latitude - (region.span.latitudeDelta / 2);
    let northEastLon = center.longitude + (region.span.longitudeDelta / 2);
    let northEast = CLLocationCoordinate2D(latitude: northEastLat, longitude: northEastLon)

    let southEastLat = center.latitude + (region.span.latitudeDelta  / 2);
    let southEastLon = center.longitude - (region.span.longitudeDelta / 2);
    let southEast = …
Run Code Online (Sandbox Code Playgroud)

ios mapbox swift

5
推荐指数
1
解决办法
3255
查看次数

MapBox GL Android:已下载自定义图块源的离线地图但未使用

对于我们的应用程序,我目前正在将地图框与自定义地图图块表面集成(如此处所述。使用有效的互联网连接,一切都运行良好,OfflineManagerOfflineTilePyramidRegionDefinition可以下载图块并在 mbgl-offline.db 中找到它们,但它们似乎未在应用程序中使用。据报告,离线区域已完成,但只是不显示。据我了解离线文档,下载图块后,其他一切都是“放手”。

我尝试了几个不同的来源(例如,OpenMapTiles.org),因为我们仍在建立自己的地图切片服务器的过程中。

我在这里错过了什么吗?我真的很感谢任何线索。

最好的,菲尔

更新: 这里有更多信息:

XML 布局

<com.mapbox.mapboxsdk.maps.MapView
    android:id="@+id/mapView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    mapbox:center_latitude="51"
    mapbox:center_longitude="7"
    mapbox:style_url="http://demo.tileserver.org/styles/klokantech-basic.json"
    mapbox:zoom="1"/>
Run Code Online (Sandbox Code Playgroud)

下载地图数据的代码:

// Set up the OfflineManager
OfflineManager offlineManager = OfflineManager.getInstance(context);

// Create a bounding box for the offline region
LatLngBounds latLngBounds = new LatLngBounds.Builder()
        .include(new LatLng(6, 50))
        .include(new LatLng(8, 52))
        .build();

// Define the offline region
OfflineTilePyramidRegionDefinition definition = new OfflineTilePyramidRegionDefinition(
        mapView.getStyleUrl(),
        latLngBounds,
        0,
        9, // also tried other zoom levels
        context.getResources().getDisplayMetrics().density); …
Run Code Online (Sandbox Code Playgroud)

android offline mapbox mbtiles mapbox-gl

5
推荐指数
1
解决办法
1905
查看次数

在 MapBox Android 中检测运动的完全结束

我希望在 MapBox 的 Android SDK 中检测地图运动的完全结束。我所说的完全结束是指不再有用户交互(触摸)和相机移动(触摸移动或快速惯性)。

由于 SDK 中没有此类回调,因此我在 , 上组合了两个侦听器MapViewOnTouchListener如下OnMapChangedListener所示(在 Kotlin 中,但非常清楚):

mapView.setOnTouchListener { _, event ->
    when (event.actionMasked) {
        MotionEvent.ACTION_DOWN -> {
            listener?.onMapDragBegin()
        }
        MotionEvent.ACTION_UP -> {
            listener?.onMapDragEnd()
        }
    }
    false
}

mapView.addOnMapChangedListener { c ->
    when (c) {
        MapView.REGION_WILL_CHANGE, MapView.REGION_WILL_CHANGE_ANIMATED -> {
            listener?.onMapMovementBegin()
        }
        MapView.REGION_DID_CHANGE, MapView.REGION_DID_CHANGE_ANIMATED -> {
            listener?.onMapMovementEnd()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

侦听器等待两个事件结束。除了一个微小的细节之外,这种方法工作得很好:当用户停止触摸屏幕时,两个结束事件都会被发送,并且只有在地图REGION_WILL_CHANGE_ANIMATED更改之后才会被调用。所以有时候我不知道地图是否还在移动。在日志中看起来像这样:

19:23:42.431: Map touch started
19:23:42.537: Map region change started
19:23:42.538: Map region change ended
...
19:23:42.570: …
Run Code Online (Sandbox Code Playgroud)

android mapbox

5
推荐指数
1
解决办法
2300
查看次数

如何更改 Mapbox-gl maki 图标颜色?

我正在使用Mapbox-gl.js (v0.38.0) 和Maki图标、Ionic3 和 angular4。我不想使用mapbox.js。我已经完成了我想要的操作,但默认情况下图标颜色为“棕色”。但我希望它的颜色为“绿色”。

我尝试了与mapbox-gl 示例类似的以下链接,

如何自定义颜色和其他图标属性

mapbox mapbox-gl mapbox-gl-js mapbox-marker

5
推荐指数
0
解决办法
2047
查看次数

将地图盒中的图块集添加到我的地图中

我是 Mapbox 的新手,最近我想创建一个网络地图。我将一个形状上传到 mapbox tilseset cloud 中,但是当我尝试将其添加到地图中时,它不显示。这是我正在使用的代码函数:

        map.on('load', function() {
        map.addLayer({
            'id' : 'Resguardos',
            'type' : 'fill',
            "source" : {
                'type' : 'vector',
                'url' : 'mapbox://fabiofz1990.9lhgml6c',
            },
            'layout' : {},
            'paint' : {
                'fill-color' : '#0044b2',
                'fill-opacity' : 1
            }
        });

    });
Run Code Online (Sandbox Code Playgroud)

谢谢

html web-applications mapbox mapbox-gl mapbox-gl-js

5
推荐指数
2
解决办法
2496
查看次数

在 Plotly Python API 中控制 MapBox 范围

Plotly Python API可以使用MapBox(ScatterMapbox)制作漂亮的交互式地图,但无法控制地图范围。例如,如果您想要将图像保存为 PDF 或 PNG 文件并且不希望用户以交互方式缩放,那么能够控制地图范围就很重要。

我面临的问题是没有办法直接表明您只想查看某个区域。例如,无法表明您希望地图仅显示佛罗里达州。

但是,您可以设置地图的中心和缩放级别。当您知道想要可见的框的纬度/经度坐标并且知道中心坐标时,是否可以使用一个公式来定义缩放级别?

例如,如果我希望地图以坐标(center_lat,center_long)为中心并进行缩放,以便可见部分具有西南坐标(sw_lat,sw_long)和东北坐标(ne_lat,ne_long),那么MapBox ZOOM是什么我必须提供的级别?

我意识到该公式可能取决于地图投影,这就是为什么我具体使用 MapBox 和 Plotly。此外,我在 SO 上看到过类似的问题,但这些问题似乎都与通过 JS 使用 MapBox 有关,而不是在 Plotly Python API 中,这使我很难将解决方案转化为我认为可以使用的东西。

python mapbox plotly-dash

5
推荐指数
1
解决办法
2190
查看次数

使用 Mapbox GL JS 切换图层

我想在 Mapbox GL JS 中的图层之间切换。我创建了一些单选按钮,它们在一定程度上起作用,您可以从一层切换到另一层,但不能来回切换。

下面是到目前为止我用于切换图层的代码:

    var layerList = document.getElementById('toggle');
    var inputs = layerList.getElementsByTagName('input');

    function switchLayer(layer) {
        var layerId = layer.target.id;
        map.setLayoutProperty(layerId, 'visibility');
    }

    for (var i = 0; i < inputs.length; i++) {
    inputs[i].onclick = switchLayer;
    }
Run Code Online (Sandbox Code Playgroud)

这是其余的代码(简化)和 jsbin 的链接https://jsbin.com/cigekutiho/edit?html,output

   <!DOCTYPE html>
   <html>
   <head>
   <meta charset=utf-8 />
   <title>Test</title>
   <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
   <link rel="stylesheet" type="text/css" href="css/style.css" />
   <script src='https://api.mapbox.com/mapbox.js/v3.1.1/mapbox.js'> 
   </script>
   <link href='https://api.mapbox.com/mapbox.js/v3.1.1/mapbox.css' rel='stylesheet' />
   <script src='https://api.mapbox.com/mapbox-gl-js/v0.44.1/mapbox-gl.js'></script>
   <link href='https://api.mapbox.com/mapbox-gl-js/v0.44.1/mapbox-gl.css' rel='stylesheet'/>
   <script src='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v2.2.0/mapbox-gl-geocoder.min.js'></script>
   <link rel='stylesheet' href='https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v2.2.0/mapbox-gl-geocoder.css' type='text/css' />
   <link href='https://www.mapbox.com/base/latest/base.css' …
Run Code Online (Sandbox Code Playgroud)

data-visualization cartography mapbox mapbox-gl-js

5
推荐指数
1
解决办法
1万
查看次数

Mapbox GL JS 中的一行弹出窗口,需要填充或近似鼠标悬停

我想在 Mapbox GL JS 中为一行制作一个弹出窗口。我有一个包含很多直线的图层,定义如下:

map.addLayer({id: 'lineLayer',
          type: 'line',
          source: 'lineSource',
          layout: {'line-join': 'round', 'line-cap': 'round'},
          paint: {'line-color': '#00c853','line-width': 5, 'line-opacity': 1 }});
Run Code Online (Sandbox Code Playgroud)

然后我将弹出窗口添加到一行,如下所示(伪代码):

map.on('mousemove', 'lineLayer', (e) => {
    map.getCanvas().style.cursor = 'pointer';
    popupCoordinatesXY = e.point; });
Run Code Online (Sandbox Code Playgroud)

问题是:出于美观原因,我不希望线条太宽,但让鼠标精确地位于线条上太困难了。即使光标距离某一行大约 10 个像素,如何触发该行的 mousemove 事件?

我已经考虑过制作一个额外的、具有更宽线条的隐形层,但我可以想象有一个更优雅的解决方案。

javascript mapbox mapbox-gl-js

5
推荐指数
1
解决办法
1573
查看次数

setFeatureState 不更新 Mapbox 中的值

我正在尝试更改圆形标记的颜色,该标记是使用图层上的 paint 属性绘制的。

按照本教程:https :
//docs.mapbox.com/mapbox-gl-js/example/hover-styles/

我已将 设置circle-color为依赖于 a feature-state

          map.addLayer({
        id: "singles",
        type: "circle",
        source: "users",
        filter: ["!has", "point_count"],
        paint: {
            'circle-radius': {
                'base': 10,
                'stops': [[5, 20], [15, 500]]
            },
            'circle-color':  ["case",
            ["boolean", ["feature-state", "hover"], false],
            '#ddffc8',
            '#ff0000'
            ],
          }
      });
Run Code Online (Sandbox Code Playgroud)

然后当有人将鼠标悬停在侧边栏上时,我想更新功能状态并更改颜色:

function highlightMarkersOnHoverOnSidebar (markers, map) {
  let marks = markers
  Array.from(document.querySelectorAll('.sideBarItems')).map( (x, i) => {

    x.addEventListener('mouseenter', function(){

      map.setFeatureState({source: 'users', id: marks.features[i].properties.id}, { hover: true});
    }, false)

    x.addEventListener('mouseleave', function(){
      map.setFeatureState({source: 'users', id: marks.features[i].properties.id}, { …
Run Code Online (Sandbox Code Playgroud)

javascript mapbox

5
推荐指数
1
解决办法
449
查看次数