Openlayers 各种定位

  • OpenLayers 教程
    • Openlayers 定位功能
    • 在线示例

OpenLayers 教程

地图定位是非常常用的功能,定位实现方式也是各种各样,而定位到线和面状图形比较容易,定位到点方式有点不同;本教程介绍定位到点、范围、图形要素 feature、图层 layer。

PS:定位到气泡框,详见:Openlayers 自定义气泡框以及定位到气泡框

本示例基于 Openlayers 添加 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>move to object</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();var featureTemp;// 添加点线面function addFeatures() {var features = [];features.push(getFeatureByWKT("POINT(116.17983834030585 39.98298600752048)"));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};featureTemp = getFeatureByGeoJson(geojson);features.push(featureTemp);features.push(getFeatureByWKB("0102000020E6100000040000004AB6DE424F095D4024548C542D0144404AB6DE42E10D5D4024548CD46D0444404AB6DE022D115D4024548CD4DBFF43404AB6DE42DB135D4024548CD46D044440"));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') {while (geojson.indexOf('null') != -1) {// geojson = geojsongeojson = geojson.replace("null", "");}}feature = (new ol.format.GeoJSON()).readFeature(geojson, {dataProjection: sourceCode || view.getProjection(),    // 设定JSON数据使用的坐标系featureProjection: targetCode || view.getProjection() // 设定当前地图使用的feature的坐标系});return feature;}/*** @todo coordinate格式数据转化成图形对象* @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;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;}}// 获取地图视图 viewvar view = map.getView();// 定位到点function positionPoint() {view.animate({center: [116.3820982809399, 39.91561299419557],//动画结尾的视图中心// zoom:7, //这里可以指定到具体等级duration: 2000,//动画的持续时间});}// 定位到范围function positionExtent() {//定位范围view.fit([114.47347835568841, 39.79771160671021, 115.99508480100091, 40.92930340358521], {duration: 2000,//动画的持续时间,callback: function () {alert("positionExtent compete !")},});}// 定位到图形要素 featurefunction positionFeature() {var extent = featureTemp.getGeometry().getExtent();//定位范围view.fit(extent, {duration: 2000,//动画的持续时间,callback: function () {alert("positionFeature compete !")},});}// 定位到图层 layerfunction positionLayer() {var extent = layer.getSource().getExtent();//定位范围view.fit(extent, {duration: 2000,//动画的持续时间,callback: function () {alert("positionLayer compete !")},});}
</script><button id="positionPoint" onclick="positionPoint()">定位到点</button>
<button id="positionExtent" onclick="positionExtent()">定位到范围</button>
<button id="positionFeature" onclick="positionFeature()">定位到Feature</button>
<button id="positionLayer" onclick="positionLayer()">定位到图层</button>
</body>
</html>

在线示例

Openlayers 各种定位:Openlayers moveto

Openlayers 各种定位:定位点、线、面以及图层等相关推荐

  1. (Python)识别和定位车道线

    一幅幅图片中去识别和定位车道线的位置 车道线有一个与柏油马路相比很明显的特征,那就是它是白色的 #importing some useful packages import matplotlib.py ...

  2. openlayers 绘制动态迁徙线、曲线

    前言:本来懒得写这个博客,实在深感无聊,没啥事情做,出篇博客让大家看看.文章会尽可能简短. 简单效果 掉帧属录屏效果,尚未测试过性能,因为这个可以看自己调节.以下为一条贝塞尔曲线分了180段的效果描述 ...

  3. vue后台系统管理项目-openlayers地图定位、港口数据标记功能

    openlayers地图功能 使用openlayers开发实现查找的货源在地图的显示标注,点击货源图标进行当前港口信息显示: 通过查询的港口列表数据,点击当前港口在地图定位显示,添加港口选中标记功能: ...

  4. java线上问题定位_线上java.lang.OutOfMemoryError问题定位三板斧

    OOM(OutOfMemoryError) 问题归根结底三点原因: 本身资源不够 申请的内存太多 资源耗尽 解决思路,换成Java服务分析,三个原因也可以解读为: 有可能是内存分配确实过小,而正常业务 ...

  5. 快速定位NodeJs线上问题 - 之火焰图篇

    0x01 背景 前段时间,公司监控群内报警,某个nodeJs项目 CPU 被打满,运维大哥快速重启解决,由于现场没有保留没定位到具体问题.2周后同样的报警又出来了,只能再次祭出重启大法,按照预期果然好 ...

  6. Vue + OpenLayers 实时定位(一) 前端展示

    文章目录 前言 一.定义标签样式 二.模拟 GeoJSON 数据 三.创建 VerctorLayer 四.构建地图 五.模拟实时移动 总结 前言 本系列文章介绍一个简单的实时定位示例,示例的组成主要包 ...

  7. 一键定位java 线上服务 CPU 100%

    传统方法: top oder by with P:1040 // 首先按进程负载排序找到 axLoad(pid) top -Hp 进程PID:1073 // 找到相关负载 线程PID printf & ...

  8. css 定位连线_CSS Position(定位)

    CSS Position(定位) CSS position属性用来指定元素如何在页面上定位,CSS Position(定位)的方式有以下几种:静态定位(static),绝对定位(absolute),相 ...

  9. css 定位连线_前端css实现两点连线

    // dots是点的集合 : Array dots.map((dot, index) => { // 最后一个点没有连线 if (!dot[index + 1]) return; const A ...

最新文章

  1. Bézier曲线 和 Bézier曲面 ( 贝塞尔曲线 和 贝塞尔曲面 )
  2. 上海大学建了一个“突发事件语料库”,包括地震、恐怖袭击等5大类
  3. [deviceone开发]-do_Http组件示例
  4. python和java一样吗-Python与Java的区别与优劣?
  5. mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发
  6. 第二个一千行总结-数据结构C复习--知识点总结2--五到七章
  7. 应对游戏业务的四大“崩溃”场景有妙招,安全畅玩不是梦!
  8. [学习总结]6、Android异步消息处理机制完全解析,带你从源码的角度彻底理解
  9. 微软不愿意提及的软肋:Win10的语音识别
  10. python---post请求时其中dict中套有json
  11. 2021-06-07java继承
  12. mac储存文件应该放在哪里_单位不能存档,个人档案应该放在哪里呢,影响今后退休金吗?...
  13. 图解tcpip读书笔记
  14. VBA在工作中的应用-批量添加工资条表头的VBA代码
  15. Apache虚拟主机配置详细教程
  16. “爱玛”等不达标电动自行车下架
  17. 计算机网络与Netty - F2F
  18. 《回炉重造》——集合(容器)
  19. 这些隐藏功能你知道吗
  20. FreeRTOS学习(一)

热门文章

  1. c语言中lseek函数,lseek函数解决方法
  2. 图网络算法——概率图介绍与贝叶斯网络
  3. 鸿蒙OS应用开发之——页面间跳转
  4. 影响AFE采样精度的因素有哪些?
  5. ARIMA(p,d,q)模型-1-MA模型
  6. 【PTA题目解答】7-7 调查电视节目受欢迎程度
  7. 黑马视频第一节课笔记重敲
  8. 数据解读 | 中国人到底有多爱吃火锅
  9. Sql Server 2008日志满的解决办法
  10. 亚商投资顾问 早餐FM/0111汽车芯片酝酿涨价