import { getCogStatistics, getCogBounds } from "./ol-api.js";
import { Stroke, Style, Fill, Circle, Text } from 'ol/style';
import { transform, transformExtent, toLonLat, Projection } from 'ol/proj';
import { Vector as VectorLayer, Tile, Image as ImageLayer } from 'ol/layer';
import { Vector as VectorSource, XYZ, ImageStatic, ImageWMS, WMTS } from 'ol/source';
import WMTSTileGrid from 'ol/tilegrid/WMTS';
import * as olControl from 'ol/control';
import Map from 'ol/Map';
import View from 'ol/View';
import Draw, {
createBox,
createRegularPolygon
} from 'ol/interaction/Draw';
import Overlay from 'ol/Overlay'
import {
LineString,
Polygon,
MultiLineString
} from 'ol/geom'
import * as olSphere from 'ol/sphere'
import {
unByKey
} from 'ol/Observable'
import { WKT } from 'ol/format';
import { defaults } from 'ol/interaction/defaults';
// titiler加载中 获取最大最小范围
export function getMinMax (obj) {
let min = null, max = null
Object.keys(obj).forEach((key) => {
if (!min || min > obj[key].percentile_2) {
min = obj[key].percentile_2
}
if (!max || max < obj[key].percentile_98) {
max = obj[key].percentile_98
}
})
return [min, max];
}
/**创建样式
* @param {*} feature
* @param {*} resolution
* @param {*} style
* @returns
*/
export function crtStyle ({
resolution = 300,
style = null,
feature
} = {}) {
var iconSize = 300 / resolution;
var featureStyle = null;
switch (style.type) {
// 几何控方未选择样式
case 'unSelected':
featureStyle = new Style({
stroke: new Stroke({
color: '#54FF9F',
lineDash: [0],
width: 2
}),
fill: new Fill({
color: 'rgb(158,197,255,0.2)'
}),
image: new Circle({
radius: 6,
fill: new Fill({
color: 'blue'
}),
stroke: new Stroke({
color: '#ffffff',
width: 1.5
})
}),
text: new Text({ // 文本样式
text: '10',
offsetX: 0 / resolution,
offsetY: 0 / resolution,
textAlign: 'start',
textBaseline: 'bottom',
font: iconSize + 'px Calibri,sans-serif',
fill: new Fill({
color: '#000'
}),
stroke: new Stroke({
color: '#fff',
width: 3
})
}),
geometry: function (feature) {
var center = feature.getGeometry().getCoordinates();
const top = [center[0], center[1] + 300];
const bottom = [center[0], center[1] - 300];
const left = [center[0] - 300, center[1]];
const right = [center[0] + 300, center[1]];
const geo = [
[top, bottom],
[left, right]
];
return new MultiLineString(geo);
}
});
break;
// 几何控方选择样式
case 'Selected':
featureStyle = [new Style({
stroke: new Stroke({
color: '#54FF9F',
lineDash: [0],
width: 2
}),
text: new Text({ // 文本样式
text: '10',
offsetX: 0 / resolution,
offsetY: 0 / resolution,
textAlign: 'start',
textBaseline: 'bottom',
font: iconSize + 'px Calibri,sans-serif',
fill: new Fill({
color: '#000'
}),
stroke: new Stroke({
color: '#fff',
width: 3
})
}),
geometry: function (feature) {
var center = feature.getGeometry().getCoordinates();
const top = [center[0], center[1] + 300];
const bottom = [center[0], center[1] - 300];
const left = [center[0] - 300, center[1]];
const right = [center[0] + 300, center[1]];
return new MultiLineString([
[top, bottom],
[left, right]
]);
}
}),
new Style({
stroke: new Stroke({
color: '#54FF9F',
lineDash: [10, 5],
width: 2
}),
geometry: function (feature) {
var center = feature.getGeometry().getCoordinates();
const leftTop = [center[0] - 350, center[1] + 350];
const leftBottom = [center[0] - 350, center[1] - 350];
const rightBottom = [center[0] + 350, center[1] - 350];
const rightTop = [center[0] + 350, center[1] + 350];
return new Polygon([
[
leftTop, leftBottom, rightBottom, rightTop
]
]);
}
})
];
break;
//绘制样式
case 'draw':
featureStyle = new Style({
stroke: new Stroke({
color: '#F25521',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: 'rgb(158,197,255,0.2)'
}),
image: new Circle({
radius: 6,
fill: new Fill({
color: 'blue'
}),
stroke: new Stroke({
color: '#ffffff',
width: 1.5
})
})
});
break;
// 查询结果样式
case 'result':
featureStyle = new Style({
stroke: new Stroke({
color: 'blue',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: 'rgb(158,197,255,0)'
}),
image: new Circle({
radius: 6,
fill: new Fill({
color: 'blue'
}),
stroke: new Stroke({
color: '#ffffff',
width: 1.5
})
}),
text: new Text({ // 文本样式
text: feature ? feature.get('name') : '',
offsetX: 0 / resolution,
offsetY: 0 / resolution,
textAlign: 'center',
font: 'bold 14px 宋体',
fill: new Fill({
color: 'black'
}),
backgroundFill: new Fill({
color: "#FDFDFD"
}),
placement: "point",
overflow: true //超出面的部分不显示
}),
});
break;
// 激活样式
case 'active':
featureStyle = new Style({
fill: new Fill({
color: '#F3B59D'
}),
});
break;
//覆盖图层样式
case 'coverage':
featureStyle = new Style({
stroke: new Stroke({
color: '#E6E6E6',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: '#e6e6e6b0'
})
});
break;
//红色样式
case 'red':
featureStyle = new Style({
stroke: new Stroke({
color: 'red',
lineDash: [0],
width: 0.9
})
});
break;
//通用样式
case 'normal':
featureStyle = new Style({
stroke: new Stroke({
color: 'blue',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: 'rgb(158,197,255,0)'
}),
});
break;
//高亮样式
case 'highligh':
featureStyle = new Style({
stroke: new Stroke({
color: '#43FF12',
lineDash: [0],
width: 0.9
})
});
break;
case 'GF1':
featureStyle = new Style({
stroke: new Stroke({
color: '#0000FF',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: 'rgb(158,197,255,0)'
}),
});
break;
case 'GF6':
featureStyle = new Style({
stroke: new Stroke({
color: '#FFFF00',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: 'rgb(158,197,255,0)'
}),
});
break;
case 'Sentinel-2':
featureStyle = new Style({
stroke: new Stroke({
color: '#F24F4E',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: 'rgb(158,197,255,0)'
}),
});
break;
case 'LandSat 8':
featureStyle = new Style({
stroke: new Stroke({
color: '#00FFC6',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: 'rgb(158,197,255,0)'
}),
});
break;
case 'MODIS':
featureStyle = new Style({
stroke: new Stroke({
color: '#F59B22',
lineDash: [0],
width: 0.9
}),
fill: new Fill({
color: 'rgb(158,197,255,0)'
}),
});
break;
default:
break;
}
return featureStyle;
}
/**创建地图
* @param target {string} dom容器id
* @param centerPoint {Array} 中心点坐标
* @param dataCrs {Array} 数据坐标
* @param sysCrs {Array} 系统坐标
* @param zoom {Number} 层级
* @returns {Map}
*/
export function crtMap ({
target,
cent
OpenLayers地图组件
需积分: 0 32 浏览量
更新于2024-02-21
收藏 8KB RAR 举报
OpenLayers是一个强大的JavaScript库,专用于在Web上创建交互式地图。它支持多种地图服务,如WMS、WMTS、TMS等,并且能够处理各种地理数据格式,包括GeoJSON、KML和Shapefile。在本文中,我们将深入探讨如何使用OpenLayers地图组件以及与Vue框架的结合。
`ol-map.js`可能包含自定义的地图组件实现,它基于OpenLayers的核心功能来提供更简洁的API。这个文件可能封装了地图的基本操作,如初始化地图、设置地图视图、添加图层等功能。例如,你可以创建一个地图实例并指定它的容器元素、中心坐标、分辨率和投影:
```javascript
import OlMap from 'ol/Map';
import View from 'ol/View';
const map = new OlMap({
target: 'map-container',
view: new View({
center: [0, 0],
zoom: 2,
projection: 'EPSG:4326'
})
});
```
接下来,`ol-api.js`可能包含了对OpenLayers API的进一步封装,特别是针对图层创建的函数。OpenLayers支持多种图层类型,如瓦片图层(TileLayer)、图像图层(ImageLayer)、矢量图层(VectorLayer)等。每个图层类型都有其特定用途,例如:
- **瓦片图层**:适合加载预分割好的地图瓦片,如来自WMS服务的数据。
- **图像图层**:用于加载单个大图,例如卫星图像或航拍照片。
- **矢量图层**:用于显示动态生成的矢量数据,如点、线和多边形。
在Vue项目中,我们可以创建一个Vue组件,将这些图层作为props传递,或者通过计算属性动态地添加和删除图层:
```javascript
import { TileLayer, VectorLayer } from 'ol/layer';
import { OSM, Vector as VectorSource } from 'ol/source';
export default {
components: {},
props: {
tileLayerUrl: String,
vectorData: Object
},
data() {
return {
map: null
};
},
mounted() {
this.createMap();
this.addLayers();
},
methods: {
createMap() {
// 创建地图实例和视图
},
addLayers() {
const tileLayer = new TileLayer({
source: new OSM()
});
const vectorLayer = new VectorLayer({
source: new VectorSource({
features: this.vectorData.features
})
});
this.map.addLayers([tileLayer, vectorLayer]);
}
}
};
```
`ol-map.vue`可能是一个Vue组件,它使用前面提到的`ol-map.js`和`ol-api.js`中的功能来构建一个交互式的地图界面。在这个组件中,你可能会定义一些自定义事件,比如点击图层触发某些操作,或者通过watcher监听数据变化动态更新图层内容。
OpenLayers地图组件结合Vue框架,可以创建出用户友好的Web地图应用。通过封装OpenLayers API,我们可以简化开发过程,提高代码可维护性,并利用Vue的强大功能实现地图的动态交互。`ol-map.js`、`ol-api.js`和`ol-map.vue`分别承担了封装基础功能、扩展API和构建Vue组件的角色,共同构建了一个功能完善的地图应用。
鲤鱼跳龙门的鱼
- 粉丝: 29
- 资源: 4
最新资源
- 基于Node.js和WebSocket的音频数据流分析音乐节奏展示设计源码
- 基于Surface框架的CURD和后台页面快速搭建设计源码
- 基于Snowflake算法的分布式唯一ID生成器UidGenerator在SpringBoot中的整合与应用设计源码
- 四轴直交机械手工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- 基于Java语言的RabbitMQ精品课程设计源码
- 四合一测试设备(含bom)sw17可编辑工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- 基于SSM框架和JavaScript的教材管理系统设计源码
- 基于JqueryMobile框架的kLink通讯录应用设计源码
- 基于2024暑假鸿蒙应用师资班培训的TeachObject20240715_01设计源码
- 卧式气动膏体灌装机工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip
- 基于Vue的JavaScript光雨电子书后台源码
- 基于山东大学经验的转专业学生攻略设计源码
- 基于51单片机的蓝牙循迹小车设计源码
- Teaching Small Language Models to Reason 小模型如何在大模型中生效
- 基于Html和Ruby语言的test项目设计源码
- 线材激光焊接裁断机工程图机械结构设计图纸和其它技术资料和技术方案非常好100%好用.zip