2016-03-15 4 views
0

Я нашел код для преобразования широты/долготы в пиксели на заданном изображении и наоборот. Я портировал его на JavaScript, но получаю неправильные возвращаемые значения на широте. Я протестировал оригинальный, немодифицированный код, и он дает те же неточности. Ниже приведен код с возвращаемыми значениями.Широта/Долгота -> X/Y, X/Y -> Широта/Долгота

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 

Я пробовал исправить его сам, но я борюсь с математикой. Я не совсем уверен, почему это так.

+0

Большинство людей карты не изобретают математику и используют проекционную библиотеку (например, [D3] (https://www.jasondavies.com/maps/transition/), [proj4js] (http: // proj4js. org /) и др.), чтобы преобразовать координаты между проекциями и поместиться на экране. –

+0

Я провел месяцы, играя с OpenLayers 3 и другими библиотеками. Для чего я хочу сделать, мне нужно создать свою собственную. Кроме того, ни один из них не конвертируется в пиксели. –

ответ

1

Вы уже пробовали this?

Так что ваш код выглядит примерно

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

Или, если вы не хотите всю карту мира this

И убедитесь, что ваши координаты приведены в EPSG: 3857 стандарт.

+0

degrees_pixels() должен давать что-то вроде 75x96. Вместо этого он возвращает 75x70. Я тестирую это, используя ссылочный образ в GIMP (того же размера, который я указываю), и вижу, где падают эти значения пикселей. –

Смежные вопросы