Доработка.

This commit is contained in:
sasha80
2024-01-16 11:11:21 +03:00
parent a774151147
commit cdca75b8a7
4 changed files with 144 additions and 126 deletions

View File

@@ -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]