Широта / Долгота -> X/Y, X/Y -> Широта / Долгота
Я нашел некоторый код для преобразования широты / долготы в пиксели на заданном изображении и наоборот. Я перенес его на JavaScript, но получаю неправильные возвращаемые значения на широте. Я проверил оригинальный, неизмененный код, и он дает те же неточности. Ниже приведен код со значениями, которые он возвращает.
function degrees_pixels(latitude, longitude, width, height) {
return {
x: ( longitude + 180 ) * ( width / 360 ),
y: ( height / 2 ) - ( width * Math.log(Math.tan(( Math.PI / 4 ) + ( ( latitude * Math.PI / 180 ) / 2 )) ) / ( 2 * Math.PI ) )
};
};
function pixels_degrees(pixel_x, pixel_y, width, height) {
return {
latitude: ( Math.exp( -( pixel_y - ( height / 2 ) ) / width * ( 2 * Math.PI )) - Math.tan(( Math.PI / 4 )) * 2 ) / ( Math.PI / 180 ),
longitude: ( pixel_x - ( width / 2 ) ) / ( width / 360 )
};
};
var tmp1 = degrees_pixels(40.7127, -74.0059, 256, 256);
console.log(tmp1); // Prints {"x":75.3735822222222,"y":96.2511781695169} which is correct
console.log(pixels_degrees(tmp1.x, tmp1.y, 256, 256)); // Prints {"latitude":10.3018054035438,"longitude":-74.0059} of which the latitude is incorrect
Я пытался исправить это сам, но я борюсь с математикой. Я не совсем уверен, почему это не так, как есть.
1 ответ
Вы уже пробовали это?
Итак, ваш код выглядит примерно так
function degrees_pixels(latitude, longitude, width, height) {
return {
x: Math.round((longitude + 180) * (width / 360));,
y: Math.round(((-1 * latitude) + 90) * (height / 180))
};
};
function pixels_degrees(pixel_x, pixel_y, width, height) {
return {
latitude: (pixel_y/(height/180)-90)/-1,
longitude: pixel_x/(width/360)-180
};
};
Или если вы не хотите целую карту мира это
И убедитесь, что ваши координаты указаны в стандарте EPSG:3857.