前言

本系列文章介绍一个简单的实时定位示例,示例的组成主要包括:

  • 服务后端,使用 java 语言编写,模拟生成 geojson 数据。
  • 前端展示,使用 vue + openlayers ,负责定时向后端服务请求 geojson 数据,并在以标签的形式展现定位数据。

实现的效果:

一、定义标签样式

	var image = new circlestyle({
	  radius: 5,
	  fill: new fill({
	    color: "rgba(255, 0, 0, 1)"
	  }),
	  stroke: new stroke({ color: "red", width: 1 })
	});
	
	var styles = {
	  point: new style({
	    image: image
	  })
	};
	
	var stylefunction = function(feature) {
	  return styles[feature.getgeometry().gettype()];
	};

二、模拟 geojson 数据

	var geojsonobject = {
	  type: "featurecollection",
	  features: [
	    {
	      type: "feature",
	      geometry: {
	        type: "point",
	        coordinates: [0, 0]
	      }
	    }
	    //此处可以添加更多 feature
	  ]
	};

三、创建 verctorlayer

	//读取 geojson, 将其作为 vectorsource 的数据源
	var vectorsource = new vectorsource({
	  features: new geojson().readfeatures(geojsonobject)
	});
	
	var vectorlayer = new vectorlayer({
	  source: vectorsource,
	  style: stylefunction
	});

四、构建地图

      mounted() {
    this.map = new map({
      layers: [
        new tilelayer({
          source: new osm()
        }),
        vectorlayer
      ],
      target: "map",
      view: new view({
        center: [0, 0],
        zoom: 2
      })
    });
	
	//设置定时任务,调用移动标签方法
    setinterval(this.translate, 500);
  },

五、模拟实时移动

	 methods: {
	    translate() {
	      //遍历标签, 修改坐标位置
	      vectorsource.foreachfeature(function(f) {
	        console.log("translate");
	        
	        //随机产生坐标增量(此处不是坐标绝对值!!!!)
	        var x = math.random() * 1000000;
	        var y = math.random() * 1000000;
	        f.getgeometry().translate(x, y);
	      });
	    }
	  }

总结

以上是一个简单实时定位前端示例,通过模拟的 geojson 对象展示标签,并通过定时任务模拟标签位置变化。下一篇将使用 java 服务端提供位置数据,完整模拟一个实时定位系统。
可以在vue项目中直接运行的完整代码:

	<template>
	  <div>
	    <span>hi, map</span>
	    <div id="map" class="map"></div>
	  </div>
	</template>
	
	<script lang="ts">
	import "ol/ol.css";
	import geojson from "ol/format/geojson";
	import map from "ol/map";
	import view from "ol/view";
	import { circle as circlestyle, fill, stroke, style } from "ol/style";
	import { osm, vector as vectorsource } from "ol/source";
	import { tile as tilelayer, vector as vectorlayer } from "ol/layer";
	
	import vue from "vue";
	
	var image = new circlestyle({
	  radius: 5,
	  fill: new fill({
	    color: "rgba(255, 0, 0, 1)"
	  }),
	  stroke: new stroke({ color: "red", width: 1 })
	});
	
	var styles = {
	  point: new style({
	    image: image
	  })
	};
	
	var stylefunction = function(feature) {
	  return styles[feature.getgeometry().gettype()];
	};
	
	var geojsonobject = {
	  type: "featurecollection",
	  features: [
	    {
	      type: "feature",
	      geometry: {
	        type: "point",
	        coordinates: [0, 0]
	      }
	    }
	  ]
	};
	
	var vectorsource = new vectorsource({
	  features: new geojson().readfeatures(geojsonobject)
	});
	
	var vectorlayer = new vectorlayer({
	  source: vectorsource,
	  style: stylefunction
	});
	
	export default vue.extend({
	  data() {
	    return {
	      map: {}
	    };
	  },
	  mounted() {
	    this.map = new map({
	      layers: [
	        new tilelayer({
	          source: new osm()
	        }),
	        vectorlayer
	      ],
	      target: "map",
	      view: new view({
	        center: [0, 0],
	        zoom: 2
	      })
	    });
	
	    setinterval(this.translate, 500);
	  },
	
	  methods: {
	    translate() {
	      vectorsource.foreachfeature(function(f) {
	        console.log("translate");
	        var x = math.random() * 1000000;
	        var y = math.random() * 1000000;
	        f.getgeometry().translate(x, y);
	      });
	    }
	  }
	});
	</script>
	<style>
	.map {
	  width: 100%;
	  height: 600px;
	}
	</style>

到此这篇关于vue + openlayers实现实时定位功能的文章就介绍到这了,更多相关vue openlayers 定位内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!