-
Notifications
You must be signed in to change notification settings - Fork 1
/
f_lonlat_xy.mjs
34 lines (34 loc) · 1.42 KB
/
f_lonlat_xy.mjs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//WGS84(EPSG:4326)との変換
//ウェブメルカトルのタイル番号(左手系)
//EPSG:3857(メートル単位)(右手系)a_zoom_level === "m"とする。
export function f_lonlat_xy(a_value, a_type, a_zoom_level) {
//a_valueは変換元の緯度、経度、x、yのいずれかの数値
//a_typeは"lon_to_x"、"lat_to_y"、"x_to_lon"、"y_to_lat"のいずれか
//a_zoom_levelはウェブメルカトルのzに相当。EPSG:3857の場合は"m"とする。
if (a_type === "lon_to_x") {
const a_lon = a_value;
if (a_zoom_level === "m") {
return a_lon / 180 * 6378137 * Math.PI;
}
return (a_lon / 180 + 1) * 0.5 * (2 ** a_zoom_level);
} else if (a_type === "lat_to_y") {
const a_lat = a_value;
if (a_zoom_level === "m") {
return Math.atanh(Math.sin(a_lat * Math.PI / 180)) * 6378137;
}
return (1 - Math.atanh(Math.sin(a_lat * Math.PI / 180)) / Math.PI) * 0.5 * (2 ** a_zoom_level);
} else if (a_type === "x_to_lon") {
const a_x = a_value;
if (a_zoom_level === "m") {
return a_x / Math.PI / 6378137 * 180;
}
return (a_x / (2 ** a_zoom_level) / 0.5- 1) * 180;
} else if (a_type === "y_to_lat") {
const a_y = a_value;
if (a_zoom_level === "m") {
return Math.asin(Math.tanh(a_y / 6378137)) * 180 / Math.PI;
}
return Math.asin(Math.tanh((1 - a_y / (2 ** a_zoom_level) / 0.5) * Math.PI)) * 180 / Math.PI;
}
//出力は変換先の緯度、経度、x、yのいずれかの数値
}