0

問題:在MAP-緯度拒絕縮放縮放多邊形

我想縮放地圖上的多邊形,而且它出現在水平(經度)可以工作,但 垂直(緯度)保持不變。

如何執行這些步驟走近它

的轉換:

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; 
}; 
+0

你是否在'toCartesian'後檢查了值?你正在使用3D點,就像2D點一樣 – MBo

回答

0

什麼,你可能需要的是球面線性插值(球面線性插值):https://en.wikipedia.org/wiki/Slerp。只需使用參數t作爲縮放因子,在多邊形的每個點與所選中心之間「拉伸」即可。