0
我想縮放地圖上的多邊形,而且它出現在水平(經度)可以工作,但 垂直(緯度)保持不變。
如何執行這些步驟走近它
的轉換:
1)轉換的緯度和經度爲笛卡爾點
2)移動點做有差異對象空間每個點和多邊形質心
3)按比例縮放每個點
4)通過在質心中添加回來將它們移回世界空間。
一個可能的原因:
在平移和縮放我只是操縱x和y的值。由於 縮放比例只是2D形狀,我認爲它可以忽略不計,但也許我需要操縱 它以及在這個過程中的某個地方。
我的代碼:主執行堆棧後跟所有他們使用的功能。
var originalLatLngs = [{lat:45.250589,lon:-116.653149},{lat:45.250603,lon:-116.651856},{lat:45.250269,lon:-116.651845},{lat:45.250261,lon:-116.653146}];
var cartesianPoints = bounds.map(function(bound){
return toCartesian(bound.lat,bound.lon);
});
var centriod = getPolygonCentroid(cartesianPoints);
var objectCoordinates = toObjectSpace(centriod,cartesianPoints);
var scaledCoordinates = scaleCoordinates(2,objectCoordinates);
var marginCoordinates = toWorldSpace(centriod,scaledCoordinates);
var newLatLngs = marginCoordinates.map(function(marginCoordinate){
return toLatLng(marginCoordinate.x,marginCoordinate.y,marginCoordinate.z);
});
function getPolygonCentroid(vertices){
var centroid = {x:0,y:0};
var signedArea = 0;
var x0 = 0;
var y0 = 0;
var x1 = 0;
var y1 = 0;
var a = 0;
for (var i=0; i<vertices.length-1; i++){
x0 = vertices[i].x;
y0 = vertices[i].y;
x1 = vertices[i+1].x;
y1 = vertices[i+1].y;
a = x0*y1 - x1*y0;
signedArea += a;
centroid.x += (x0 + x1)*a;
centroid.y += (y0 + y1)*a;
}
x0 = vertices[i].x;
y0 = vertices[i].y;
x1 = vertices[0].x;
y1 = vertices[0].y;
a = x0*y1 - x1*y0;
signedArea += a;
centroid.x += (x0 + x1)*a;
centroid.y += (y0 + y1)*a;
signedArea *= 0.5;
centroid.x /= (6.0*signedArea);
centroid.y /= (6.0*signedArea);
return centroid;
}
function toObjectSpace(centroid,worldCoordinates){
var objectCoordinates = [];
worldCoordinates.forEach(function(worldCoordinate){
var newXCoordinate = worldCoordinate.x - centroid.x;
var newYCoordinate = worldCoordinate.y - centroid.y;
var orginalZCoordinate = worldCoordinate.z;
objectCoordinates.push({x:newXCoordinate,y:newYCoordinate,z:originalZCoordinate});
});
return objectCoordinates;
}
function scaleCoordinates(factor,coordinates){
var scaledCoordinates = [];
coordinates.forEach(function(coordinate){
var newXCoordinate = coordinate.x * factor;
var newYCoordinate = coordinate.y * factor;
var orginalZCoordinate = coordinate.z;
scaledCoordinates.push({x:newXCoordinate,y:newYCoordinate,z:originalZCoordinate});
});
return scaledCoordinates;
}
function toWorldSpace(centroid,objectCoordinates){
var worldCoordinates = [];
objectCoordinates.forEach(function(objectCoordinate){
var newXCoordinate = objectCoordinate.x + centroid.x;
var newYCoordinate = objectCoordinate.y + centroid.y;
var orginalZCoordinate = objectCoordinate.z;
worldCoordinates.push({x:newXCoordinate,y:newYCoordinate,z:originalZCoordinate});
});
return worldCoordinates;
}
var toCartesian = function(lat,lon){
const R = 6371;
var x = R * Math.cos(deg2rad(lat)) * Math.cos(deg2rad(lon));
var y = R * Math.cos(deg2rad(lat)) * Math.sin(deg2rad(lon));
var z = R * Math.sin(deg2rad(lat));
return {
x: x,
y: y,
z: z
}
}
var toLatLng = function(x,y,z){
const R = 6371;
var lat = Math.asin(z/R);
var lon = Math.atan2(y, x);
return {
lat:rad2deg(lat),
lon:rad2deg(lon)
}
}
var deg2rad = function(deg) {
return deg * (Math.PI/180)
}
var rad2deg = function(radians) {
return radians * 180/Math.PI;
};
你是否在'toCartesian'後檢查了值?你正在使用3D點,就像2D點一樣 – MBo