基于mapbox-gl 开发类似于高德地图的经纬度拾取器
2021/6/6 18:52:39
本文主要是介绍基于mapbox-gl 开发类似于高德地图的经纬度拾取器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.index.html页面
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>坐标拾取器</title> <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" /> </head> <body> <div id="map"></div> <div id="geocoder" class="geocoder"></div> <div id="myPageTop" style="display: block; width: 100%; height: 120px; background: #797373;"> <table id="myLngLat" style="display: block; position: absolute; margin-left: 900px;; top: 10px ;"> <tbody > <tr> <td > <label id="copyLngLatTips" style="color :#f55159;font-size: 16px; ">点击地图,拾取经纬度</label> </td> </tr> <tr> <td> <input type="text" id="txtCoordinate" style="font-size: 24px; width:500px; height: 60px;" readonly> <button type="button" id="copyLngLat" style="font-size: 20px; height: 60px; width: 100px; margin-left: 20px; background-color: #5068f0; color: #fdfdfd; border-width: 0px ;" >复制</button> </td> </tr> </tbody> </table> </div> <!--右下角地图样式切换--> <div id="style-switcher"></div> <!--左下鼠标经纬度信息--> <pre id="mouseCoordinates"></pre> <!--左下角可移动marker信息--> <pre id="markerCoordinates" class="markerCoordinates"></pre> <!--左下角draw的信息--> <pre id="drawCalculated" class="drawCalculated"> <div id="calculated-area"></div> </pre> </body> </html>
2.index.js
import $ from "jquery"; import { basic,basic2,dark,liberty,liberty3d, asia, raster_asia, raster_basic, raster_basic2,raster_liberty, gzimg,gdimg,ygaimg } from './styles.js'; import mapboxgl from 'mapbox-gl'; import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder'; import { esGeocoder } from './myGeocoder.js'; import * as MapboxFPS from './MapboxFPS.min.js'; import { MapboxStyleSwitcherControl } from "mapbox-gl-style-switcher"; import RulerControl from 'mapbox-gl-controls/lib/ruler'; import * as turf from '@turf/turf'; import * as d3 from 'd3'; import 'mapbox-gl/dist/mapbox-gl.css'; import '@mapbox/mapbox-gl-geocoder/dist/mapbox-gl-geocoder.css'; // import '../../node_modules/bootstrap/dist/css/bootstrap.min.css'; // import '../../node_modules/bootstrap/dist/js/bootstrap.min.js'; import '../css/myTheme.css'; var isSupported = require('@mapbox/mapbox-gl-supported')(); mapboxgl.accessToken = 'pk.eyJQ.mMpV7HEFSLA'; if (isSupported){ var map = new mapboxgl.Map({ container: 'map', style: basic, center: [113.354, 23.3478], // starting position [lng, lat] zoom: 9, maxZoom:22, antialias:true, //抗锯齿,消耗性能 keyboard:false, // 关闭键盘快捷键 crossSourceCollisions:true, //是否进行跨图层符号的碰撞检测。 hash:true, //显示url的锚 attributionControl:true, localFontFamily: true // 让中文字体里面的数字和中文对齐 V2.1.1增加的选项 }); } else { alert("你的浏览器不支持webGL!"); console.log("你的浏览器不支持webGL!"); }; // FPS控件 帧率监控控件 var fpsControl = new MapboxFPS.FPSControl(); map.addControl(fpsControl,'top-right'); // 添加相关的地图控件 map.addControl(new mapboxgl.FullscreenControl(),'top-right'); map.addControl(new mapboxgl.NavigationControl()); const scale = new mapboxgl.ScaleControl({ maxWidth: 80, unit: 'imperial' }); map.addControl(scale); scale.setUnit('metric'); map.addControl(new mapboxgl.AttributionControl({ customAttribution:'@2021 ' })); // geocoder const geocoder = new MapboxGeocoder( { accessToken: mapboxgl.accessToken , minLength:2, limit:12, types:'address', zoom:19, //localGeocoderOnly:true, localGeocoder: esGeocoder, //externalGeocoder: esGeocoder, collapsed:false, enableEventLogging:false, placeholder:'输入关键字 or 经纬度 如 113.258 23.456', mapboxgl: mapboxgl } ); // geocoder.addTo('#geocoder'); // map.addControl(geocoder,'top-left'); // 坐标拾取器专用 document.getElementById('geocoder').appendChild(geocoder.onAdd(map)); // 显示鼠标移动的经纬度 map.on('mousemove', function(e) { document.getElementById('mouseCoordinates').innerHTML = // e.point is the x, y coordinates of the mousemove event relative // JSON.stringify(data) 是将对象转换为JSON字符串,JSON.parse()是把JSON字符串转换一个对象。 JSON.stringify(e.point) + '<br />' + // e.lngLat is the longitude, latitude geographical position of the event JSON.stringify(e.lngLat.wrap()); }); var marker = new mapboxgl.Marker({}).setLngLat([0,0]).addTo(map); map.on('click',function(e){ console.log('click event has occured at ' + e.lngLat); marker.setLngLat(e.lngLat); let x = e.lngLat.lng; let y = e.lngLat.lat; document.getElementById('txtCoordinate').value = x + ','+y ; document.getElementById('copyLngLatTips').innerHTML = '经纬度获取结果:'; document.getElementById('copyLngLatTips').style.color ='#3710c5'; }); $('#copyLngLat').click(function(){ var ccc = document.getElementById('txtCoordinate').select(); document.execCommand("COPY"); document.getElementById('copyLngLatTips').innerHTML = '经纬度复制成功!'; document.getElementById('copyLngLatTips').style.color ='#58ec65'; }) // When a click event occurs on a feature in the places layer, open a popup at the // location of the feature, with description HTML from its properties. map.on('click', 'mlp_circle', function(e) { let coordinates = e.features[0].geometry.coordinates.slice(); let description = '<h1 style="text-align: center">'+'<strong>'+'详情'+'</strong>'+'</h1>' +'<br/>' +'<h2>'+'<strong>'+'全称:'+'</strong>'+e.features[0].properties.DZQC +'</h2>' +'<h2>'+'<strong>'+'代码:'+'</strong>' +'<strong>'+e.features[0].properties.DZDM+'</strong>'+'</h2>'+'<br/>'; while (Math.abs(e.lngLat.lng - coordinates[0]) > 180) { coordinates[0] += e.lngLat.lng > coordinates[0] ? 360 : -360; } new mapboxgl.Popup({maxWidth:'900px'}) .setLngLat(coordinates) .setHTML(description) .addTo(map); }); // Change the cursor to a pointer when the mouse is over the places layer. map.on('mouseenter', 'mlp_circle', function() { map.getCanvas().style.cursor = 'pointer'; }); // Change it back to a pointer when it leaves. map.on('mouseleave', 'mlp_circle', function() { map.getCanvas().style.cursor = ''; });
3.css样式
body { margin: 0; padding: 0; } #header {position: absolute;top: 0; width: 100%; height: 0px; background: #666699 } #map { position: absolute; top: 0px; bottom: 0; width: 100%; } /*** 坐标拾取器专用 ***/ .geocoder { position: absolute; z-index: 1 ; width: 30%; margin-left: 30px; top: 40px; } .mapboxgl-ctrl-geocoder { min-width: 100%; } #map { margin-top: 120px; }
这篇关于基于mapbox-gl 开发类似于高德地图的经纬度拾取器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南