- Published on
地图常用
- Authors
- Name
- 阿涵王小胖
- @hnqxc
使用proj4求两线交点
使用turfJS求交点的时候,遇到一个交点不在两线上的问题,详见这里的issue,原因大概是经纬度计算的误差,投影坐标和地理坐标各有优势,投影坐标更适合用来计算 因此,使用proj4将坐标转换成投影坐标后在计算,可达到精准的计算结果
const line1 = [
[120.179402, 31.247428, 0],
[120.700497, 31.365937, 0]
]
const line2 = [
[120.445638, 31.381745, 0],
[121.033588, 31.055778, 0],
[121.094159, 31.046175, 0],
[121.167627, 31.042088, 0]
]
const point = intesection(line1, line2)
console.log(point);
function intesection(line1, line2) {
const mercator = proj4("EPSG:4326", "EPSG:3857");
// Convert the lines to Mercator coordinates
const line1Mercator = line1.map(i => mercator.forward(i))
const line2Mercator = line2.map(i => mercator.forward(i))
// Define the lines in the form y = mx + b
const m1 =
(line1Mercator[1][1] - line1Mercator[0][1]) /
(line1Mercator[1][0] - line1Mercator[0][0]);
const b1 = line1Mercator[0][1] - m1 * line1Mercator[0][0];
const m2 =
(line2Mercator[1][1] - line2Mercator[0][1]) /
(line2Mercator[1][0] - line2Mercator[0][0]);
const b2 = line2Mercator[0][1] - m2 * line2Mercator[0][0];
// Find the intersection point
const x = (b2 - b1) / (m1 - m2);
const y = m1 * x + b1;
// Convert the intersection point back to geographic coordinates
const intersection = mercator.inverse([x, y]);
return intersection
}