File size: 2,846 Bytes
9271aef 4d26ef2 9271aef 85dd36a 9271aef 85dd36a c07ce51 9271aef 85dd36a c07ce51 9271aef c07ce51 85dd36a c07ce51 9271aef c07ce51 9271aef 85dd36a 9271aef c07ce51 9271aef c07ce51 9271aef 85dd36a c07ce51 b241742 9271aef b241742 6d1f220 c07ce51 6d1f220 |
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 |
import math
from typing import TypedDict
from src import app_logger
from src.utilities.constants import TILE_SIZE
from src.utilities.type_hints import LatLngDict
class PixelCoordinate(TypedDict):
x: int
y: int
def get_latlng2pixel_projection(latlng: LatLngDict) -> PixelCoordinate:
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 = math.sin(latlng.lat * math.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 - math.log((1 + sin_y) / (1 - sin_y)) / (4 * math.pi))
app_logger.debug(f"y:{y}.")
return {"x": x, "y": y}
except Exception as e_get_latlng2pixel_projection:
app_logger.error(f'e_get_latlng2pixel_projection:{e_get_latlng2pixel_projection}.')
raise e_get_latlng2pixel_projection
def get_point_latlng_to_pixel_coordinates(latlng: LatLngDict, zoom: int | float) -> PixelCoordinate:
try:
world_coordinate: PixelCoordinate = get_latlng2pixel_projection(latlng)
app_logger.debug(f"world_coordinate:{world_coordinate}.")
scale: int = pow(2, zoom)
app_logger.debug(f"scale:{scale}.")
return PixelCoordinate(
x=math.floor(world_coordinate["x"] * scale),
y=math.floor(world_coordinate["y"] * scale)
)
except Exception as e_format_latlng_to_pixel_coordinates:
app_logger.error(f'format_latlng_to_pixel_coordinates:{e_format_latlng_to_pixel_coordinates}.')
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
):
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 = PixelCoordinate(x=diff_coord_x, y=diff_coord_y)
app_logger.debug(f"point type - {k}: {point}.")
return point
|