2021-09-25

本文介绍了如何在地图上添加自定义标注,特别是在区县级别。通过选择省份、城市和区县,可以显示红色边框的行政区划,并允许用户点击添加标注。实现过程涉及获取区县经纬度、使用city.json文件和百度地图API。提供的源码包括HTML、JavaScript和CSS,可以直接复制使用。此外,还提供了JSON文件和相关资源的下载链接,以便读者自行实践。
摘要由CSDN通过智能技术生成

百度地图实现对区县添加标注

    在实际开发过程中,我们可能会有这样的需求,自定义地图并在地图上自己想要的区域地方添加标注,本文介绍实现过程以及提供源码,复制粘贴即可实现想要的功能。
注意:本文使用百度地图API

1.地图添加标注效果图

![在这里插入图片描述](https://img-blog.csdnimg.cn/63daff45fd1a4293aecd5d26a325d553.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARXJ6ZXJvZXI=,size_20,color_FFFFFF,t_70,g_se,x_16    如上图所示,首先在三个下拉栏框中选择想要标注的区县,最终区县会以红色边线绘出,点击添加标注即可实现在此区域题添加一个标注。

2.实现原理

实现原理比较简单,简单来说就是首先获取到区县的经纬度,然后再在此经纬度上添加标注即可。而经纬度的获取又是通过在city.json文件中获取,添加标注的的功能查看百度地图API即可实现。

3.实现源码

<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
		<style type="text/css">
			body,
			html,
			#allmap {
				width: 100%;
				height: 100%;
				overflow: hidden;
				margin: 0;
				font-family: "微软雅黑";
			}
		</style>
		<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ycTgY5YTSnk5PsqumqZboxtXaKU6Io6K">
		</script>
		<title>添加行政区划</title>
		<script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script>
		<script src="js/distpicker.data.js"></script>
		<script src="js/distpicker.js"></script>
		<script src="js/main.js"></script>
		<link href="http://www.jq22.com/jquery/bootstrap-3.3.4.css" rel="stylesheet">

	</head>
	<body>
		<!--<div>
    <select name="" id="">
        <option value="">广东</option>
        <option value="">湖南</option>
        <option value="">江西</option>
    </select>
    <select name="" id="">
        <option value="">广州</option>
        <option value="">深圳</option>
    </select>
</div>-->
		<form class="form-inline">
			<div id="distpicker5">
				<div class="form-group">
					<label class="sr-only" for="province10">省</label>
					<select class="form-control" id="province10">
						<option value="" data-code="">-- 请选择 --</option>
						<option value="北京市" data-code="110000">北京市</option>
						<option value="天津市" data-code="120000">天津市</option>
						<option value="河北省" data-code="130000">河北省</option>
						<option value="山西省" data-code="140000">山西省</option>
						<option value="内蒙古自治区" data-code="150000">内蒙古自治区</option>
						<option value="辽宁省" data-code="210000">辽宁省</option>
						<option value="吉林省" data-code="220000">吉林省</option>
						<option value="黑龙江省" data-code="230000">黑龙江省</option>
						<option value="上海市" data-code="310000">上海市</option>
						<option value="江苏省" data-code="320000">江苏省</option>
						<option value="浙江省" data-code="330000">浙江省</option>
						<option value="安徽省" data-code="340000">安徽省</option>
						<option value="福建省" data-code="350000">福建省</option>
						<option value="江西省" data-code="360000">江西省</option>
						<option value="山东省" data-code="370000">山东省</option>
						<option value="河南省" data-code="410000">河南省</option>
						<option value="湖北省" data-code="420000">湖北省</option>
						<option value="湖南省" data-code="430000">湖南省</option>
						<option value="广东省" data-code="440000">广东省</option>
						<option value="广西壮族自治区" data-code="450000">广西壮族自治区</option>
						<option value="海南省" data-code="460000">海南省</option>
						<option value="重庆市" data-code="500000">重庆市</option>
						<option value="四川省" data-code="510000">四川省</option>
						<option value="贵州省" data-code="520000">贵州省</option>
						<option value="云南省" data-code="530000">云南省</option>
						<option value="西藏自治区" data-code="540000">西藏自治区</option>
						<option value="陕西省" data-code="610000">陕西省</option>
						<option value="甘肃省" data-code="620000">甘肃省</option>
						<option value="青海省" data-code="630000">青海省</option>
						<option value="宁夏回族自治区" data-code="640000">宁夏回族自治区</option>
						<option value="新疆维吾尔自治区" data-code="650000">新疆维吾尔自治区</option>
						<option value="台湾省" data-code="710000">台湾省</option>
						<option value="香港特别行政区" data-code="810000">香港特别行政区</option>
						<option value="澳门特别行政区" data-code="820000">澳门特别行政区</option>
					</select>
				</div>
				<div class="form-group">
					<label class="sr-only" for="city10">市</label>
					<select class="form-control" id="city10">
						<option value="" data-code="">-- 请选择 --</option>
					</select>
				</div>
				<div class="form-group">
					<label class="sr-only" for="district10">区</label>
					<select class="form-control" id="district10">
						<option value="" data-code="">-- 请选择 --</option>
					</select>
				</div>
				<div class="form-group">
					<!-- <div style="background-color: #fc5632;color: white; width: 60px; height: 30px;">添加标注</div> -->
					<button type="button" style="color: #fc5632;" onclick="getLocation()">添加标注</button>
				</div>
				<!-- <input type="text" id="location"> -->
			</div>

		</form>
		<style>
			.form-inline {
				position: absolute;
				z-index: 9999
			}

			.form-inline .form-group {
				display: inline-block;
			}
		</style>
		<div id="allmap"></div>
	</body>
</html>
<script type="text/javascript">
	//定义要添加标注城市数组
	var allMarkerArr = [];

	var map; //Map实例
	function map_init() {
		// 百度地图API功能
		map = new BMap.Map("allmap");
		//第1步:设置地图中心点,北京市
		//第2步:初始化地图,设置中心点坐标和地图级别。
		map.centerAndZoom(new BMap.Point(104.04124, 30.612882), 10);
		//第3步:启用滚轮放大缩小
		map.enableScrollWheelZoom();
		
	}

	//获取区域并绘制边框
	function getBoundary(getcity) {
		var bdary = new BMap.Boundary();
		bdary.get(getcity, function(rs) { //获取行政区域
			map.clearOverlays(); //清除地图覆盖物
			var count = rs.boundaries.length; //行政区域的点有多少个
			if (count === 0) {
				alert('未能获取当前输入行政区域');
				return;
			}
			var pointArray = [];
			for (var i = 0; i < count; i++) {
				var ply = new BMap.Polygon(rs.boundaries[i], {
					strokeWeight: 2,
					strokeColor: "#ff0000"
				}); //建立多边形覆盖物
				map.addOverlay(ply); //添加覆盖物
				pointArray = pointArray.concat(ply.getPath());
			}
			map.setViewport(pointArray); //调整视野
			addlabel();
		});
	}

	// 添加信息窗口
	function addInfoWindow(marker, poi) {
		//pop弹窗标题
		var title = '<div style="font-weight:bold;color:#CE5521;font-size:14px">' + poi.name + '</div>';
		//pop弹窗信息
		var html = [];
		html.push(
			'<table cellspacing="0" style="table-layout:fixed;width:100%;font:12px arial,simsun,sans-serif"><tbody>');
		html.push('</tbody></table>');
		var infoWindow = new BMap.InfoWindow(html.join(""), {
			title: title,
			width: 200
		});

		var openInfoWinFun = function() {
			marker.openInfoWindow(infoWindow);
		};
		marker.addEventListener("click", openInfoWinFun);
		return openInfoWinFun;
	}



	/*    setTimeout(function(){
	     getBoundary();
	     }, 2000);*/
	$("#province10").change(function() {
		getBoundary($("#province10 option:selected").html())
	})
	$("#city10").change(function() {
		getBoundary($("#province10 option:selected").html() + $("#city10 option:selected").html())
	})
	$("#district10").change(function() {
		getBoundary($("#province10 option:selected").html() + $("#city10 option:selected").html() + $(
			"#district10 option:selected").html())
	})

	//台湾钓鱼岛是中国地
	function addlabel() {
		var pointArray = [
			new BMap.Point(121.716076, 23.703799),
			new BMap.Point(112.121885, 14.570616),
			new BMap.Point(123.776573, 25.695422)
		];
		var optsArray = [{}, {}, {}];
		var labelArray = [];
		var contentArray = [
			"台湾是中国的!",
			"南海是中国的!",
			"钓鱼岛是中国的!"
		];
		for (var i = 0; i < pointArray.length; i++) {
			optsArray[i].position = pointArray[i];
			labelArray[i] = new BMap.Label(contentArray[i], optsArray[i]);
			labelArray[i].setStyle({
				color: "red",
				fontSize: "12px",
				height: "20px",
				lineHeight: "20px",
				fontFamily: "微软雅黑"
			});
			map.addOverlay(labelArray[i]);
		}
	}

	//默认选择
	//addressInit('province', 'city', 'district', '广东', '深圳市', '宝安区');



	//按钮点击事件
	function getLocation() {
		//获取经纬度json
		function getJson() {
			var cityJson;
			$.ajax({
				url: './json/city.json',
				async: false,
				success: function(res) {
					cityJson = res;
				}
			});
			return cityJson;
		}
		
		var cityJson = getJson();
		console.log(cityJson);
		var city = [];
		city.push($('#province10').val());
		city.push($('#city10').val());
		city.push($('#district10').val());
		console.log(city)
		var p = cityJson.p;
		var d = cityJson.d;
		var c = cityJson.c;
		//console.log(p,c,d)
		for (var pKey in p) {
			console.log("1111111")
			if (p[pKey] == city[0]) { //取得对应的省
				var ct = c[pKey]
				console.log(p[pKey])
				console.log(ct)
				for (var cKey in ct) {
					if (ct[cKey] == city[1]) { //取得对应的市
						var dt = d[cKey];
						console.log(cKey)
						console.log(dt)
						for (var dKey in dt) {
							if (dt[dKey].name == city[2]) { //取得对应的区 并且获取经纬度
								console.log(dKey);
								console.log(dt[dKey].lon)
								console.log(dt[dKey].lat)
								$('#location').val(dt[dKey].lon + ',' + dt[dKey].lat)
								//var markerObj=new Object();
								// markerObj.name=city[2];
								// markerObj.lon=dt[dKey].lon;
								// markerObj.lat=dt[dKey].lat
								// console.log("dt(dkey)")
								// console.log(dt[dKey])
								// console.log(markerObj)
								// console.log("dt(dkey)")
								allMarkerArr.push(dt[dKey])
								break;
							}
						}
						break;
					}
				}
				break;
			}
		}
		//第X步: 绘制点
		for (var i = 0; i < allMarkerArr.length; i++) {
			var p0 = allMarkerArr[i].lon;
			var p1 = allMarkerArr[i].lat;
			var maker = addMarker(new window.BMap.Point(p0, p1), i);
			addInfoWindow(maker, allMarkerArr[i], i);
		}
	}

	// 添加标注
	function addMarker(point, index) {
		// var myIcon = new BMap.Icon("http://api.map.baidu.com/img/markers.png",
		// 	new BMap.Size(23, 25), {
		// 		offset: new BMap.Size(10, 25),
		// 		imageOffset: new BMap.Size(0, 0 - index * 25)
		// 	});
		 //var marker = new BMap.Marker(point, {
		// 	icon: myIcon
		// });
		var marker = new BMap.Marker(point);
		map.addOverlay(marker);
		return marker;
	}

	//异步调用百度js
	function map_load() {
		var load = document.createElement("script");
		load.src = "http://api.map.baidu.com/api?v=1.4&callback=map_init";
		document.body.appendChild(load);
	}
	window.onload = map_init;
</script>

4.总结

在实现的过程中需要html文件的父目录下新建json和js两个文件夹,并把city.json添加进json文件夹, distpicker.data、distpicker、jquery-1.12.3.min、main四个js文件放入js文件夹中。

gitee地址:https://gitee.com/ranlanglang/map-add-marks.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用python中的pymsql完成如下:表结构与数据创建 1. 建立 `users` 表和 `orders` 表。 `users` 表有用户ID、用户名、年龄字段,(id,name,age) `orders` 表有订单ID、订单日期、订单金额,用户id字段。(id,order_date,amount,user_id) 2 两表的id作为主键,`orders` 表用户id为users的外键 3 插入数据 `users` (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28); `orders` (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4); 查询语句 1. 查询订单总金额 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 3. 查询订单总数最多的用户的姓名和订单总数。 4. 查询所有不重复的年龄。 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 8. 查询订单总金额最大的用户的姓名和订单总金额。 9. 查询订单总金额最小的用户的姓名和订单总金额。 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。
06-03
这里是使用 Python 的 PyMySQL 完成上述任务的代码: ```python import pymysql # 连接数据库 conn = pymysql.connect(host='localhost', port=3306, user='root', password='123456', database='test') # 创建游标 cur = conn.cursor() # 创建 users 表 cur.execute(''' CREATE TABLE users ( id INT PRIMARY KEY, name VARCHAR(20), age INT ) ''') # 创建 orders 表 cur.execute(''' CREATE TABLE orders ( id INT PRIMARY KEY, order_date DATE, amount INT, user_id INT, FOREIGN KEY (user_id) REFERENCES users(id) ) ''') # 插入数据 users_data = [ (1, '张三', 18), (2, '李四', 20), (3, '王五', 22), (4, '赵六', 25), (5, '钱七', 28) ] orders_data = [ (1, '2021-09-01', 500, 1), (2, '2021-09-02', 1000, 2), (3, '2021-09-03', 600, 3), (4, '2021-09-04', 800, 4), (5, '2021-09-05', 1500, 5), (6, '2021-09-06', 1200, 3), (7, '2021-09-07', 2000, 1), (8, '2021-09-08', 300, 2), (9, '2021-09-09', 700, 5), (10, '2021-09-10', 900, 4) ] for user in users_data: cur.execute('INSERT INTO users VALUES (%s, %s, %s)', user) for order in orders_data: cur.execute('INSERT INTO orders VALUES (%s, %s, %s, %s)', order) # 提交事务 conn.commit() # 查询语句 # 1. 查询订单总金额 cur.execute('SELECT SUM(amount) FROM orders') print(cur.fetchone()[0]) # 2. 查询所有用户的平均年龄,并将结果四舍五入保留两位小数。 cur.execute('SELECT ROUND(AVG(age), 2) FROM users') print(cur.fetchone()[0]) # 3. 查询订单总数最多的用户的姓名和订单总数。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_orders DESC LIMIT 1 ''') print(cur.fetchone()) # 4. 查询所有不重复的年龄。 cur.execute('SELECT DISTINCT age FROM users') print([row[0] for row in cur.fetchall()]) # 5. 查询订单日期在2021年9月1日至9月4日之间的订单总金额。 cur.execute('SELECT SUM(amount) FROM orders WHERE order_date BETWEEN "2021-09-01" AND "2021-09-04"') print(cur.fetchone()[0]) # 6. 查询年龄不大于25岁的用户的订单数量,并按照降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders FROM users JOIN orders ON users.id = orders.user_id WHERE age <= 25 GROUP BY users.id ORDER BY total_orders DESC ''') print(cur.fetchall()) # 7. 查询订单总金额排名前3的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 3 ''') print(cur.fetchall()) # 8. 查询订单总金额最大的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC LIMIT 1 ''') print(cur.fetchone()) # 9. 查询订单总金额最小的用户的姓名和订单总金额。 cur.execute(''' SELECT users.name, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount ASC LIMIT 1 ''') print(cur.fetchone()) # 10. 查询所有名字中含有“李”的用户,按照名字升序排序。 cur.execute('SELECT * FROM users WHERE name LIKE "%李%" ORDER BY name ASC') print(cur.fetchall()) # 11. 查询所有年龄大于20岁的用户,按照年龄降序排序,并只显示前5条记录。 cur.execute('SELECT * FROM users WHERE age > 20 ORDER BY age DESC LIMIT 5') print(cur.fetchall()) # 12. 查询每个用户的订单数量和订单总金额,并按照总金额降序排序。 cur.execute(''' SELECT users.name, COUNT(*) AS total_orders, SUM(amount) AS total_amount FROM users JOIN orders ON users.id = orders.user_id GROUP BY users.id ORDER BY total_amount DESC ''') print(cur.fetchall()) # 关闭游标和连接 cur.close() conn.close() ``` 注意:在运行代码之前,需要先安装 PyMySQL 模块,可以使用以下命令进行安装: ``` pip install pymysql ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值