mapbox加载turf.js创建的格网

turf.js是mapbox官方推荐的进行空间分析的包,其优点在于强大且全面的空间分析功能,且支持geojson格式的输入,因此与Mapbox GL JS集成效果很好。

我们此处介绍Mapbox GL JS加载turf.js实时创建格网(渔网)的方法。

其效果如下:

turf.js能够指定格网大小、坐标等信息实时生成,其效率非常高,也可以在前端根据用户需求实时的生成格网了。生成结果为GeoJson格式,Mapbox根据其生成的结果直接加载。步骤如下:

1、turf.js生成格网(渔网)

turf.js使用turf.squareGrid(bbox, cellSide, options); 方法生成格网,返回格式为Geojson的featureCollection

    var bbox = [112, 22, 114, 23];  //格网坐标 minX,minY,maxX,maxY. modify here.
    var cellSide = 5;  //格网长度 
    var options = {units:'kilometers'};  //长度单位
    var squareGrid = turf.squareGrid(bbox, cellSide, options);  //生成格网

 2、MapBox加载格网

使用常规的addSource及addLayer即可加载,指定source的类型为geojson即可。

    map.addSource('gridsource', {
        type: 'geojson',
        data:squareGrid
    });
    map.addLayer({
        id: 'gridlayer',
        type: 'fill',
        source: 'gridsource',
        paint: {
            'fill-color': '#486DE0',
			'fill-outline-color':'ffffff'
        }
    });

该功能用eCharts同样可以实现,但比较后效果上有所差别,MapBox+turf.js效果更好些。 

完整代码如下:

以下代码实现点击屏幕后,加载turf.js生成的渔网图层。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Display a map</title>
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no"/>
    <script src="https://api.mapbox.com/mapbox-gl-js/v1.12.0/mapbox-gl.js"></script>
    <script src='https://unpkg.com/@turf/turf/turf.min.js'></script>
    <link href="https://api.mapbox.com/mapbox-gl-js/v1.12.0/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>
    mapboxgl.accessToken = 'pk.eyJ1IjoibWFyb3N0emd4IiwiYSI6ImNqY2xmamF1ODA4d3YyeG8zZHhvNmJtazAifQ.HZmoxlx91c9unbKOE18jpA';
    var map = new mapboxgl.Map({
        container: 'map', // container id
        style: 'mapbox://styles/mapbox/streets-v11',// style URL
        center: [113, 22.5], // starting position [lng, lat]
        zoom: 8.35 // starting zoom
    });

    var bbox = [112, 22, 114, 23];    //格网坐标 minX,minY,maxX,maxY. modify here.
    var cellSide = 5;  //格网长度
    var options = {units: 'kilometers'};  //长度单位
    var squareGrid1 = turf.squareGrid(bbox, cellSide, options);  //生成格网

    map.on('click', function () {
        map.addSource('gridsource', {
            type: 'geojson',
            data: squareGrid1
        });
        map.addLayer({
            id: 'gridLyr',
            type: 'fill',
            source: 'gridsource',
            paint: {
                'fill-color': '#486DE0',
                'fill-outline-color': '#ffffff'
            }
        });
    })

    //

</script>

</body>
</html>

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Mapbox 和 Three.js 是两个独立的开源项目,可以结合使用来创建交互式地图和可视化效果。Mapbox 是一个提供地图数据和地图服务的平台,而 Three.js 是一个基于 WebGL 的 3D 图形库。 结合 Mapbox 和 Three.js,你可以在地图上创建各种令人惊叹的视觉效果,例如在地图上展示 3D 模型、动态地图标记或者添加自定义的动画效果。 以下是一个简单的示例,展示如何在 Mapbox 地图上使用 Three.js 创建一个旋转的立方体: 1. 首先,引入 Mapbox 和 Three.js 的库文件,并创建一个容器来放置地图: ```html <div id="map"></div> ``` 2. 然后,在 JavaScript 中初始化地图,获取地图容器的大小,并创建一个 Three.js 场景: ```javascript mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN'; var map = new mapboxgl.Map({ container: 'map', style: 'mapbox://styles/mapbox/streets-v11', center: [0, 0], zoom: 1 }); var scene = new THREE.Scene(); ``` 3. 接下来,在场景中创建一个旋转的立方体: ```javascript var geometry = new THREE.BoxGeometry(1, 1, 1); var material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); var cube = new THREE.Mesh(geometry, material); scene.add(cube); function animate() { requestAnimationFrame(animate); cube.rotation.x += 0.01; cube.rotation.y += 0.01; // 渲染 Three.js 场景 renderer.render(scene, camera); } animate(); ``` 4. 最后,将 Three.js 的渲染结果嵌入到 Mapbox 地图中: ```javascript var renderer = new THREE.WebGLRenderer({ alpha: true }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 5; function render() { requestAnimationFrame(render); // 将 Mapbox 地图渲染到 Three.js 的纹理上 renderer.autoClear = false; renderer.clear(); renderer.render(scene, camera); // 将 Three.js 的渲染结果放置在地图上 map.triggerRepaint(); } map.on('load', function() { map.on('render', render); }); ``` 通过结合 Mapbox 和 Three.js,你可以根据自己的需求创建更复杂的交互式地图和可视化效果。希望这个例子能帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值