File size: 4,217 Bytes
6f2f547 9271aef e897c81 1499e36 9271aef 6f2f547 2c3171a c07ce51 9271aef 2c3171a c07ce51 9271aef c07ce51 85dd36a c07ce51 2c3171a c07ce51 9271aef c7d3092 9271aef 6f2f547 2c3171a 9271aef 6f2f547 c07ce51 9271aef c07ce51 6f2f547 2c3171a 9271aef c7d3092 9271aef 85dd36a 6f2f547 1499e36 6f2f547 e897c81 6f2f547 c07ce51 6f2f547 b241742 6f2f547 c07ce51 6d1f220 e897c81 |
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
"""functions useful to convert to/from latitude-longitude coordinates to pixel image coordinates"""
from src import app_logger
from src.utilities.constants import TILE_SIZE, EARTH_EQUATORIAL_RADIUS
from src.utilities.type_hints import ImagePixelCoordinates, tuple_float, tuple_float_any
from src.utilities.type_hints import LatLngDict
def _get_latlng2pixel_projection(latlng: LatLngDict) -> ImagePixelCoordinates:
from math import log, pi, sin
app_logger.debug(f"latlng: {type(latlng)}, value:{latlng}.")
app_logger.debug(f'latlng lat: {type(latlng.lat)}, value:{latlng.lat}.')
app_logger.debug(f'latlng lng: {type(latlng.lng)}, value:{latlng.lng}.')
try:
sin_y: float = sin(latlng.lat * pi / 180)
app_logger.debug(f"sin_y, #1:{sin_y}.")
sin_y = min(max(sin_y, -0.9999), 0.9999)
app_logger.debug(f"sin_y, #2:{sin_y}.")
x = TILE_SIZE * (0.5 + latlng.lng / 360)
app_logger.debug(f"x:{x}.")
y = TILE_SIZE * (0.5 - log((1 + sin_y) / (1 - sin_y)) / (4 * pi))
app_logger.debug(f"y:{y}.")
return {"x": x, "y": y}
except Exception as e_get_latlng2pixel_projection:
app_logger.error(f'args type:{type(latlng)}, {latlng}.')
app_logger.exception(f'e_get_latlng2pixel_projection:{e_get_latlng2pixel_projection}.', exc_info=True)
raise e_get_latlng2pixel_projection
def _get_point_latlng_to_pixel_coordinates(latlng: LatLngDict, zoom: int | float) -> ImagePixelCoordinates:
from math import floor
try:
world_coordinate: ImagePixelCoordinates = _get_latlng2pixel_projection(latlng)
app_logger.debug(f"world_coordinate:{world_coordinate}.")
scale: int = pow(2, zoom)
app_logger.debug(f"scale:{scale}.")
return ImagePixelCoordinates(
x=floor(world_coordinate["x"] * scale),
y=floor(world_coordinate["y"] * scale)
)
except Exception as e_format_latlng_to_pixel_coordinates:
app_logger.error(f'latlng type:{type(latlng)}, {latlng}.')
app_logger.error(f'zoom type:{type(zoom)}, {zoom}.')
app_logger.exception(f'e_format_latlng_to_pixel_coordinates:{e_format_latlng_to_pixel_coordinates}.',
exc_info=True)
raise e_format_latlng_to_pixel_coordinates
def get_latlng_to_pixel_coordinates(
latlng_origin_ne: LatLngDict,
latlng_origin_sw: LatLngDict,
latlng_current_point: LatLngDict,
zoom: int | float,
k: str
) -> ImagePixelCoordinates:
"""
Parse the input request lambda event
Args:
latlng_origin_ne: NE latitude-longitude origin point
latlng_origin_sw: SW latitude-longitude origin point
latlng_current_point: latitude-longitude prompt point
zoom: Level of detail
k: prompt type
Returns:
ImagePixelCoordinates: pixel image coordinate point
"""
app_logger.debug(f"latlng_origin - {k}: {type(latlng_origin_ne)}, value:{latlng_origin_ne}.")
app_logger.debug(f"latlng_current_point - {k}: {type(latlng_current_point)}, value:{latlng_current_point}.")
latlng_map_origin_ne = _get_point_latlng_to_pixel_coordinates(latlng_origin_ne, zoom)
latlng_map_origin_sw = _get_point_latlng_to_pixel_coordinates(latlng_origin_sw, zoom)
latlng_map_current_point = _get_point_latlng_to_pixel_coordinates(latlng_current_point, zoom)
diff_coord_x = abs(latlng_map_origin_sw["x"] - latlng_map_current_point["x"])
diff_coord_y = abs(latlng_map_origin_ne["y"] - latlng_map_current_point["y"])
point = ImagePixelCoordinates(x=diff_coord_x, y=diff_coord_y)
app_logger.debug(f"point type - {k}: {point}.")
return point
def _from4326_to3857(lat: float, lon: float) -> tuple_float or tuple_float_any:
from math import radians, log, tan
x_tile: float = radians(lon) * EARTH_EQUATORIAL_RADIUS
y_tile: float = log(tan(radians(45 + lat / 2.0))) * EARTH_EQUATORIAL_RADIUS
return x_tile, y_tile
def _deg2num(lat: float, lon: float, zoom: int):
from math import radians, pi, asinh, tan
n = 2 ** zoom
x_tile = ((lon + 180) / 360 * n)
y_tile = (1 - asinh(tan(radians(lat))) / pi) * n / 2
return x_tile, y_tile
|