openLayer-空间分析

1、方法一(不清楚选择框)

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 1、导入openlayers的依赖 -->
    <link rel="stylesheet" href="https://lib.baomitu.com/ol3/4.6.5/ol.css">
    <script src="https://lib.baomitu.com/ol3/4.6.5/ol.js"></script>
    <script src="./utils/index.js"></script>
    <script src="./utils/createDraw.js"></script>
    <script src="./utils/setAnimateStyle.js"></script>
    <script src="https://lib.baomitu.com/Turf.js/latest/turf.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #map {
            width: 100vw;
            height: 100vh;
        }

        #btn {
            position: absolute;
            z-index: 1000;
            top: 20px;
            left: 60px;
            border: none;
            color: #fff;
            width: 100px;
            height: 60px;
            border-radius: 10px;
            background-color: #157347;
        }
    </style>
</head>

<body>
    <button id="btn" onclick="activeDraw()">空间分析</button>
    <!-- 2、设置地图容器的挂载点 -->
    <div id="map">

    </div>
    <script>
        /* 3、设置一个瓦片图层 */
        const gaode = new ol.layer.Tile({
            title: "高德地图",
            source: new ol.source.XYZ({
                url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}',
                wrapX: false
            })
        });
        /* 4、实例化地图 */
        /* new Vue({
            el
        }) */
        const map = new ol.Map({
            /* 将实例化的地图挂载到对应的DOM元素上 */
            target: "map",
            layers: [gaode],
            /* 设置地图以中心点显示/坐标显示/方法级别显示 */
            view: new ol.View({
                center: [114.30, 30.50],
                zoom: 6,
                /* 坐标 */
                projection: "EPSG:4326"
            })

        })
        const source = new ol.source.Vector({
            format: new ol.format.GeoJSON(),
            url: "./data/data.json"
        })
        const layer = new ol.layer.Vector({
            source,
            style: setPntStyle({
                fill: "#ff2d5180"
            })
        })
        map.addLayer(layer);

        /* 创建画布 -画笔 */
        let draw_layer = new ol.layer.Vector({
            source: new ol.source.Vector({

            })
        })
        map.addLayer(draw_layer);
        let draw = createDraw({
            type: "Box",
            source: draw_layer.getSource()
        })
        let btn = document.getElementById("btn");
        function activeDraw() {
            /* 激活画笔 */
            map.addInteraction(draw);
            /* 禁止样式 */
            btn.disabled = true;
            btn.style.cursor = "no-drop"
        }

        /* 高亮图层 */
        const high_layer = new ol.layer.Vector({
            source: new ol.source.Vector({

            }),
            style: setAnimateStyle({ map })
        })
        map.addLayer(high_layer)
        draw.on("drawend", evt => {
            /* 默认样式 start */
            btn.disabled = false;
            btn.style.cursor = "default"
            map.removeInteraction(draw)
            /* 默认样式 end */
            let feature = evt.feature;
            /* feature-geojson */
            let polygon = new ol.format.GeoJSON().writeFeatureObject(feature);
            console.log(polygon);
            /* 获取所有的source要素
            1、如果在polygon中的就高亮
            2、不在的不高亮
             */
            let features = source.getFeatures();
            /* 清空画布 */
            high_layer.getSource().clear();
            draw_layer.getSource().clear();
            features.forEach(item => {

                let point = new ol.format.GeoJSON().writeFeatureObject(item);
                var result = turf.booleanContains(polygon, point);
                if (result) {

                    console.log(item);
                    high_layer.getSource().addFeature(item);
                }
            })
        })
    </script>
</body>

</html>

2、方法二 (清除选择框)

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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 1、导入openlayers的依赖 -->
    <link rel="stylesheet" href="https://lib.baomitu.com/ol3/4.6.5/ol.css">
    <script src="https://lib.baomitu.com/ol3/4.6.5/ol.js"></script>
    <script src="./utils/index.js"></script>
    <script src="./utils/createDraw.js"></script>
    <script src="./utils/setAnimateStyle.js"></script>
    <script src="https://lib.baomitu.com/Turf.js/latest/turf.min.js"></script>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        #map {
            width: 100vw;
            height: 100vh;
        }

        #btn {
            position: absolute;
            z-index: 1000;
            top: 20px;
            left: 60px;
            border: none;
            color: #fff;
            width: 100px;
            height: 60px;
            border-radius: 10px;
            background-color: #157347;
        }
    </style>
</head>

<body>
    <button id="btn" onclick="activeDraw()">空间分析</button>
    <!-- 2、设置地图容器的挂载点 -->
    <div id="map">

    </div>
    <script>
        /* 3、设置一个瓦片图层 */
        const gaode = new ol.layer.Tile({
            title: "高德地图",
            source: new ol.source.XYZ({
                url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}',
                wrapX: false
            })
        });
        /* 4、实例化地图 */
        /* new Vue({
            el
        }) */
        const map = new ol.Map({
            /* 将实例化的地图挂载到对应的DOM元素上 */
            target: "map",
            layers: [gaode],
            /* 设置地图以中心点显示/坐标显示/方法级别显示 */
            view: new ol.View({
                center: [114.30, 30.50],
                zoom: 6,
                /* 坐标 */
                projection: "EPSG:4326"
            })

        })
        const source = new ol.source.Vector({
            format: new ol.format.GeoJSON(),
            url: "./data/data.json"
        })
        const layer = new ol.layer.Vector({
            source,
            style: setPntStyle({
                fill: "#ff2d5180"
            })
        })
        map.addLayer(layer);

        /* 创建画布 -画笔 */
        let draw_layer = new ol.layer.Vector({
            source: new ol.source.Vector({

            }),
            style: setAnimateStyle({ map })
        })
        map.addLayer(draw_layer);
        let draw = createDraw({
            type: "Box",
            source: draw_layer.getSource()
        })
        let btn = document.getElementById("btn");
        function activeDraw() {
            /* 激活画笔 */
            map.addInteraction(draw);
            /* 禁止样式 */
            btn.disabled = true;
            btn.style.cursor = "no-drop"
        }

        /* 高亮图层 */
        // const high_layer = new ol.layer.Vector({
        //     source: new ol.source.Vector({

        //     }),
        //     style: setAnimateStyle({ map })
        // })
        // map.addLayer(high_layer)
        draw.on("drawend", evt => {
            /* 默认样式 start */
            btn.disabled = false;
            btn.style.cursor = "default"
            map.removeInteraction(draw)
            /* 默认样式 end */
            let feature = evt.feature;
            /* feature-geojson */
            let polygon = new ol.format.GeoJSON().writeFeatureObject(feature);
            console.log(polygon);
            /* 获取所有的source要素
            1、如果在polygon中的就高亮
            2、不在的不高亮
             */
            let features = source.getFeatures();
            /* 清空画布 */
            // high_layer.getSource().clear();
            draw_layer.getSource().clear();
            features.forEach(item => {

                let point = new ol.format.GeoJSON().writeFeatureObject(item);
                var result = turf.booleanContains(polygon, point);
                if (result) {
                    draw_layer.getSource().addFeature(item);
                    console.log(item);

                }
            })
        })
    </script>
</body>

</html>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenLayers是一个开源的JavaScript库,用于在Web上显示交互式地图。OpenLayers提供了许多功能,包括缓冲区分析。缓冲区分析是一种地理空间分析方法,用于确定给定点、线或面周围一定距离内的区域。在OpenLayers中,可以使用Turf.js库来进行缓冲区分析。Turf.js是一个JavaScript库,用于进行地理空间分析和操作。它提供了许多功能,包括缓冲区分析、距离计算、面积计算等等。 要在OpenLayers中进行缓冲区分析,您需要使用Turf.js库。首先,您需要将OpenLayers图形转换为Turf.js图形,然后使用Turf.js库中的缓冲区分析函数来创建缓冲区。最后,您可以将Turf.js图形转换回OpenLayers图形,并将其添加到地图上。 以下是一个使用OpenLayers和Turf.js进行缓冲区分析的示例代码: ```javascript // 创建OpenLayers地图 var map = new ol.Map({ target: 'map', layers: [ new ol.layer.Tile({ source: new ol.source.OSM() }) ], view: new ol.View({ center: ol.proj.fromLonLat([37.41,8.82]), zoom: 4 }) }); // 创建OpenLayers图形 var circle = new ol.geom.Circle(ol.proj.fromLonLat([37.41, 8.82]), 100000); // 将OpenLayers图形转换为Turf.js图形 var turfCircle = turf.circle(circle.getCenter(), circle.getRadius(), {steps: 64, units: 'meters'}); // 使用Turf.js库中的缓冲区分析函数创建缓冲区 var buffered = turf.buffer(turfCircle, 10, {units: 'meters'}); // 将Turf.js图形转换回OpenLayers图形 var bufferedCircle = new ol.geom.Polygon(buffered.geometry.coordinates); // 创建OpenLayers要素并将其添加到地图上 var feature = new ol.Feature(bufferedCircle); var vectorSource = new ol.source.Vector({ features: [feature] }); var vectorLayer = new ol.layer.Vector({ source: vectorSource }); map.addLayer(vectorLayer); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@仗剑走天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值