百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Openlayers 添加 WKT WKB GeoJson 格式点线面数据

zhezhongyun 2025-04-24 10:36 31 浏览

OpenLayers 教程

对于数据量不是很大的场景,可以直接从数据库读取数据,通过创建点线面要素(Feature),然后添加到矢量图层(vectorLayer)中,在地图上展示。添加点线面的方法可以封装一下,方便使用。

GIS数据最好符合标准,这里介绍 WKT WKB GeoJson 标准格式数据。


Openlayers 创建矢量图层,添加点线面图形要素

<html lang="en">
  <head>
    <meta charset="utf-8">
    <!--注意:openlayers 原版的比较慢,这里引起自己服务器版-->
    <link rel="stylesheet" href="http://openlayers.vip/examples/css/ol.css" type="text/css">
    <style>
       /* 注意:这里必须给高度,否则地图初始化之后不显示;一般是计算得到高度,然后才初始化地图 */
      .map {
        height: 400px;
        width: 100%;
		float:left;
      }   
    </style>
    <!--注意:openlayers 原版的比较慢,这里引起自己服务器版-->
    <script src="http://openlayers.vip/examples/resources/ol.js"></script>
    <script src="./tiandituLayers.js"></script>
    <title>OpenLayers example</title>
  </head>
  <body>
    <h2>Feature Layer</h2>
    <!--地图容器,需要指定 id -->
    <div id="map" class="map"></div>

    <script type="text/javascript">
      var map = new ol.Map({
        // 地图容器
        target: 'map',
        // 地图图层,比如底图、矢量图等
        layers: [
          getIMG_CLayer(),
          getIBO_CLayer(),
		  getCIA_CLayer(),
        ],
        // 地图视野
        view: new ol.View({
          // 设置投影
          projection: "EPSG:4326",
		  // 定位
		  center: [116, 39],
		  // 缩放
		  zoom: 4,
		  maxZoom: 18,
		  minZoom: 1,
		})
      });  

	var layer = initVectorLayer();
	addFeatures();
	
	// 添加点线面
	function addFeatures() {
		var features = [];
		// 添加 WKT 数据
		features.push(getFeatureByWKT("POINT(116.17983834030585 39.98298600752048)"));
		// 添加 geojson 数据
		var geojson = {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[116.09129344901807,39.976463050783],[116.12802898368604,39.986934394777144],[116.14845668754346,39.970454902589644],[116.14365016898877,39.952945442140425],[116.11069118461377,39.95037052148613],[116.09129344901807,39.976463050783]]]},"properties":null};
		features.push(getFeatureByGeoJson(geojson));
		// 添加 WKB 数据
		features.push(getFeatureByWKB("0102000020E6100000040000004AB6DE424F095D4024548C542D0144404AB6DE42E10D5D4024548CD46D0444404AB6DE022D115D4024548CD4DBFF43404AB6DE42DB135D4024548CD46D044440"));
		// 将 features 添加到图层中
		layer.getSource().addFeatures(features);

		// 地图定位
		var extent = layer.getSource().getExtent();
		map.getView().fit(extent, {
                duration:  1,//动画的持续时间,
                callback: null,
            });
	}
    /**
     * @todo 矢量图层
     * @returns {VectorLayer}
     * @constructor
     */
    function initVectorLayer() {
        //实例化一个矢量图层Vector作为绘制层
        let source = new ol.source.Vector();
        //创建一个图层
        let customVectorLayer = new ol.layer.Vector({
            source: source,
            zIndex: 2,
			//设置样式
            style: new ol.style.Style({
                //边框样式
                stroke: new ol.style.Stroke({
                    color: 'red',
                    width: 5,
                    lineDash: [3, 5]
                }),
                //填充样式
                fill: new ol.style.Fill({
                    color: 'rgba(0, 0, 255, 0.3)',
                }),
                // 点的样式
                image: new ol.style.Circle({
                    // 点半径
                	radius: 9,
                	// 点颜色
                	fill: new ol.style.Fill({
                    	color: 'red',
                	})
            	})
            }),
        });
        //将绘制层添加到地图容器中
        map.addLayer(customVectorLayer);
        return customVectorLayer;
    }
    /**
     * @todo wkt格式数据转化成图形对象
     * @param {string} wkt   "POINT(112.7197265625,39.18164062499999)" 格式数据
     * @param {string|Projection} sourceCode 源投影坐标系
     * @param {string|Projection} targetCode 目标投影坐标系
     * @returns {Feature}
     */
   function getFeatureByWKT(wkt, sourceCode, targetCode) {
        try {
            let view = map.getView();
            if (!wkt) {
                return null;
            }
            // 数据格式类型
            let format = new ol.format.WKT();

            let feature;

            feature = format.readFeature(wkt, {
                  featureProjection: targetCode || view.getProjection(),
                  dataProjection: sourceCode || view.getProjection(),
              });

            return feature;
        } catch (e) {
            console.log(e);
            return null;
        }
    }
    /**
     * @todo 图形对象转化成GeoJson格式数据(postgis)
     * @param {string|object} geojson geojson字符串或者对象
     * @param {string|Projection} sourceCode 源投影坐标系
     * @param {string|Projection} targetCode 目标投影坐标系
     * @returns {Feature}
     */
   function getFeatureByGeoJson(geojson, sourceCode, targetCode) {

        let view = map.getView();

        if (!geojson) {
            return null;
        }

        let feature;

        if ((typeof geojson) == 'string') {
			// 替换 null 字符
            while (geojson.indexOf('null') != -1) {
                // geojson = geojson
                geojson = geojson.replace("null", "");
            }
        }

        feature = (new ol.format.GeoJSON()).readFeature(geojson, {
            dataProjection: sourceCode || view.getProjection(),    // 设定JSON数据使用的坐标系
            featureProjection: targetCode || view.getProjection() // 设定当前地图使用的feature的坐标系
        });
  
        return feature;
    }
    /**
     * @todo WKB格式数据转化成图形对象
     * @param {string} coordinate   0101000020E610000063B48EAA26105D404E7FF623451C4440 格式数据
     * @param {string|Projection} sourceCode 源投影坐标系
     * @param {string|Projection} targetCode 目标投影坐标系
     * @returns {Feature}
     */
    function getFeatureByWKB(coordinate, sourceCode, targetCode) {
        try {
            let view = map.getView();
            if (!coordinate) {
                return null;
            }
            // 数据格式类型
            let format = new ol.format.WKB();

            let feature;

			// 判断收尾,是否为 WKB 格式
            if (coordinate.indexOf('010') == 0) {

				// 判断字符结尾
                let confirmEnding = function (str, target) {
                    // 请把你的代码写在这里
                    var start = str.length - target.length;
                    var arr = str.substr(start, target.length);
                    if (arr == target) {
                        return true;
                    }
                    return false;
                }

                if (confirmEnding(coordinate, '40')) {
                    feature = (format).readFeature(coordinate, {
                        dataProjection: sourceCode || view.getProjection(),    // 设定JSON数据使用的坐标系
                        featureProjection: targetCode || view.getProjection() // 设定当前地图使用的feature的坐标系
                    });
                }
            }

            return feature;
        } catch (e) {
            console.log(e);
            return null;
        }
    }
    </script>
  </body>
</html>

在线示例

Openlayers 添加 WKT WKB GeoJson 格式点线面数据:OpenLayers example

相关推荐

css 垂直居中的几种实现方式(css怎么实现垂直居中)

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

CSS 中各种居中你真的玩明白了么(css中的居中属性)

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

浅谈3种css技巧——两端对齐(css两侧对齐)

在出里文字比较多的网页,文字对齐其中采用的两端对齐,两端对齐的方法有三种方法,如下:1.使用text-align:justifytext-align:justify属性是全兼容的,使用它实现两端对...

从零开发HarmonyOS(鸿蒙)运动手表小游戏—数字华容道

本个demo将从零基础开始完成鸿蒙小游戏APP在可穿戴设备上的编译,此处以运动手表为例,在项目中我们所使用到的软件为DevEcoStudio,下载地址为:DevEcoStudio下载、DevEco...

教师如何制作随机点名系统,活跃课堂气氛

上课点名抽学生回答问题,做游戏……由老师口头点名,点谁回答总有点老师本人的情绪,且显得毫无趣味,但做一个点名系统,就不一样了,电脑随机抽出的名字,不仅公平,还会给孩子们带来一种不一样的感受。那么怎么做...

看京铁人如何破解电煤运输&quot;烤&quot;验

“天气太热了!空调是我的避暑必备神器再往冰箱里冻些雪糕和西瓜电风扇也要24小时上岗了”近日京津冀地区迎来高温天气小伙伴们都在分享解暑妙招但这些妙招背后都离不开一个字——“电”为确保电力平稳“迎峰度夏”...

回家的路就是最美的风景 幸福就在前方

2025年春运启动以来,无数在外游子踏上归乡旅程。为了帮助更多旅客按时回家过年,还有很多人不分昼夜、不辞辛苦地奔波在铁路线上。“我的列车飞驰而过,那是梦想的前方,回家的路就是最美的风景。”END&l...

如何做出一个香消玉殒的网页文字特效

最近,迷上了CSS3特效,空闲时间学一些小案例,非专业,爱好。不断学习也能掌握一些更为全面的html,css,JavaScript的知识,以小博大,从兴趣出发再掌握更多网页开发知识。闲言少叙,直接开怼...

第1000篇原创,我想对你说______(2021我想对你说1000)

亲爱的小伙伴今天您看到的这篇推送是“北京铁路”发布的第1000篇原创作品!这不仅是一个数字的跨越更是我们一路走来与每一位关注者共同铸就的辉煌里程碑每一篇文章都承载着我们的心血与热情每一次传播都离不开大...

动车组的“家”在哪里?(动车组的"家"在哪里?举例说明)

夜幕降临随着动车组列车驶入站台乘客陆续离开动车组也完成了一天的工作准备启程回“家”有小伙伴儿会问“为什么大多数动车组列车夜间不运行呢?”这是因为白天行驶一天的动车组要利用晚上的时间进行全面检查、维修和...

这套铁路“高考”卷,请你来作答(郑州铁路职业技术学院高考河南录取分数线)

今天是2025年全国高考的第一天小编为大家准备了一套北京铁路版的试卷满分120分共12道单选题快来试试你能得多少分吧!·<animateattributeName="opacity"begi...

HarmonyOS Text组件Span间距解决方案

HarmonyOSText组件Span间距解决方案一、问题分析在HarmonyOS开发中,Text组件内的Span子组件无法直接设置margin/padding属性,需要通过文本级属性实现间距控制。...

考“火车驾驶证”,难不难?(火车驾驶证怎么考需要什么条件)

····<animateattributeName="height"begin="0.1"dur="0.01s"fill="freeze"to="0"/>00:0002:59未加...

高温?京铁人:我有“物理外挂”!(点开看有多爽)

近几日华北地区气温不断上升高温来袭坚守岗位的京铁人开启清凉避暑的“物理外挂”快动动手指点开看看吧·<animateattributeName="opacity"begin="click+0....

2025年Top30 CSS面试题及答案(css常考面试题)

概述CSS(层叠样式表)是构建美观、响应式网站的关键技术。无论您是在准备前端开发者面试还是复习知识,这里都有一份精心挑选的2025年每个开发者都应该知道的30个CSS面试题及答案。1.什么是CSS...