热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

百度地图开发:根据指定手绘图纸照片行政区划自定义绘制对应区域边界生成geoJOSN的解决方案

项目需求指定某区域(非省市区县乡镇标准行政区划),做功能边界分区,实现Echarts地理坐标数据可视化展示。提供信息项

项目需求

指定某区域(非省市区县乡镇标准行政区划),做功能边界分区,实现Echarts地理坐标数据可视化展示。

提供信息在这里插入图片描述


项目分析


  • 要在Echarts上实现地理坐标可视化,必须使用geoJSON格式文件;
  • 项目只能提供手绘图纸,需要将手绘图纸转换为可以识别的经纬度坐标信息;
  • 如何将图纸绑定在百度地图上,使图纸和百度地图区域相重合,按照提供的区域边界,拾取对应的经纬度坐标;
  • 将拾取的经纬度坐标做换为geoJSON;
  • 引入Echarts,进行开发;

操作步骤

为简化流程和项目信息外漏,以随意某地作为案例实施步骤演示。

固定地图

在百度地图上找到对应的区域,并设置对应的地图显示级别,map.centerAndZoom(new BMap.Point(112.761393, 28.101516), 18)方便后面图片和区域相重合;截图固定地图级别的图片:map1.jpg

在这里插入图片描述

图片处理

在PSD中打开map1.jpg文件,将功能区划在PSD中进行处理,扣除多余的部分,只要行政划分的区域,且图片的大小依据步骤1中截图的大小,一一对应。
在这里插入图片描述
3.隐藏地图,只留行政区划部分区域,保存新的文件为:newmap.png
在这里插入图片描述

代码开发

使用的技能:

  1. 百度地图API的引入;
  2. 百度地图绘制多边形并获取所有点的坐标;
  3. HTML&CSS相对定位和绝对定位,实现图片和地图的重合;
  4. 将拾取的坐标转化为标准的geoJOSN;

引入百度地图api

<script type&#61;"text/Javascript"src&#61;"http://api.map.baidu.com/api?v&#61;3.0&ak&#61;你的AK"></script>

创建容器

<div id&#61;"main"><div id&#61;"img"><img src&#61;"images/lll.png" alt&#61;"">div><div id&#61;"container">div>
div>
<div id&#61;"text"><input id&#61;"startBtn" type&#61;"button" onclick&#61;"startTool();" value&#61;"开启取点"/><input type&#61;"button" onclick&#61;"map.clearOverlays();document.getElementById(&#39;info&#39;).innerHTML &#61; &#39;&#39;;points&#61;[];"value&#61;"清除"/>
div><div id&#61;"info">坐标&#xff1a;div>

CSS样式表

body, html {width: 100%;height: 100%;margin: 0;font-family: "微软雅黑";}#main {position: relative;}#img {position: absolute;opacity: 0.5;left: 500px;top: 200px;z-index: -999;}#container {width: 100%;height: 80vh;border: 1px solid gray;position: absolute;opacity: 0.7;z-index: 9999;}#text {position: absolute;z-index: 9999;left: 50px;bottom: 120px;}#info {position: absolute;z-index: 999999;left: 50px;bottom: 80px;}

实现的布局如图&#xff1a;
在这里插入图片描述

  1. 图片置于最底层&#xff0c;方便按照边界拾取经纬度&#xff1b;
  2. 地图设置一定的透明度&#xff0c;方便开发图片&#xff1b;
  3. 移动地图和图片相重合&#xff0c;绘制多边形并获取所有点的坐标&#xff1b;

绘制多边形并获取所有点的坐标

var map &#61; new BMap.Map("container", {enableMapClick: false});map.centerAndZoom(new BMap.Point(112.761393, 28.101516), 18);map.enableScrollWheelZoom();/*设置版权控件位置 -Begin*/var cr &#61; new BMap.CopyrightControl({anchor: BMAP_ANCHOR_TOP_RIGHT});map.addControl(cr); //添加版权控件var bs &#61; map.getBounds(); //返回地图可视区域cr.addCopyright({id: 1,content: "

Copyright © 漏刻有时百度地图API开发
",bounds: bs});/*设置版权控件位置 -End*/var key &#61; 1; //开关var newpoint; //一个经纬度var points &#61; []; //数组&#xff0c;放经纬度信息var polyline &#61; new BMap.Polyline(); //折线覆盖物function startTool() { //开关函数if (key &#61;&#61; 1) {document.getElementById("startBtn").style.background &#61; "green";document.getElementById("startBtn").style.color &#61; "white";document.getElementById("startBtn").value &#61; "开启状态";key &#61; 0;}else {document.getElementById("startBtn").style.background &#61; "red";document.getElementById("startBtn").value &#61; "关闭状态";key &#61; 1;}}//单击地图&#xff0c;形成折线覆盖物map.addEventListener("click", function (e) {newpoint &#61; new BMap.Point(e.point.lng, e.point.lat);if (key &#61;&#61; 0) {// if(points[points.length].lng&#61;&#61;points[points.length-1].lng){alert(111);}points.push(newpoint); //将新增的点放到数组中polyline.setPath(points); //设置折线的点数组map.addOverlay(polyline); //将折线添加到地图上/*02.数据集格式*/document.getElementById("info").innerHTML &#43;&#61; "[" &#43; e.point.lng &#43; "," &#43; e.point.lat &#43; "],";}});//双击地图&#xff0c;形成多边形覆盖物map.addEventListener("dblclick", function (e) {if (key &#61;&#61; 0) {map.disableDoubleClickZoom(); //关闭双击放大var polygon &#61; new BMap.Polygon(points);map.addOverlay(polygon); //将折线添加到地图上}});

在这里插入图片描述

[112.7584914732037,28.10156777873837],[112.759075371785,28.1008667598055],[112.76014435534152,28.10005420934206],[112.76070130475752,28.10014183763234],[112.76055757587598,28.10128099882524],[112.76028808422306,28.101519982139973],[112.7585094393139,28.101599643125347]

生成geoJSON

{"type": "FeatureCollection","features": [{"type": "Feature","properties": {},"geometry": {"type": "LineString","coordinates": [[112.7584914732037,28.10156777873837],[112.759075371785,28.1008667598055],[112.76014435534152,28.10005420934206],[112.76070130475752,28.10014183763234],[112.76055757587598,28.10128099882524],[112.76028808422306,28.101519982139973],[112.7585094393139,28.101599643125347]]}}]
}

后续总结


  1. 第一种尝试&#xff0c;是使用百度标注&#xff0c;将图片作为一个maker使用&#xff0c;好在maker可以自由移动&#xff0c;方便对齐区域&#xff1b;而实际上&#xff0c;将图片引入百度地图API后&#xff0c;是无法缩放的&#xff0c;实现不了图片和地图的重合&#xff1b;
  2. 第二种尝试&#xff0c;使用GroundOverlay&#xff0c;地面图层的叠加&#xff0c;难点在于无法确定可视范围的西南角SW和东北角NE&#xff0c;就无法精准位置&#xff1b;同时该功能无法调整图片大小&#xff0c;无法移动和缩放图片&#xff0c;也实现不了图片和地图的重合&#xff1b;
  3. 返璞归真&#xff0c;利用CSS层叠的概念&#xff0c;实现图片和地图自由移动的特性&#xff0c;实现图片和地图的重合。
  4. 完成项目&#xff0c;希望有时间将该功能整理成一个插件&#xff0c;以便解决乡镇边界&#xff0c;村级边界、经济开发区边界等等自定义项目的开发。

LOCKDATAV DONE&#xff01;


推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • 在2022年,随着信息化时代的发展,手机市场上出现了越来越多的机型选择。如何挑选一部适合自己的手机成为了许多人的困扰。本文提供了一些配置及性价比较高的手机推荐,并总结了选择手机时需要考虑的因素,如性能、屏幕素质、拍照水平、充电续航、颜值质感等。不同人的需求不同,因此在预算范围内找到适合自己的手机才是最重要的。通过本文的指南和技巧,希望能够帮助读者节省选购手机的时间。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
author-avatar
海啸1203_902
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有