首页 > 其他分享 >地图框架之mapbox——(三)

地图框架之mapbox——(三)

时间:2024-11-06 11:50:03浏览次数:6  
标签:map style 框架 data 地图 source radius mapbox type

一、加载点数据到地图上

1、准备一个点数据

var data = {
  type: "FeatureCollection",
  features: [
    {
      type: "Feature",
      geometry: {
        type: "Point",
        coordinates: [114.30, 30.50]
      }
    }
  ]
}

2、创建地图并加载这个点,上面是yiduangeojson数据,数据的制作和加载在上一篇文章中已经说过了,不明白的可以自行翻阅。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script src='https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl.js'></script>
    <link href='https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl.css' rel='stylesheet' />
    <style>
        * {
            margin: 0;
            padding: 0
        }

        #map {
            width: 100vw;
            height: 100vh;
        }
    </style>

</head>

<body>
    <div id="map">

    </div>
    <script>
        /* token */
        mapboxgl.accessToken = '你的token'
        const map = new mapboxgl.Map({
            container: 'map', // container ID
            // style: 'mapbox://styles/mapbox/streets-v12', // style URL
            center: [114.30, 30.50], // starting position [lng, lat]
            zoom: 14, // starting zoom
        })
        var data = {
            type: "FeatureCollection",
            features: [
                {
                    type: "Feature",
                    geometry: {
                        type: "Point",
                        coordinates: [114.30, 30.50]
                    }
                }
            ]
        }
        map.on("style.load", () => {
            map.addSource("p_source", {
                type: "geojson",
                data
            })
            map.addLayer({
                id: "p_layer",  //必须写
                source: "p_source",  //必须
                type: "circle", //必须
                paint: {
                    'circle-radius': 30,
                    'circle-color': "#ff2d51",
                    'circle-opacity': 0.5
                }
            })
        })
    </script>
</body>

</html>

二、动态属性获取

先创建多个点数据

var data = {
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        name: "武汉",
        radius: 20
      },
      "geometry": {
        "type": "Point",
        "coordinates": [114.302427, 30.530495]
      }
    },
    {
      "type": "Feature",
      "properties": {
        name: "苏州",
        radius: 5
      },
      "geometry": {
        "type": "Point",
        "coordinates": [114.328023, 30.544457]
      }
    },
    {
      "type": "Feature",
      "properties": {
        name: "杭州",
        radius: 10
      },
      "geometry": {
        "type": "Point",
        "coordinates": [114.344092, 30.533434]
      }
    }
  ]
}

仔细观察可以发现上面数据的properties中有2个属性name和radius,每个点的属性都是不一样的,如果是一个点我们可以加载,但是这多个点如何能够保持原有的样式进行加载呢?这里就需要用到动态属性。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script src='https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl.js'></script>
    <link href='https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl.css' rel='stylesheet' />
    <style>
        * {
            margin: 0;
            padding: 0
        }

        #map {
            width: 100vw;
            height: 100vh;
        }
    </style>

</head>

<body>
    <div id="map">

    </div>
    <script>
        /* token */
        mapboxgl.accessToken = '你的token'
        const map = new mapboxgl.Map({
            container: 'map', // container ID
            // style: 'mapbox://styles/mapbox/streets-v12', // style URL
            center: [114.328023, 30.544457], // starting position [lng, lat]
            zoom: 14, // starting zoom
        })
        var data = {
            "type": "FeatureCollection",
            "features": [
                {
                    "type": "Feature",
                    "properties": {
                        name: "武汉",
                        radius: 20
                    },
                    "geometry": {
                        "type": "Point",
                        "coordinates": [114.302427, 30.530495]
                    }
                },
                {
                    "type": "Feature",
                    "properties": {
                        name: "苏州",
                        radius: 5
                    },
                    "geometry": {
                        "type": "Point",
                        "coordinates": [114.328023, 30.544457]
                    }
                },
                {
                    "type": "Feature",
                    "properties": {
                        name: "杭州",
                        radius: 10
                    },
                    "geometry": {
                        "type": "Point",
                        "coordinates": [114.344092, 30.533434]
                    }
                }
            ]
        }
        map.on("style.load", () => {
            map.addSource("p_source", {
                type: "geojson",
                data
            })
            map.addLayer({
                id: "p_layer",  //必须写
                source: "p_source",  //必须
                type: "circle", //必须
                paint: {
                    /* geojson中properties属性的值 */
                    'circle-radius': ["get", "radius"],
                    'circle-color': "#ff2d51",
                    'circle-opacity': 0.5
                }
            })
        })
        
    </script>
</body>

</html>

最重要的就是,通过get,获取元素properties中的raadius,实现元素的差异化动态加载。

'circle-radius': ["get", "radius"],

三、点击事件获取要素、要素高亮、鼠标事件

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script src='https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl.js'></script>
    <link href='https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl.css' rel='stylesheet' />
    <style>
        * {
            margin: 0;
            padding: 0
        }

        #map {
            width: 100vw;
            height: 100vh;
        }
    </style>

</head>

<body>
    <div id="map">

    </div>
    <script>
        /* token */
        mapboxgl.accessToken = '你的token'
        const map = new mapboxgl.Map({
            container: 'map', // container ID
            // style: 'mapbox://styles/mapbox/streets-v12', // style URL
            center: [114.328023, 30.544457], // starting position [lng, lat]
            zoom: 12, // starting zoom
        })
        var data = {
            "type": "FeatureCollection",
            "features": [
                {
                    "type": "Feature",
                    "properties": {
                        name: "武汉",
                        radius: 20
                    },
                    "geometry": {
                        "type": "Point",
                        "coordinates": [114.302427, 30.530495]
                    }
                },
                {
                    "type": "Feature",
                    "properties": {
                        name: "苏州",
                        radius: 5
                    },
                    "geometry": {
                        "type": "Point",
                        "coordinates": [114.328023, 30.544457]
                    }
                },
                {
                    "type": "Feature",
                    "properties": {
                        name: "杭州",
                        radius: 10
                    },
                    "geometry": {
                        "type": "Point",
                        "coordinates": [114.344092, 30.533434]
                    }
                }
            ]
        }
//这里使用async...await是采用了异步加载的形式,可以不使用,按照之前写的map.on('style.load',()=>{
}
),也是一样的
        async function renderMap() {
            await map.once("style.load");

            /* 1、先加载一个点数据*/
            map.addSource("source", {
                type: "geojson",
                data
            })
            map.addLayer({
                id: "layer",
                source: "source",
                type: "circle",
                paint: {
                    'circle-radius': ["get", "radius"],
                    'circle-color': "#ff2d51"
                }
            })

            /* 设置高亮图层 */
            map.addSource("high_source", {
                type: "geojson",
                data: {
                    type: "FeatureCollection",
                    features: []
                }
            })
            map.addLayer({
                id: "high_layer",
                source: "high_source",
                type: "circle",
                paint: {
                    'circle-radius': 25,
                    'circle-color': "#4164fb"
                }
            })

            /* 监听鼠标事件 移动到图层上变成wait */
            map.on("mouseenter", "layer", () => {
                map.getCanvas().style.cursor = "wait"
            })
            map.on("mouseleave", "layer", () => {
                map.getCanvas().style.cursor = "default"
            })
            /* 点击获取要素 */
            map.on("click", evt => {
                console.log(evt.point)
                var { lng, lat } = evt.lngLat;
                /* 这个api可以去mapbox官网查看 */
                const features = map.queryRenderedFeatures(
                    evt.point,
                    { layers: ['layer'] }
                );
                console.log(features[0])
                map.getSource().setData(features[0])
            })

        }
        renderMap();
    </script>
</body>

</html>

四、加载线要素

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 导入依赖 -->
    <script src='https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.js'></script>
    <link href='https://api.mapbox.com/mapbox-gl-js/v2.14.1/mapbox-gl.css' rel='stylesheet' />
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #map {
            width: 100vw;
            height: 100vh;
        }
    </style>
</head>

<body>
    <div id="map">

    </div>
    <script>
        /* token */
        mapboxgl.accessToken = '你的token'
        /* 实例化地图 */
        const map = new mapboxgl.Map({
            /* ol target */
            container: 'map', // container ID
            /* style--layers 图层 */
            /* vue2 data  vue3 ref */
            style: 'mapbox://styles/mapbox/streets-v12', // style URL
            center: [114.30, 30.50], // starting position [lng, lat]
            zoom: 12 // starting zoom
        });
        var data = 'http://39.103.151.139:8000/gis/road_state'
        /* data-source */
        map.on("style.load", () => {
            /* mapbox的source加载到map上 */
            map.addSource("geojson-source", {
                type: "geojson",
                data
            })
            map.addLayer({
                id: "wuhan",
                source: "geojson-source",
                type: "line",
                paint: {
                    'line-width': 4,
                    'line-color': "blue"
                }
            })

        })
       
    </script>
</body>

</html>

五、加载区要素

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <script src='https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl.js'></script>
    <link href='https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl.css' rel='stylesheet' />
    <style>
        * {
            margin: 0;
            padding: 0
        }

        #map {
            width: 100vw;
            height: 100vh;
        }
    </style>

</head>

<body>
    <div id="map">

    </div>
    <script>
        /* token */
        mapboxgl.accessToken = '你的token'
        const map = new mapboxgl.Map({
            container: 'map', // container ID
            // style: 'mapbox://styles/mapbox/streets-v12', // style URL
            center: [116.391361, 39.904310], // starting position [lng, lat]
            zoom: 1, // starting zoom
        })
        let data = 'https://docs.mapbox.com/mapbox-gl-js/assets/ne_50m_urban_areas.geojson';
        map.on("style.load", () => {
            map.addSource("source", {
                type: "geojson",
                /* data可以接收geojson的变量,也可以接收geojson的url地址 */
                data
            })
            map.addLayer({
                id: "layer",
                source: "source",
                type: "fill",
                paint: {
                    'fill-color': "red"
                }
            })
        })
    </script>
</body>

</html>

标签:map,style,框架,data,地图,source,radius,mapbox,type
From: https://blog.csdn.net/qq_45751819/article/details/143555622

相关文章

  • web前端实现地址选择器精确到省市区街道(腾讯地图WebService API)
    目录先看效果,这里以移动端为例一、省市区街道选择器弹窗组件代码二、父组件引用“一”组件三、pc端效果总结先看效果,这里以移动端为例pc端稍微改下标签名和样式即可使用。一、省市区街道选择器弹窗组件代码html<template> <viewclass="page-content":styl......
  • WinNTSetup 使用教程的框架,您可以根据自己的需求深入研究每个部分,特别是集成驱动、应
    WinNTSetupv5.3.5.2-InstallWindowsfromUSB-MSFNWinNTSetup官方原版多国语言版下载链接:https://www.mediafire.com/folder/53um6k2nmhvd5/https://www.mediafire.com/file/rbpu88tre4nxwbe/WinNTSetup_v5352.rar/fileWinNTSetupv5352初级使用教程大纲引言WinNTSet......
  • 基于LLM Graph Transformer的知识图谱构建技术研究:LangChain框架下转换机制实践
    文本到图谱的转换是一个具有技术挑战性的研究领域,其核心任务是将非结构化文本数据转换为结构化的图谱表示。这种技术虽然由来已久,但随着大型语言模型(LLMs)的发展,其应用范围得到了显著扩展,并逐渐成为主流技术方案之一。上图展示了信息抽取过程中文本到知识图谱的转换。图左侧展......
  • 【鉴权】OAuth 2.0: 高度灵活与安全的身份认证框架
    目录引言一、OAuth2.0的核心概念1.1资源拥有者(ResourceOwner)1.2客户端(Client)1.3授权服务器(AuthorizationServer)1.4资源服务器(ResourceServer)1.5OAuth2.0体系架构图二、OAuth2.0授权流程2.1OAuth2.0授权流程概述2.2常见的授权模式2.2.1授权码模式(Autho......
  • 如何使用程序生成一个复杂的2D迷宫游戏地图
    相关:ISolvedTheWorld'sHardestMaze(withCode)本文不做过多的内容介绍,本文主要是分享上面的这个视频内容,该内容介绍了一些自动生成复杂2D迷宫的算法,当然本文不对此做过多介绍,这里可以当作是一个内容收藏的功能,因为曾经有段时间自己想去写这么一个迷宫生成的算法,后来发现......
  • 基于java中的SSM框架实现新能源汽车在线租赁管理系统项目【内附项目源码+论文说明】
    基于java中的SSM框架实现新能源汽车在线租赁管理系统演示【内附项目源码+LW说明】摘要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,新能源汽车在线租赁当然也不能排除在外。新能源汽车在线租赁是以实际运用......
  • 基于java中的SSM框架实现亚盛汽车配件销售业绩管理系统项目【附项目源码+论文说明】
    基于java中的SSM框架实现亚盛汽车配件销售业绩管理系统演示【内附项目源码+LW说明】摘要如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式就不适合。为了让亚盛汽车配件销售信息的管理模式进行升级,也为了更好的维护亚盛汽车配件销售信息,亚盛汽车配......
  • Android JetPack Compose MVI 框架
    学习基础布局完成后基本的布局层面可以实现了但是只学习静态的页面肯定是不行的要让我们的页面灵活动态的我们来学习一下网络请求获取数据谈及框架并不陌生MVI框架核心原理知识Model:表示应用的状态和业务逻辑。通常是不可变的,描述当前视图所需的数据。View:负责展......
  • 仓储物流机器人信息流【机器人本体软件信息流】【ROS框架】
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、主控制程序二、各模块控制节点1.开机自检和信息打印节点2.定位节点1.二维码相机节点2.IMU节点3.陀螺仪节点4.里程计节点3.电池节点4.控制节点1.行走控制模块节点2.举升控制模块节点3.取......