首页 > 其他分享 >在Mapbox-gl-js中添加自定义图层

在Mapbox-gl-js中添加自定义图层

时间:2023-12-19 23:14:03浏览次数:31  
标签:自定义 -- geojson js Mapbox var line gl

在Mapbox-gl-js中添加自定义图层

前言

本文说明如何制作自定义的地图数据,并使用mapbox-gl-js进行显示

一、制作geojson地图

如果自定义的地图格式已经是geojson可跳过。
有时自定义数据来源较多,格式不定,此时需要将这些五花八门的格式统一成geojson格式。
可以通过Python脚本写入:

from geojson import Feature, FeatureCollection, LineString, Polygon
import geojson
my_feature = list()
for var_point in marking_shapes:
	feature_shape_list.append((var_point.x / 10 ** 8, var_point.y / 10 ** 8))
	var_polyline = Feature(geometry=LineString(feature_shape_list, precision=8), 
												properties = {
                                                              "Id" : "marking", 
                                                              "LineWidth" : var_width, 
                                                              "LineColor" : var_color, 
                                                              "LineType" : var_line_type})
     my_feature.append(var_polyline)
all_features = FeatureCollection(my_feature)
with open("./marking.json","w") as f:
        geojson.dump(all_features, f)

矢量数据就存放到了geojson文件中。

二、使用Tippecanoe将geojson转换成vector tile(.pbf)文件

建立目录test-data/build/geojson和test-data/build/www;
将geojson文件放到geojson文件夹中;

tippecanoe --no-feature-limit --no-tile-size-limit --layer=Marking --minimum-zoom=18 --maximum-zoom=20 --output-to-directory "build/www/tiles-marking" `find ./build/geojson -type f | grep .json`

在www文件夹下将生成level 18 到level 20的基于marking.json地图的分层后的vector tile数据,后缀名为.pbf
(.pbf文件也可以还原成geojson文件)

tippecanoe-decode 396598.pbf 20 862489 396598 > decode.json

格式tippecanoe-decode (pbf path) z x y > (dest path)

三、使用mapbox-gl-js显示

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Custom Map</title>
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
<script src="https://api.mapbox.com/mapbox-gl-js/v2.0.1/mapbox-gl.js"></script>
<link href="https://api.mapbox.com/mapbox-gl-js/v2.0.1/mapbox-gl.css" rel="stylesheet" />
<style>
    body { margin:0; padding:0; }
    #map { position:absolute; top:0; bottom:0; width:100%; }
</style>
</head>
<body>
<div id="map"></div>
<script>
	// TO MAKE THE MAP APPEAR YOU MUST
	// ADD YOUR ACCESS TOKEN FROM
	// https://account.mapbox.com
	mapboxgl.accessToken = "pk.eyJ1Ijoia2V2aW4weHUiLCJhIjoiY2tsa3A4dW1mMDVrOTJybzFkc2luMjVhdSJ9.eksQG3G9_SXMvxrDNmB9jQ";
    var map = new mapboxgl.Map({
        container: 'map',
        style: 'mapbox://styles/mapbox/light-v10',
        zoom: 13,
        center: [114.126732, 40.098578]
    });
    map.on('load', function () {
        map.addSource('Marking', {
            "type": 'vector',
            "tiles": ["http://192.168.1.66:8080/tiles-marking/{z}/{x}/{y}.pbf"],
            "minzoom": 18,
            "maxzoom": 20
        });
        map.addLayer({
            "id": "MarkingSolid",
            "type": "line",
            "source": "Marking",
            "source-layer": "Marking",
            "paint": {
                "line-color": [
                    "match", ["get", "LineColor"],
                    1, "#FFFFF0",
                    2, "#FFB90F",
                    "#FFB90F"
                ],
                "line-width" : 3,
                "line-opacity" : 1,
            },
            "filter" : ["==", "LineType", 2]
        });
        map.addLayer({
            "id": "MarkingDashed",
            "type": "line",
            "source": "Marking",
            "source-layer": "Marking",
            "paint": {
                "line-color": [
                    "match", ["get","LineColor"],
                    1, "#FFFFF0",
                    2, "#FFB90F",
                    "#FFFFFF"
                ],
                "line-width" : 3,
                "line-opacity" : 1,
                "line-dasharray": [2, 2]
            },
            "filter" : ["==", "LineType", 1]
        });
    });

</script>
</body>
</html>


可以使用live-server简易服务器浏览

live-server --port=8080 --middleware="${PWD}/build/gzip.js" --host=192.168.1.66 build/www

三、Mapbox-gl-js中根据矢量数据的属性过滤显示

例如根据属性中的颜色配置对应的显示颜色:

"line-color": ["match", ["get","LineColor"],
               1, "#FFFFF0",
               2, "#FFB90F",
               "#FFFFFF"]

其中”LineColor“为properties中的属性之一,1/2为其属性对应的值枚举,值后紧随其对应的颜色,最后给一个默认值。
也可以过滤掉某一属性的地图数据:

"filter" : ["==", "LineType", 1]

根据marking的类型过滤等于1的marking
在这里插入图片描述

本文转自 https://blog.csdn.net/Kevin00Xu/article/details/114287983,如有侵权,请联系删除。

标签:自定义,--,geojson,js,Mapbox,var,line,gl
From: https://www.cnblogs.com/hustshu/p/17915074.html

相关文章

  • JsonNode、ObjectNode和ArrayNode
    我个人不喜欢fastjson,但是项目中很多地方用到json字符串转换对象但又不想创建pojo所以使用jackson的JsonNode、ObjectNode和ArrayNode就非常好用,万能对象,这三个对象是非常全面的,感兴趣的可以看下源码JsonNode只读,通常由ObjectMapper解析json字符串得到ObjectNode可修改,继承......
  • 【力扣】-9. 回文数|刷题打卡-JS
    给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例1:输入:x=121输出:true示例 2:输入:x=-121输出:false解释:从左向右读,为-121。从右向左读,为121-。......
  • Unreal入门,开灯,自定义事件
    1.创建一个点光源作为灯新建一个基于Actor的蓝图添加一个StaticMesh作为灯的外观将StaticMesh拖放到DefaultSceneRoot作为根节点添加点光源将地图的平行光调暗将刚创建的灯拖放到地图2.新建一个基于Actor的开关设置一个StaticMesh并拖放到覆盖根节点设置碰撞为......
  • Parallax.js:实现自适应智能设备方向的视差效果
    哈喽!大家好!我是程序视点的小二哥。今天给大家分享一款功能非常强大的javascript视觉差特效引擎插件:Parallax.js。Parallax.js简介Parallax.js是一个简单的,轻量级的视差引擎。你可以将它作为作为jQuery或Zepto插件来使用,也可以以纯JS的方式来使用。最-最-最厉害的是它可以对智......
  • uniGUI学习之自定义Hint(74)
    默认Hint样式 procedureTMainForm.UniFormShow(Sender:TObject);vari:Integer;beginfori:=0toSelf.ControlCount-1dobeginwithTUniFormControl(Self.Controls[i])dobeginifHint<>''thenbeginSh......
  • 前端json转excel 到zip下载
    问题描述:后端返回数据原先返回是多个json文件的压缩包二进制文件流,前端直接下载二进制文件流。但是客户要求下载excel类型文件。解决方案:前端拿到表格的json数据转换成对应table的html字符串,使用插件js-xlsx。给个链接,import*asXLSXfrom'xlsx'//JSONData为导出的json数......
  • day17 基于Prometheus的HPA自动伸缩 -Prometheus黑盒监控-自定义资源接入监控系统 (7.
    一、基于Prometheus的HPA自动伸缩1、背景Kubernetes集群规模大、动态变化快,而且容器化应用部署和服务治理机制的普及,传统的基础设施监控方式已经无法满足Kubernetes集群的监控需求。需要使用专门针对Kubernetes集群设计的监控工具来监控集群的状态和服务质量。Prometheus则......
  • json模块
    json模块(一)序列化和反序列化(1)什么是序列化将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。(2)为什么要序列化给另外一段程序使用,那我们怎么给?现在我们能想到的方法就是存在文件里然后另一个python程序再从文件里读出来。但是我们都知道对于文件......
  • leaflet在vue2中标点 加载geoJSON
    lealfet版本1.9.4vue版本2.6引入:importLfrom'leaflet'  import'leaflet/dist/leaflet.css'  //记得引入样式不然加载瓦片图后地图会错乱1.初始化this.map=L.map(this.mapId,mapInitOptionNew)//this.mapId是容器的idletcenter=[32.666,129.547]const......
  • 全国省市json文件
    [{"label":"北京市","value":"北京市","children":[{"label":"东城区","code":"110101","value":"东城区"......