欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

OpenLayers基础入门与常用操作指南

最编程 2024-07-23 17:15:11
...

官网地址:openlayers.org/ 中文相关资料链接和参考资料:

  • blog.****.net/qingyafan?t…
  • linwei.xyz/ol3-primer/…

快速开始

  • 引入openlayers相关资源
  • 创建一个
    作为地图容器
  • 使用JavaScript创建一个简单的地图
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.13.0/css/ol.css" type="text/css">
    <style>
      .map {
        height: 400px;
        width: 100%;
      }
    </style>
    <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.13.0/build/ol.js"></script>
    <title>OpenLayers example</title>
  </head>
  <body>
    <h2>My Map</h2>
    <div id="map" class="map"></div>
    <script type="text/javascript">
      var map = new ol.Map({
        //target参数是地图容器的id
        target: 'map',
        //layers设置图层
        layers: [
          new ol.layer.Tile({
            source: new ol.source.OSM()
          })
        ],
        //view设置地图中心点,缩放级别,分辨率和旋转
        view: new ol.View({
          center: ol.proj.fromLonLat([37.41, 8.82]),
          zoom: 4
        })
      });
    </script>
  </body>
</html>

常用类简介

Layer 类

layer 是各种图层的基类,只用于让子类型继承和实现,一般自身不会实例化。主要有 WebGLPoints Layer、热力图(HeatMap Layer)、图片图层(Image Layer)、切片图层(Tile Layer) 和 矢量图层(Vector Layer) 五种类型。主要功能是对矢量数据和栅格数据的可视化。图层渲染结果的样式,主要与数据渲染方式有关,与数据源关系不大。

属性

  • source,指定了图层的数据来源,图层作用是以一定的样式渲染数据,source则指定了数据;
  • className,图层各个元素的样式;
  • opacity,透明度,默认为 1 ,即完全透明;
  • visible,是否可见;
  • zIndex,图层的叠加次序,默认是0,最底层,如果使用setMap方法添加的图层,zIndex值是Infinity,在最上层;
  • extent,图层渲染的区域,即浏览器窗口中可见的地图区域。extent 是一个矩形范围,格式是[number, number, number, number] 分别代表 [left, bottom, right, top] 。为了提升渲染效率和加载速度,extent范围之外的瓦片是不会请求的,当然也不会渲染;
  • minResolution,图层可见的最小分辨率;
  • maxResolution,图层可见的最大分辨率;
  • minZoom,图层可见的最小zoom level;
  • maxZoom,图层可见的最大zoom level;

事件触发

  • postrender ( module:ol/render/Event~RenderEvent ) - 渲染图层后触发。
  • prerender ( module:ol/render/Event~RenderEvent ) - 在渲染层之前触发。
  • propertychange ( module:ol/Object.ObjectEvent ) - 更改属性时触发。

行为

各种类型的图层

openlayers的图层主要分为两类:Vector(矢量)和Raster(栅格),矢量图层是指在渲染发生在浏览器的图层,source返回的数据类型是矢量,如geojson的坐标串;栅格图层则是由服务器渲染,返回到浏览器的是一张张的瓦片图片,栅格图层主要是展示。 矢量图层类型有:

  • Graticule,地图上覆盖的网格标尺图层;
  • HeatMap,热力图;
  • Vector,矢量图
  • VectorImage,单张的矢量图层
  • VectorTile,矢量瓦片图层
  • WebGLPoints,WebGL渲染的海量点图层

栅格图层类型较为简单,只有Tile图层。 各种图层详细介绍: WebGLPoint Layer:对于海量数据的个性化渲染也成为了可能,WebGLPoint Layer的style也变成了一个非常实用的功能。 Heatmap Layer:将矢量数据渲染成热度图的类,继承了 ol.layer.Vector 类,ol.layer.Vector 继承了ol.layer.Layer 类, 额外的参数是 olx.layer.HeatmapOptions blur 控制圆点的边缘,对边缘做模糊化; radius 则规定了圆点的半径

var heatmap = new ol.layer.Heatmap({
  source: new ol.source.KML({
    url: 'data/kml/2012_Earthquakes_Mag5.kml',
    projection: 'EPSG:3857',
    extractStyles: false
  }),
  blur: parseInt(blur.value, 10),
  radius: parseInt(radius.value, 10)
});

map = new ol.Map({  //初始化map
    target: 'map',
    layers: [
      new ol.layer.Tile({
        source: new ol.source.MapQuest({layer: 'sat'})
      }),
      heatmap
    ],
    view: new ol.View({
      center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
      zoom: 4
    })
}); 

Image Layer:主要是指服务器端渲染的图像,可能是已经渲染好的图像,或者是每一次请求,都根据请求内容定制化地生成一幅图片,该图层类型支持任意的范围和分辨率。

var imageLayer = new ol.layer.Image({
    source: new ol.source.ImageStatic({
        url: 'sample.jpg',
        projection: projection,
        imageExtent: extent
    })
})

map = new ol.Map({  //初始化map
    target: 'map',
    layers: [ imageLayer ],
    view: new ol.View({
      projection: projection,
      center: ol.extent.getCenter(extent),
      zoom: 2
    })
}); 

Tile Layer:切片地图是比较常用的图层类型,切片的概念,就是利用网格将一幅地图切成大小相等的小正方形 Vector Layer:即矢量图层,矢量图层实际上是在客户端渲染的图层类型,服务器返回的数据或者文件会通过 OpenLayers 进行渲染,得到相应的矢量图层。vectorlayer 相对于其他类型的图层,还包含了一个 style 参数,这个参数便是控制矢量图层的外观样式的,style 是一个 ol.style.Style 类型。

vectorLayer = new ol.layer.Vector({ //初始化矢量图层
  source: new ol.source.GeoJSON({
    projection: 'EPSG:3857',
    url: 'data/geojson/countries.geojson'   //从文件加载边界等地理信息
  }),
  style: function(feature, resolution) {
    style.getText().setText(resolution < 5000 ? feature.get('name') : '');  //当放大到1:5000分辨率时,显示国家名字
    return [style];
  }
});

Source

source 是 Layer 的重要组成部分,表示图层的来源,也就是服务地址。除了在构造函数中制定外,可以使用 layer.setSource(source) 稍后指定。 source 是 layer 中必须的选项,定义着地图数据的来源,与数据有关的函数,如addfeature、getfeature等函数都定义在 source 中,而且数据源支持多种格式。

类型:

  • ol.source.Vector:矢量图层的数据来源
  • ol.source.Tile:提供被切分为切片的图片地图数据
  • ol.source.Image:提供单一的图片地图

以下介绍主要基于ol.source.Vector

用法说明

包含四个事件,addfeature,changefeature,clear,removefeature。

  • addfeature,当一个要素添加到 source 中触发;
  • changefeature,当要素变化时触发;
  • clear,当 source 的 clear 方法调用时候触发;
  • removefeature,当要素移除时候发生。

参数

  • attribution,地图右下角的 logo 包含的内容;
  • features,地理要素,从字符串读取的数据;
  • format,url属性设置后,加载要素使用的数据格式,采用异步的 AJAX 加载;
  • loader,加载要素使用的加载函数;
  • logo,logo包含的内容;
  • strategy,加载要素使用的策略,默认是 一次性加载所有要素;
  • url,要素数据的地址;
  • wrapX,是否在地图水平坐标轴上重复,默认是 true。

方法

features 方法:假如有一个包含空间数据的字符串,geojsonObject,是GeoJSON字符串格式,那么可以用来初始化一个图层。

var vectorSource = new ol.source.Vector({
    features: (new ol.format.GeoJSON()).readFeatures(geojsonObject)
});

var vectorLayer = new ol.layer.Vector({
    source: vectorSource,
    style: style
});

map.addLayer(vectorLayer);

url + format 方法:如果有一个文件作为数据源,那么可以配置 url 属性来加载数据

var vectorLayer = new ol.layer.Vector({
  source: new ol.source.Vector({
    url: 'data/geojson/countries.geojson',
    format: new ol.format.GeoJSON()
  })
});

这两种方法中都会指定数据来源格式, 矢量数据源支持的格式包含很多:gml、EsriJSON、geojson、gpx、igc、kml、osmxml、ows、polyline、topojson、wfs、wkt、wms capabilities(兼容 wms 的格式)、 wms getfeatureinfo、 wmts capabilities、xlink、xsd等格式。这些格式都有**readFeatures **、**readFeature readGeometry **方法用于读取数据。

interaction

地图的交互功能包含很多,如地图双击放大,鼠标滚轮缩放,矢量要素点选,地图上绘制图形等等。只要是涉及到与地图的交互,就会涉及到 intercation 类,它定义了用户与地图进行交互的基本要素和事件。

属性

  • doubleclickzoom interaction,双击放大交互功能;
  • draganddrop interaction,以“拖文件到地图中”的交互添加图层;
  • dragbox interaction,拉框,用于划定一个矩形范围,常用于放大地图;
  • dragpan interaction,拖拽平移地图;
  • dragrotateandzoom interaction,拖拽方式进行缩放和旋转地图;
  • dragrotate interaction,拖拽方式旋转地图;
  • dragzoom interaction,拖拽方式缩放地图;
  • draw interaction,绘制地理要素功能;
  • interaction defaults ,规定了默认添加的交互功能;
  • keyboardpan interaction,键盘方式平移地图;
  • keyboardzoom interaction,键盘方式缩放地图;
  • select interaction,选择要素功能;
  • modify interaction,更改要素;
  • mousewheelzoom interaction,鼠标滚轮缩放功能;
  • pinchrotate interaction,手指旋转地图,针对触摸屏;
  • pinchzoom interaction,手指进行缩放,针对触摸屏;
  • pointer interaction,鼠标的用户自定义事件基类;
  • snap interaction,鼠标捕捉,当鼠标距离某个要素一定距离之内,自动吸附到要素。

交互

interaction defaults - 默认添加的交互功能 默认添加的交互包括: DragRotate, DragZoom, DoubleClickZoom, PinchRotate, PinchZoom, DragPan, KeyboardZoom, KeyboardPan, MouseWheelZoom

//去除某个默认项
interactions: ol.interaction.defaults([
    doubleClickZoom: false
]),

draw interaction - 绘图功能 绘图交互允许绘制几何地理要素,可选参数为一个对象,包含以下属性。

  • features,绘制的要素的目标集合;
  • source,绘制的要素的目标图层来源,即目标图层的 source属性 ;
  • snapTolerance,自动吸附完成点的像素距离,也就是说当鼠标位置距离闭合点小于该值设置的时候,会自动吸附到闭合点,默认值是 12;
  • type,绘制的地理要素类型,ol.geom.GeometryType类型,包含 Point、 LineString、 Polygon、MultiPoint、MultiLineString 或者 MultiPolygon;
  • minPointsPerRing,绘制一个多边形需要的点数最小值,数值类型,默认是 3;
  • style,要素素描的样式,是 ol.style.Style对象之一;
  • geometryName,绘制的地理要素的名称,string类型;
  • condition,一个函数,接受一个ol.MapBrowserEvent类型的参数,返回一个布尔值表示是否应该调用事件处理函数。默认情况下,增加一个顶点,类型为 ol.events.ConditionType。
//给地图添加该交互功能,首先需要实例化一个ol.interaction.Draw,必须指定 source和type属性
    var draw = new ol.interaction.Draw({
      source: source,
      type: "Polygon"
    });
//然后将该功能添加到地图中。
		map.addInteraction(draw)

dragrotateandzoom interaction - 鼠标拖拽进行缩放和旋转地图

 var interactions = ol.interaction.defaults().extend([
    new ol.interaction.DragRotateAndZoom()
 ]);
var map = new ol.Map({
...
  interactions:interactions,
...
})

dragbox interaction - 拉框交互 draganddrop interaction - 拖拽文件到地图 将空间数据使用鼠标或者手指拖拽到地图中,解析成一个图层添加到地图中。目前只支持矢量数据,未来可能支持更多的空间数据格式。目前,支持的格式包括 GeoJSON, GML, KML, GPX, OSMXML, TopoJSON 和 IGC。

var dragAndDropInteraction = new ol.interaction.DragAndDrop({
  formatConstructors: [
    ol.format.GeoJSON,
    ol.format.KML
  ]
});

 var interactions = ol.interaction.defaults().extend([
    new ol.interaction.DragRotateAndZoom(),
    dragAndDropInteraction
 ]);

keyboard interaction - 键盘交互功能 modify 和 select interaction select 就像名字暗示的一样,是用来选中要素的;而 modify 是修改要素的,主要是通过拖拽方式修改点的坐标。

//模拟选中并修改要素的交互功能需要添加如下代码
var select = new ol.interaction.Select();
var moddify = new ol.interaction.Modify({
    features:select.getFeatures()
});

pinchrotate ,pinchzoom interaction - 两个手指缩放和旋转地图 pointer interaction - 自定义鼠标事件 针对鼠标的行为按下(Down)、移动(Move)和抬起(Up),自定义事件。这三个事件发生有先后顺序,首先是触发按下,之后是移动事件,最后是抬起事件。只要配置相关的属性,包含handleDownEvent,handleDragEvent,handleMoveEvent,handleUpEvent分别对应鼠标的 down、drag、move和up四种事件。

new ol.interaction.Pointer({
    handleDownEvent: functionName
})

snap interaction - 鼠标捕捉 当修改和绘制矢量要素时,鼠标距离某个要素一定距离之内,自动吸附到要素。

control类(地图控件)

控件

OpenLayers 中包含的控件有:

  • controldefaults,地图默认包含的控件,包含缩放控件和旋转控件;
  • fullscreencontrol,全屏控件,用于全屏幕查看地图;
  • mousepositioncontrol,鼠标位置控件,显示鼠标所在地图位置的坐标,可以自定义投影;
  • overviewmapcontrol,地图全局视图控件;
  • rotatecontrol,地图旋转控件;
  • scalelinecontrol,比例尺控件;
  • zoomcontrol,缩放控件;
  • zoomslidercontrol,缩放刻度控件;
  • zoomtoextentcontrol,缩放到全局控件。

方法

调整控件样式的两种方法: 1.** 修改控件的可选参数的默认值**

<div  id="mouse-position" class="mouse-position-wrapper">
    <div class="custom-mouse-position"></div>
</div>
  .mouse-position-wrapper{
    width:300px; 
    height:29px; 
    color:#FFFFFF; 
    position:absolute; 
    right:20px; 
    bottom:6px; 
    z-index:999;
  }
//调整控件位置
    controls: ol.control.defaults().extend([
        new ol.control.FullScreen(),
        new ol.control.MousePosition({
            coordinateFormat: ol.coordinate.createStringXY(4),
            projection: 'EPSG:4326',
            className: 'custom-mouse-position',
            target: document.getElementById('mouse-position')
        })        
      ]),

2.覆盖默认样式- 在自己的 CSS 样式表中添加如下代码(因为自己的CSS文件样式优先级比外部链接引入的样式优先级高)

/* rewrite the default css in `ol.css` */  
.ol-rotate{
    right:40px;
  }

View

初始化一幅地图,必备的三要素之一就是视图(view),这个对象主要是控制地图与人的交互,如进行缩放,调节分辨率、地图的旋转等控制。

属性

  • view 的构造函数需要的参数是一个 olx.ViewOptions对象,主要属性如下:
  • center 是一个坐标[x, y],表示地图视图的中心位置;
  • extent 是一个数组对象 – [left, bottom, right, top],表示地图视图的初始范围;
  • projection 是地图的投影坐标系统;
  • resolution 表示地图的分辨率,单位并不是普通的单位面积的像素,而是单位像素表示的距离单位,比如 米/像素;
  • rotation 表示地图的旋转角度;
  • zoom 表示地图初始的缩放级别。

style

地图样式是由 style 类控制的,其包含了地图样式的方方面面,例如,填充色、图标样式、图片样式、规则图形样式、边界样式、文字样式等,样式一般针对矢量要素图层。 矢量图层样式可以事先写好,写成静态的,矢量图层直接按照定义好的样式渲染,也可以动态使用样式的 set() 方法,但是要注意刷新矢量图层,重新渲染,否则动态样式不生效。 样式主要针对矢量图层数据,既可以配置一个全局的样式,也可以针对每个feature单独配置;既可以应用统一的样式,也可以根据要素和分辨率应用条件样式。样式应用是非常灵活的。

配置项

  • geometry,要素的属性,或者要素,或者一个返回一个地理要素的函数,用来渲染成相应的地理要素;

一般与 image 样式配合使用,表示 image 放置的位置

//该样式配置了一个 image 属性,表示在相应的位置放置的图片的样式,
//这里是一个半径为 5,填充色为橙色的圆形的图片样式
new ol.style.Style({
    image: new ol.style.Circle({
      radius: 5,
      fill: new ol.style.Fill({
        color: 'orange'
      })
    }),
    geometry: function(feature) {
      // return the coordinates of the first ring of the polygon
      var coordinates = feature.getGeometry().getCoordinates()[0];
      return new ol.geom.MultiPoint(coordinates);
    }
  })
  • fill,填充要素的样式;

配置图层的要素的填充颜色和透明度

  • iamge,图片样式,类型为 ol.style.Image;

样式主要针对矢量图层(vector layer),矢量图层中包含一个或多个要素(feature),要素中包含一个地理属性(geometry)表示地理位置,还可能包含一个或多个其他属性,比如要素的名称、类型等等,要素可以使用单独的样式,这时候要使用 feature.setStyle(ol.style.Style) 来设置单独使用的样式,否则直接继承矢量图层的样式

//定义一个图标样式
var iconStyle = new ol.style.Style({
  image: new ol.style.Icon(({
    src: 'data/icon.png'
  }))
});
//定义一个点要素
var iconFeature = new ol.Feature({
  geometry: new ol.geom.Point([0, 0]),
});

//将样式应用于点要素
iconFeature.setStyle(iconStyle);

//定义一个矢量图层,并加入该要素
var iconLayer = new ol.layer.Vector({
    source: new ol.source.Vector({
        features: [iconFeature]
    })
});

  • stroke,要素边界样式,类型为 ol.style.Stroke;
color: '#319FD3', width: 1
  • text,要素文字的样式,类型为 ol.style.Text;
text: new ol.style.Text({
  font: '12px Calibri,sans-serif',    //字体与大小
  fill: new ol.style.Fill({    //文字填充色
    color: '#000'
  }),
  stroke: new ol.style.Stroke({    //文字边界宽度与颜色
    color: '#fff',
    width: 3
  })
})
  • zIndex,CSS中的zIndex,即叠置的层次,为数字类型。

子类

  • ol.style.Circle,针对矢量要素设置圆形的样式,继承 ol.style.Image;
  • ol.style.Icon,针对矢量数据设置图标样式,继承 ol.style.Image;
  • ol.style.Fill,针对矢量要素设置填充样式;
  • ol.style.RegularShape,对矢量要素设置规则的图形样式,如果设置 radius,结果图形是一个规则的多边形,如果设置 radius1 和 radius2,结果图形将是一个星形;
  • ol.style.Stroke,矢量要素的边界样式;
  • ol.style.Text,矢量要素的文字样式。
var style = new ol.style.Style({
  fill: new ol.style.Fill({ //矢量图层填充颜色,以及透明度
    color: 'rgba(255, 255, 255, 0.6)'
  }),
  stroke: new ol.style.Stroke({ //边界样式
    color: '#319FD3',
    width: 1
  }),
  text: new ol.style.Text({ //文本样式
    font: '12px Calibri,sans-serif',
    fill: new ol.style.Fill({
      color: '#000'
    }),
    stroke: new ol.style.Stroke({
      color: '#fff',
      width: 3
    })
  })
});

条件样式

条件样式是将样式配置为一个回调函数,其参数包含要素本身和分辨率,可以根据要素本身的属性和地图的分辨率,显示动态的样式,形式如 style: function(feature, resolution) {}。 例如,以下代码段配置当分辨率小于 5000 时候,在要素上显示一个标签,标识要素名称:

style: function(feature, resolution) {
    style.getText().setText(resolution < 5000 ? feature.get('name') : '');
    return styles;
  }

Vector

  在 GIS 中,地图一般分为两大类:栅格地图和矢量地图,栅格地图其实就是数码照片,只不过有的是卫星拍的。它们有一个共同特征,就是它们都是由很多个像素组成,像素大小是一致的,行高和列宽是一致的,从这个角度看,一幅遥感影像就像栅格。
  矢量地图,是由很多要素组成的,每个要素都有自己的地理坐标,基于数学规则,无论矢量地图怎么放大,地图都不会失真。它是 OpenLayers 中非常重要的一种图层类型,利用矢量地图可以实现非常多的功能,如 动态标绘、调用 WFS 服务、编辑要素、可点击的要素、动态加载要素 等等。

矢量图层是在客户端渲染的,在 web 环境中,对应的就是浏览器。构成一个矢量图层的包含一个数据(source)和一个样式(style),数据构成矢量图层的要素,样式规定要素显示的方式和外观。一个初始化成功的矢量图层包含一个到多个要素(feature),每个要素由地理属性(geometry)和多个其他的属性,可能包含名称等。结构如下图:

属性

在初始化矢量图层时,可以有很多选项配置矢量图层的行为和外观,常用的有:

  • brightness、contrast,图层亮度和对比度,都是一个数值;
  • renderOrder,一个指定规则的函数 (function(ol.Feature, ol.Feature));
  • hue,色调,是一个数值;
  • minResolution,可见的最小分辨率;
  • maxResolution,可见的最大分辨率;
  • opacity,图层的透明度,0~1之间的数值,1表示不透明;
  • saturation,饱和度;
  • source,图层数据来源;
  • style,图层样式,一个ol.style.Style或者一个ol.style.Style数组,或者一个返回 ol.style.Style 的函数;
  • visible,图层可见性,默认为 true。
//初始化一个矢量图层
var vector = new ol.layer.Vector({
  source: new ol.source.Vector({
    url: 'data/china_province_boundries.geojson', //数据来源
    projection: 'EPSG:3857',
//数据解析器 因为 url 规定的数据来源是 geojson 格式,所以解析器也是 geojson 解析器 new ol.format.GeoJSON
    format: new ol.format.GeoJSON({
        extractStyles: false
    })
  }),
  style: style
});

方法

取得要素 vector 的数据包含在 source 中,要取得 vector 的 feature 数据,要在 source 中,例如 vector.getSource().getFeatures(),该函数会返回一个 feature array,直接使用 [ ],取用即可,或者根据要素的 ID 取得(getFeatureById())。 取得要素的 geometry 利用 getGeometry() 可以获得要素的地理属性,这个函数当然返回要素包含的 geometry,geometry 包含很多类型,主要有 point、multi point、linear ring、line string、multi line string、polygon、multi polygon、circle。 取得 geometry 后,就可以获得要素的坐标了,可以根据坐标做一些地理判断,比如判断 一个坐标是否位于要素内(containsCoordinate(coordinate) 或者 containsXY(x, y)),取得要素的中心坐标等。

Overlay(覆盖物)

主要的用途就是在地图之上再覆盖一层,用以显示额外的可见元素,可见元素一般是 HTML 元素,利用 overlay,可以将可见元素放置到地图的任意位置,形成地图上再浮动一层的效果。例如在地图上相应的坐标放置一个标志,标签,利用 overlay 都可以做到,具体来说,点击地图上某位置,在点击位置弹出弹出框就是利用了 overlay。

配置项

  • id,为对应的 overlay 设置一个 id,便于使用 ol.Map 的 getOverlayById 方法取得相应的 overlay;
  • element,overlay 包含的 DOM element;
  • offset,偏移量,像素为单位,overlay 相对于放置位置(position)的偏移量,默认值是 [0, 0],正值分别向右和向下偏移;
  • position,在地图所在的坐标系框架下,overlay 放置的位置;
  • positioning,overlay 对于 position 的相对位置,可能的值包括 bottom-left、bottom-center、bottom-right 、center-left、center-center、center-right、top-left、top-center、top-right,默认是 top-left,也就是 element 左上角与 position 重合;
  • stopEvent,地图的事件传播是否停止,默认是 true,即阻止传播,可能不太好理解,举个例子,当鼠标滚轮在地图上滚动时,会触发地图缩放事件,如果在 overlay 之上滚动滚轮,并不会触发缩放事件,如果想鼠标在 overlay 之上也支持缩放,那么将该属性设置为 false 即可;
  • insertFirst,overlay 是否应该先添加到其所在的容器(container),当 stopEvent 设置为 true 时,overlay 和 openlayers 的控件(controls)是放于一个容器的,此时将 insertFirst 设置为 true ,overlay 会首先添加到容器,这样,overlay 默认在控件的下一层(CSS z-index),所以,当 stopEvent 和 insertFirst 都采用默认值时,overlay 默认在 控件的下一层;
  • autoPan,当触发 overlay setPosition 方法时触发,当 overlay 超出地图边界时,地图自动移动,以保证 overlay 全部可见;
  • autoPanAnimation,设置 autoPan 的效果动画,参数类型是 olx.animation.panOptions;
  • autoPanMargin,地图自动平移时,地图边缘与 overlay 的留白(空隙),单位是像素,默认是 20像素;

事件

  • change,当引用计数器增加时,触发;
  • change:element,overlay 对应的 element 变化时触发;
  • change:map,overlay 对应的 map 变化时触发;
  • change:offset,overlay 对应的 offset 变化时触发;
  • change:position,overlay 对应的 position 变化时触发;
  • change:positioning,overlay 对应的 positioning 变化时触发;
  • propertychange,overlay 对应的属性变化时触发;
// example overlay event binding
var overlay = new ol.Overlay({
    // ...
});
overlay.on("change:position", function(){
    console.log("位置改变!");
})

方法

  • getElement,取得包含 overlay 的 DOM 元素;
  • getId,取得 overlay 的 id;
  • getMap,获取与 overlay 关联的 map对象;
  • getOffset,获取 offset 属性;
  • getPosition,获取 position 属性;
  • getPositioning,获取 positioning 属性;
  • setElement;设置 overlay 的 element;
  • setMap,设置与 overlay 的 map 对象;
  • setOffset,设置 offset;
  • setPosition,设置 position 属性;
  • setPositioning,设置 positioning 属性。

常用操作

加载天地图底图

// 背景
let tian_di_tu_road_layer = new ol.layer.Tile({
  title: "天地图路网",
  source: new ol.source.XYZ({
    url: "http://t4.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=xxx"
  })
});

// 文字标注
let tian_di_tu_annotation = new ol.layer.Tile({
  title: "天地图文字标注",
  source: new ol.source.XYZ({
    url: 'http://t4.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=xxx'
  })
});

// 地图创建
let map = new ol.Map({
  ...
  // 图层
  layers: [tian_di_tu_road_layer, tian_di_tu_annotation],
  ...
});

加载 WFS 服务

WFS服务,可以通过OL进行加载,加载有简单方式也有GetFeature方式,该种方式*度更大,可以结合一些过滤条件,这样一方面可以提高加载数据的效率。

一次性加载数据

// WFS 格式化工具
const wfsJsonFormat = new ol.format.WFS();

// GML 格式化工具
const gmlJsonFormat = new ol.format.GML();

// 矢量数据源
const vectorSource = new ol.source.Vector();

// 创建一个请求
const featureRequest = wfsJsonFormat.writeGetFeature({
  srsName: 'EPSG:4326',//坐标系
  featureNS: url,
  // 注意这个值必须为创建工作区时的命名空间URI
  featurePrefix: 'XXX_LAYER',
  //工作区的名称
  featureTypes: ['PUMP_GATE_STATION_POINT'],
  //所要访问的图层
  outputFormat: 'application/json'
  //这里面有三个参数是必须的:featureNS、featurePrefix、featureTypes。这三个参数必须赋值否则错误。
});

// 利用 XMLSerializer.serializeToString 将 xml 格式转为 string
//let xmlSerializer = new XMLSerializer();
//let params = xmlSerializer.serializeToString(featureRequest);

// 发起请求
fetch(url, {
  method: 'POST',
  body: new XMLSerializer().serializeToString(featureRequest)
}).then(response => {
    // xml 格式不能直接用 response.json() 转 
    return response.text();
  	//非xml格式
  	//return response.json();
}).then(data => {
  // 读取图形信息
  let features = gmlJsonFormat.readFeatures(data);
  //非xml格式
  //var features = new ol.format.GeoJSON().readFeatures(json);
  if (features.length > 0) {
    // 添加图形
    vectorSource.addFeatures(features);
    
    // 调整地图视角
    map.getView().fit(vectorSource.getExtent());
  }
})

// 矢量图层
const layer = new ol.layer.Vector({
  // 设置数据源 
  source: vectorSource,
  
  // 设置图层样式
  style: new ol.style.Style({
    image: new ol.style.Icon({
      scale: 0.8,
      src: require("imgurl")
    })
  })
});

// 将图层添加到地图上
map.addLayer(layer);

动态加载数据

// 矢量数据源
const vectorSource = new VectorSource({
  // 设置格式化类型 
  format: new ol.format.GeoJSON(),
  
  // url(extent) 在地图范围变化时调用,返回当前的地图范围
  url: function (extent) {
    return (
      `url?service=WFS&version=1.0.0&request=GetFeature&typeName=luhao%3Asuqian&maxFeatures=50&outputFormat=application%2Fjson&bbox=${extent.join(',')},EPSG:4326`
    );
  },
  strategy: ol.loadingstrategy.bbox
});

// 矢量图层
const layer = new ol.layer.Vector({
  // 设置数据源 
  source: vectorSource,
  
  // 设置图层样式也可以 function (feature) { /** 根据内容动态加载样式 **/ return Style}
  style: new ol.style.Style({
    image: new ol.style.Icon({
      scale: 0.8,
      src: require("imgurl")
    })
  })
});

// 将图层添加到地图上
map.addLayer(layer);

加载 geoService 服务

一次性加载数据

// GeoJSON 格式化工具
const geoJsonFormat = new ol.format.GeoJSON();

// 矢量数据源
const vectorSource = new ol.source.Vector();

// 请求参数
let params = {
  service: "WFS",
  version: "1.0.0",
  request: "GetFeature",
  typeName: "name",
  maxFeatures: "50",
  outputFormat: "application/json",
}

// 发起请求
request({url: 'url', params}).then(response => {
  // 读取图形数据
  const features = geoJsonFormat.readFeatures(response);
  
  if (features.length > 0) {
     // 添加图形
    vectorSource.addFeatures(features);
    
    // 调整地图视角
    map.getView().fit(vectorSource.getExtent());
  }
});

// 矢量图层
const layer = new ol.layer.Vector({
  // 设置数据源 
  source: vectorSource,
  
  // 设置图层样式也可以 function (feature) { /** 根据内容动态加载样式 **/ return Style}
  style: new ol.style.Style({
    image: new ol.style.Icon({
      scale: 0.8,
      src: require("imgurl")
    })
  })
});

// 将图层添加到地图上
map.addLayer(layer);

动态加载数据

// 矢量数据源
const vectorSource = new ol.source.Vector({
 // 设置格式化类型 
  format: new ol.format.GeoJSON(),
  
  // url(extent) 在地图范围变化时调用,返回当前的地图范围
  url: function (extent) {
    return 'url?service=WFS&version=1.0.0&request=GetFeature&typeName=luhao%3Asuqian&maxFeatures=50&outputFormat=application%2Fjson&' + 'bbox=' +
      extent.join(',') +
      ',EPSG:4326';
  },
  strategy: ol.loadingstrategy.bbox,
});

// 矢量图层
const layer = new ol.layer.Vector({
  // 设置数据源 
  source: vectorSource,
  
  // 设置图层样式也可以 function (feature) { /** 根据内容动态加载样式 **/ return Style}
  style: new ol.style.Style({
    image: new ol.style.Icon({
      scale: 0.8,
      src: require("imgurl")
    })
  })
});

// 将图层添加到地图上
map.addLayer(layer);

加载 arcgis 服务

一次性加载数据

// EsriJSON 格式化工具
const esriJsonFormat = new ol.format.EsriJSON();

// 矢量数据源
const vectorSource = new ol.source.Vector();

// 请求参数
let params = {
  f: 'json',
  where: '1=1',
  returnGeometry: true,
  spatialRel: 'esriSpatialRelIntersects',
  inSR: 4326,
  outSR: 4326,
  outFields: '*',
};

// 发起请求
request({url: 'url', params}).then(response => {
  // 读取图形数据
  const features = esriJsonFormat.readFeatures(response);
  
  if (features.length > 0) {
     // 添加图形
    vectorSource.addFeatures(features);
    
    // 调整地图视角
    map.getView().fit(vectorSource.getExtent());
  }
});

// 唯一值渲染
let {Style, Icon} = ol.
						

上一篇: Git Flow:功能详解与实际操作指南

下一篇: 如何在PyTorch中获取预训练的VGG16模型的特征层输出示例