前端如何玩转webgis开发酷炫界面实战项目经验指南
免安装打开即用
支持地图种类繁多:几乎包含所有主流在线地图,包括不仅限于谷歌、百度、高德、四维、微软、诺基亚、天地图、腾讯、ArcGIS、雅虎等地图,每种地图各有千秋。
下载离线瓦片地图数据源(可以根据自己需求下载地图级别数据源,等级越大数据量越大,下载时间越久)
全能电子地图下载器的操作方法:
准备工作搭建部署开发Vue 脚手架搭建框架
1) 打开命令行窗口B2B电子商务平台,输入 node -v 查看,出现版本号说明已安装成功,如下图:
2) 使用以下命令安装Vue
npm install -g @vue/cli
// 安装指定版本
npm install -g @vue/cli@4.5.13
// OR
yarn global add @vue/cli
3)安装完成,检查vue版本前端如何玩转webgis开发酷炫界面实战项目经验指南,如下图:
vue -V
4) vue-cli4 创建项目及运行
vue create mapdemo
cd mapDemo
npm run serve
在浏览器地址栏输入::8080/
引入开源的类库包
npm install ol
功能设计和代码实现
按照上面的步骤已完成脚手架构建,并把需要的 依赖库引入和安装配置好,准备上刺刀开干。
先来个简单的在线地图实例(参照官方DEMO)
在 main.js 文件中挂载google地图 输入经纬度,代码如下:
// 将全局的ol对象挂载到Vue的原型对象上
// 在别的组件中使用 this.$ol
Vue.prototype.$ol = window.ol
在 文件夹新建组件demo1.vue文件,代码如下:
<div class="page-map">
<div id="map" class="map">div>
div>
</template>
cript>
export default {
name: "Demo1",
data() {
return {
map: null
}
},
mounted() {
this.initMap()
},
methods: {
// 初始化地图
initMap() {
this.map = new this.$ol.Map({
target: 'map',
layers: [
new this.$ol.layer.Tile({
source: new this.$ol.source.OSM()
})
// new this.$ol.layer.Tile({
// source: new this.$ol.source.XYZ({
// // 在线加载 Mapbox 卫星影像底图
// url: 'https://api.mapbox.com/v4/mapbox.satellite/{z}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoid2FuZ2hhaGExIiwiYSI6ImNqeHUycXF5ZDEweDQzYnBiOTcwZGoxMHAifQ.eCGuiA6erHJ7ew-Fkc7dRA'
// })
// }),
// new this.$ol.layer.Tile({
// source: new this.$ol.source.XYZ({
// // 在线加载谷歌卫星底图(需翻墙)
// url: 'http://mt2.google.com/vt?lyrs=s@189&gl=cn&x={x}&y={y}&z={z}'
// })
// })
],
view: new this.$ol.View({
center: this.$ol.proj.fromLonLat([121.3431, 25.067]),
zoom: 4
})
});
}
}
};
script>
<style scoped>
.map {
width: 100%;
height: 100vh;
}
style>
效果图如下所示:
离线瓦片地图实例
在utils文件夹中新建.js文件,JS模块化代码实现如下:
// 创建initMap方法,初始化地图
initMap(targetName) {
// let googleMapLayer = []
// googleMapLayer = [
// this.layers.googleScreenAgeMapLayer
// ]
// 实例化Map对象,用于加载地图
this.map = new ol.Map({
// 地图容器div的id
target: targetName,
layers: [
new ol.layer.Tile({
source: new ol.source.OSM()
})
],
view: new ol.View({
center: ol.proj.fromLonLat([121.3431, 25.067]),
zoom: 8,
minZoom: 4,
maxZoom: 12,
extent: this.extents.World
}),
// 地图控件
controls: ol.control.defaults({
attribution: false,
zoom: false,
rotate: false
}).extend([])
})
}
常用实例详解
// 鼠标响应手形变化
this.map.on('pointermove', (e) => {
let pixel = this.map.getEventPixel(e.originalEvent)
if (this.map.hasFeatureAtPixel(pixel)) {
this.map.getTargetElement().style.cursor = 'pointer'
} else {
this.map.getTargetElement().style.cursor = ''
}
})
// 点击地图获取经纬度,或点击要素
this.map.on('click', (e) => {
console.log(e.pixel)
let feature = this.map.forEachFeatureAtPixel(e.pixel, (ft) => {
// 鼠标点击某一个要素后,获取这个要素,执行业务逻辑
return ft
})
console.log(feature);
if (feature) {
// this.addUnitDetailPopUp(feature.get('extraData'))
}
})
// 设置视角(中心点)
setView(lngLat) {
this.map.getView().animate({
center: ol.proj.fromLonLat(lngLat)
})
}
// 设置地图缩放
setZoom(zoomLevel) {
this.map.getView().animate({
zoom: zoomLevel
});
}
// 点击地图获取经纬度
this.map.on('click', (e) => {
let lngLat = ol.proj.toLonLat(e.coordinate), // 点击获取经纬度
feature = this.map.forEachFeatureAtPixel(e.pixel, (ft) => {
// forEachFeatureAtPixel()方法获取选中要素
return ft;
})
})
// 地图上显示要素标记点
addFeatureMarker(arr) {
let features = [];
arr.forEach((e) => {
let feature = new ol.Feature({
geometry: new ol.geom.Point(ol.proj.fromLonLat([e.longitudeX, e.latitudeY])),
})
feature.setStyle(new ol.style.Style({
image: new ol.style.Icon({
src: e.imgPath,
anchorXUnits: 'fraction',
anchorYUnits: 'pixels',
anchorOrigin: 'top-right',
offsetOrigin: 'top-right',
anchor: [0.5, 60]
}),
text: new ol.style.Text({
text: e.name,
textAlign: 'center',
textbaseline: 'middle',
font: "normal 13px sans-serif",
padding: [3, 8, 3, 8],
backgroundFill: new ol.style.Fill({
color: 'rgba(218, 77, 81, .2)',
}),
fill: new ol.style.Fill({
color: '#fff',
})
}),
}))
feature.set("extraData", e);
features.push(feature);
})
this.featureSource.addFeatures(features);
}
// 显示气泡弹框PopUp
addDialogPopUp(item) {
let lngLat = [item.longitudeX, item.latitudeY];
this.removeOverlayPopUp();
this.dialogOverlay = new ol.Overlay({
element: this.createDialogDom(item),
position: ol.proj.fromLonLat(lngLat),
autoPan: true,
positioning: 'bottom-left',
offset: [50, -50]
})
this.map.addOverlay(this.dialogOverlay);
}
setCircle(location, size) {
let circle = new ol.geom.Circle(ol.proj.transform(location, 'EPSG:4326', 'EPSG:3857'), size);
this.circleFeature = new ol.Feature(circle);
this.circleFeature.setStyle(
new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255, 255, 255, .2)'
}),
stroke: new ol.style.Stroke({
color: '#ffcc33',
width: 1
})
})
);
this.circleSource.addFeature(this.circleFeature);
}
// 设置线条带箭头
setLineString(location) {
let line = new ol.geom.LineString([ol.proj.fromLonLat(this.posCenter), location]);
this.lineFeature = new ol.Feature(line);
let geometry = this.lineFeature.getGeometry(),
sta = geometry.flatCoordinates.slice(-4),
dx = sta[2] - sta[0],
dy = sta[3] - sta[1],
rotation = Math.atan2(dy, dx), // 获取线段的角度(弧度)
arrowLonLat = [sta[2], sta[3]];
this.lineFeature.setStyle([
new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255, 255, 255, .2)'
}),
stroke: new ol.style.Stroke({
color: '#ffcc33',
lineDash: [1, 2, 3, 4, 5, 6],
width: 3
})
}),
new ol.style.Style({
geometry: new ol.geom.Point(arrowLonLat),
image: new ol.style.Icon({
src: require('../assets/arrow.png'),
anchor: [0.75, 0.5], // 图标锚点
rotateWithView: true, // 与地图视图一起旋转
rotation: -rotation // 因为角度以顺时针旋转为正值,所以前面添加负号
})
})
]);
this.lineSource.addFeature(this.lineFeature);
}
写在最后
这次分享的内容写得比较仓促google地图 输入经纬度,涉及知识面不是很广,毕竟小编词库有限。看到这里相信小伙伴们,对WebGIS开发都有所了解,赶快动手操作一波吧。
适合人群如下:
【本文来源于互联网转载,如侵犯您的权益或不适传播,请邮件通知我们删除】