leaflet 给定坐标点,判断是否在某区域范围内 地理围栏算法

index.html 

<!DOCTYPE html>
<html>

	<head>
		<title>Leaflet 快速开始指南示例</title>
		<meta charset="utf-8" />

		<link rel="stylesheet" href="css/leaflet.css" />
	</head>

	<body>
		<div id="map" style="width: 1024px; height: 768px"></div>

		<script src="js/leaflet.js"></script>
		<script type="text/javascript" src="js/jquery-2.0.3.min.js"></script>
		<script type="text/javascript" src="js/isPointInPolygon.js"></script>
		<script>
			var map = L.map('map').setView([24, 110], 5);
			L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token=pk.eyJ1IjoibWFwYm94IiwiYSI6IjZjNmRjNzk3ZmE2MTcwOTEwMGY0MzU3YjUzOWFmNWZhIn0.Y8bhBaUMqFiPrDRW9hieoQ', {
				maxZoom: 18,
				attribution: 'Map data &copy; <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, ' +
					'<a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, ' +
					'Imagery © <a href="http://mapbox.com">Mapbox</a>',
				id: 'mapbox.streets'
			}).addTo(map);
			L.marker([24, 100]).addTo(map)
				.bindPopup("<b>Hello world!</b><br />我是一个冒泡窗").openPopup();
			L.circle([24, 100], 500, {
				color: 'red',
				fillColor: '#f03',
				fillOpacity: 0.5
			}).addTo(map).bindPopup("我是一个圆");
			L.polygon([{
				lat: 26,
				lng: 101
			}, {
				lat: 24,
				lng: 120
			}, {
				lat: 35,
				lng: 110			
			}]).addTo(map);
			var popup = L.popup();

			function points() {
				var points = [{
				lat: 26,
				lng: 101
			}, {
				lat: 24,
				lng: 120
			}, {
				lat: 35,
				lng: 110
			}]
				return points;
			}

			function onMapClick(e) {
				popup
					.setLatLng(e.latlng)
					.setContent("你刚点击的坐标是 " + e.latlng.toString())
					.openOn(map);
				/*var hh = IsPtInPoly(119.44336,25.20494, points());*/
				var hh = IsPtInPoly(e.latlng.lng,e.latlng.lat, points());
				alert(hh);
			}
			map.on('click', onMapClick);
		</script>
	</body>

</html>

 isPointInPolygon.js

function IsPtInPoly(ALon, ALat, APoints) {
	var iSum = 0,
		iCount;
	var dLon1, dLon2, dLat1, dLat2, dLon;
	if (APoints.length < 3) return false;
	iCount = APoints.length;
	for (var i = 0; i < iCount; i++) {
		if (i == iCount - 1) {
			dLon1 = APoints[i].lng;
			dLat1 = APoints[i].lat;
			dLon2 = APoints[0].lng;
			dLat2 = APoints[0].lat;
		} else {
			dLon1 = APoints[i].lng;
			dLat1 = APoints[i].lat;
			dLon2 = APoints[i + 1].lng;
			dLat2 = APoints[i + 1].lat;
		}
		//以下语句判断A点是否在边的两端点的水平平行线之间,在则可能有交点,开始判断交点是否在左射线上
		if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1))) {
			if (Math.abs(dLat1 - dLat2) > 0) {
				//得到 A点向左射线与边的交点的x坐标:
				dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat)) / (dLat1 - dLat2);
				if (dLon < ALon)
					iSum++;
			}
		}
	}
	if (iSum % 2 != 0)
		return true;
	return false;
}

 

引用中提到了一个名为isPointInPolygon.js的函数,该函数用于判断一个是否在一个多边形内部。函数接受三个参数:ALon是的经度,ALat是的纬度,APoints是多边形的顶坐标数组。函数通过遍历多边形的边来判断与边的关系,如果在边的水平平行线之间且在边的左射线上,那么就可能与该边相交。最后,通过判断与多边形边相交的次数,如果是奇数次则表示在多边形内部,否则表示在多边形外部。 引用提到了一个Leaflet插件leaflet.geofencer,它是一个简单的地理围栏(多边形创建)工具。通过使用该插件,您可以在Leaflet地图上创建多边形围栏,并使用isPointInPolygon.js函数来判断一个是否在该围栏内部。 综上所述,如果您想实现Leaflet围栏算法,您可以使用isPointInPolygon.js函数来判断一个是否在多边形内部,并结合Leaflet地图和leaflet.geofencer插件来创建和管理围栏。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leaflet 给定坐标判断是否在某区域范围地理围栏算法](https://blog.csdn.net/zkcharge/article/details/117168220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [leaflet.geofencer:一个基于 Leaflet 的简单地理围栏(多边形创建)工具](https://download.csdn.net/download/weixin_42117116/19846128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Leaflet中原生方式实现测量面积](https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122358946)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值