我有一个问题,在我的传单地图中我从多边形创建了一个三角形:
var polygon = L.polygon([
[parseFloat(decimal_lat),parseFloat(decimal_lon)],
[parseFloat(decimal_lat) + 1, parseFloat(decimal_lon) - 1],
[parseFloat(decimal_lat) + 1, parseFloat(decimal_lon) + 1] ],
{
color:'green'
});
polygon.addTo(map);
我希望围绕Point[decimal_lon, decimal_lat]
旋转此多边形。但是我无法解决它。
我已创建DEMO,我在旋转多项式,我想旋转三角形(多边形)以显示我的问题。
答案 0 :(得分:4)
一种方法是通过矩阵旋转。 https://en.wikipedia.org/wiki/Rotation_matrix。 您想将点转换为中心然后应用旋转,然后将其转换回来。
这就是代码结尾的样子。
//changing polyline with slider but I want to change polygon there
range_yaw.onchange = function() {
var yawAngle = (parseFloat(range_yaw.value) / (819 / 360) + 90)
// line
var center = [decimal_lat, decimal_lon]
var end = [decimal_lat + 2, decimal_lon + 2]
var pointListRotated = rotatePoints(center, [center, end], yawAngle)
polyline.setLatLngs(pointListRotated);
// polygon
var polygonPoints = [
center,
[center[0] + 1, center[1] - 1],
[center[0] + 1, center[1] + 1]
]
polygonRotated = rotatePoints(center, polygonPoints, yawAngle)
polygon.setLatLngs(polygonRotated)
};
//
// rotate a list of points in [lat, lng] format about the center.
//
function rotatePoints(center, points, yaw) {
var res = []
var angle = yaw * (Math.PI / 180)
for(var i=0; i<points.length; i++) {
var p = points[i]
// translate to center
var p2 = [ p[0]-center[0], p[1]-center[1] ]
// rotate using matrix rotation
var p3 = [ Math.cos(angle)*p2[0] - Math.sin(angle)*p2[1], Math.sin(angle)*p2[0] + Math.cos(angle)*p2[1]]
// translate back to center
var p4 = [ p3[0]+center[0], p3[1]+center[1]]
// done with that point
res.push(p4)
}
return res
}
这是DEMO
答案 1 :(得分:2)
我从这个question的答案中改编了@dooderson和@MBo,最终的代码是这样的,它完美地工作了!
rotatePoints (center, points, yaw) {
const res = []
const centerPoint = map.latLngToLayerPoint(center)
const angle = yaw * (Math.PI / 180)
for (let i = 0; i < points.length; i++) {
const p = map.latLngToLayerPoint(points[i])
// translate to center
const p2 = new Point(p.x - centerPoint.x, p.y - centerPoint.y)
// rotate using matrix rotation
const p3 = new Point(Math.cos(angle) * p2.x - Math.sin(angle) * p2.y, Math.sin(angle) * p2.x + Math.cos(angle) * p2.y)
// translate back to center
let p4 = new Point(p3.x + centerPoint.x, p3.y + centerPoint.y)
// done with that point
p4 = map.layerPointToLatLng(p4)
res.push(p4)
}
return res
}
答案 2 :(得分:1)
你可以通过几种方式接近它。这是一个......
FIRST:计算从锚点到两个“外”点的方位和距离。这里有几个辅助函数: https://github.com/gregallensworth/Leaflet/blob/master/LatLng_Bearings.js
第二:根据需要调整那些轴承......保持原始距离。
第三:使用新的方位和距离,使用接受的答案计算新的LatLng:How to calculate the latlng of a point a certain distance away from another?(这使用谷歌地图而不是传单,但很容易移植到传单)
如果您在实施方面遇到任何问题,请告诉我们。