确定一个点是否位于传单多边形内
Determine if a point reside inside a leaflet polygon
假设我在下面的演示中使用传单绘制多边形:
http://leaflet.github.io/Leaflet.draw/
我的问题是如何确定给定点是否位于多边形内。
使用光线投射算法检查点(标记)是否位于多边形内部:
function isMarkerInsidePolygon(marker, poly) {
var polyPoints = poly.getLatLngs();
var x = marker.getLatLng().lat, y = marker.getLatLng().lng;
var inside = false;
for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
var xi = polyPoints[i].lat, yi = polyPoints[i].lng;
var xj = polyPoints[j].lat, yj = polyPoints[j].lng;
var intersect = ((yi > y) != (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
};
例如参见jsfiddle。
代码的原始来源:https://github.com/substack/point-in-polygon/blob/master/index.js
另请参阅 2014 年的类似回答,
这是对我有用的@gusper 答案的修改(带有@Sumit 提示)版本:(我有甜甜圈)
function isMarkerInsidePolygon(marker, poly) {
var inside = false;
var x = marker.getLatLng().lat, y = marker.getLatLng().lng;
for (var ii=0;ii<poly.getLatLngs().length;ii++){
var polyPoints = poly.getLatLngs()[ii];
for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
var xi = polyPoints[i].lat, yi = polyPoints[i].lng;
var xj = polyPoints[j].lat, yj = polyPoints[j].lng;
var intersect = ((yi > y) != (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
}
return inside;
};
我发现上述答案中的 none 对计算 非连续 多边形内的标记有效。这是一个示例多边形,其中上述函数在内部返回 0 个标记:
对于任何需要这样做的人,Leaflet.PointInPolygon
包对我有用:https://github.com/hayeswise/Leaflet.PointInPolygon
速度有点慢,但好像还算准确
假设我在下面的演示中使用传单绘制多边形: http://leaflet.github.io/Leaflet.draw/
我的问题是如何确定给定点是否位于多边形内。
使用光线投射算法检查点(标记)是否位于多边形内部:
function isMarkerInsidePolygon(marker, poly) {
var polyPoints = poly.getLatLngs();
var x = marker.getLatLng().lat, y = marker.getLatLng().lng;
var inside = false;
for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
var xi = polyPoints[i].lat, yi = polyPoints[i].lng;
var xj = polyPoints[j].lat, yj = polyPoints[j].lng;
var intersect = ((yi > y) != (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
};
例如参见jsfiddle。
代码的原始来源:https://github.com/substack/point-in-polygon/blob/master/index.js
另请参阅 2014 年的类似回答,
这是对我有用的@gusper 答案的修改(带有@Sumit 提示)版本:(我有甜甜圈)
function isMarkerInsidePolygon(marker, poly) {
var inside = false;
var x = marker.getLatLng().lat, y = marker.getLatLng().lng;
for (var ii=0;ii<poly.getLatLngs().length;ii++){
var polyPoints = poly.getLatLngs()[ii];
for (var i = 0, j = polyPoints.length - 1; i < polyPoints.length; j = i++) {
var xi = polyPoints[i].lat, yi = polyPoints[i].lng;
var xj = polyPoints[j].lat, yj = polyPoints[j].lng;
var intersect = ((yi > y) != (yj > y))
&& (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
}
return inside;
};
我发现上述答案中的 none 对计算 非连续 多边形内的标记有效。这是一个示例多边形,其中上述函数在内部返回 0 个标记:
对于任何需要这样做的人,Leaflet.PointInPolygon
包对我有用:https://github.com/hayeswise/Leaflet.PointInPolygon
速度有点慢,但好像还算准确