Доработка.
This commit is contained in:
@@ -1,10 +1,11 @@
|
||||
extends Node
|
||||
|
||||
## Веб-утилиты для работы с меркаторскими XYZ-плитками.
|
||||
## Веб-утилиты для работы с меркаторовскими XYZ-плитками.
|
||||
|
||||
const R2D: = 180.0 / PI
|
||||
const RE: = 6378137.0 ## Радиус Земли в метрах
|
||||
const CE: = 2.0 * PI * RE ## Длина окружности Земли в метрах
|
||||
const RE: = 6378137.0 ## Радиус Земли экваториальный в метрах
|
||||
const RP: = 6356752.31424518 ## Радиус Земли полярный в метрах
|
||||
const CE: = 2.0 * PI * RE ## Длина окружности Земли в метрах по экватору
|
||||
const EPSILON: = 1e-14
|
||||
const LL_EPSILON: = 1e-11
|
||||
const MAX_ZOOM: = 20
|
||||
@@ -115,6 +116,24 @@ func rshift(val: int, n: int) -> int: return (val % 0x100000000) >> n
|
||||
func asinh(val: float): return log(val + sqrt(val * val + 1.0))
|
||||
|
||||
|
||||
# To convert lon/lat/alt (lon in degrees East, lat in degrees North, alt in
|
||||
# meters) to earth centered fixed coordinates (x, y, z)
|
||||
func lnglat_to_ecef(lng: float, lat: float, alt: float = 0.0):
|
||||
alt += RE
|
||||
var latrad: float = radians(lat)
|
||||
var lonrad: float = radians(lng)
|
||||
var coslat: float = cos(latrad)
|
||||
var sinlat: float = sin(latrad)
|
||||
var coslon: float = cos(lonrad)
|
||||
var sinlon: float = sin(lonrad)
|
||||
var term1: float = (RE * coslat) / tools.hypot(RE * coslat, RP * sinlat)
|
||||
var term2: float = alt * coslat + term1;
|
||||
var x: float = coslon * term2
|
||||
var y: float = sinlon * term2
|
||||
var z: float = alt * sinlat + (RP * sinlat) / tools.hypot(RE * coslat, RP * sinlat)
|
||||
return [x, y, z]
|
||||
|
||||
|
||||
func find_up_left(tiles: Array):
|
||||
var x = 0
|
||||
var y = 0
|
||||
@@ -128,20 +147,19 @@ func find_up_left(tiles: Array):
|
||||
|
||||
|
||||
## Lon./lat. to tile numbers
|
||||
func deg2num(lat: float, lon: float, zoom: int):
|
||||
lat = radians(lat)
|
||||
func deg2num(lng: float, lat: float, zoom: int):
|
||||
var n: = float(1 << zoom)
|
||||
var xtile: = int((lon + 180.0) / 360.0 * n)
|
||||
var ytile: = int((1.0 - asinh(tan(lat)) / PI) / 2.0 * n)
|
||||
var xtile: = int((lng + 180.0) / 360.0 * n)
|
||||
var ytile: = int((1.0 - asinh(tan(radians(lat))) / PI) / 2.0 * n)
|
||||
return [xtile, ytile]
|
||||
|
||||
|
||||
## Tile numbers to lon./lat.
|
||||
func num2deg(xtile: int, ytile: int, zoom: int):
|
||||
func num2deg(x: int, y: int, zoom: int):
|
||||
var n: = float(1 << zoom)
|
||||
var lon: = float(xtile) / n * 360.0 - 180.0
|
||||
var lat: = atan(sinh(PI * (1.0 - 2.0 * float(ytile) / n)))
|
||||
return [degrees(lat), lon]
|
||||
var lng: = float(x) / n * 360.0 - 180.0
|
||||
var lat: = atan(sinh(PI * (1.0 - 2.0 * float(y) / n)))
|
||||
return [lng, degrees(lat)]
|
||||
|
||||
|
||||
## Расстояние по горизонтали в метрах, представленное одним пикселем
|
||||
@@ -253,7 +271,7 @@ func ul2(tile: Tile) -> Array[float]:
|
||||
var lon_deg = tile.x / z2 * 360.0 - 180.0
|
||||
var lat_rad = atan(sinh(PI * (1 - 2 * tile.y / z2)))
|
||||
var lat_deg = degrees(lat_rad)
|
||||
return [lat_deg, lon_deg]
|
||||
return [lon_deg, lat_deg]
|
||||
|
||||
|
||||
## Возвращает граничную область плитки.[br]
|
||||
|
||||
Reference in New Issue
Block a user