mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-03 20:42:09 +08:00
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
from typing import Final, Optional
|
|
|
|
import cffi
|
|
|
|
import numpy as np
|
|
|
|
ffi: Optional[cffi.FFI] = None
|
|
try:
|
|
# Note: IDE might complain as this import comes from a cffi C extension
|
|
from timezonefinder import inside_polygon_ext # type: ignore
|
|
|
|
clang_extension_loaded = True
|
|
ffi = cffi.FFI()
|
|
|
|
except ImportError:
|
|
clang_extension_loaded = False
|
|
inside_polygon_ext = None
|
|
|
|
INT_LIST_REP: Final[str] = "int []"
|
|
|
|
|
|
def pt_in_poly_clang(x: int, y: int, coords: np.ndarray) -> bool:
|
|
"""wrapper of the point in polygon test algorithm C extension
|
|
|
|
ATTENTION: the input numpy arrays must have a C_CONTIGUOUS memory layout
|
|
https://numpy.org/doc/stable/reference/generated/numpy.ascontiguousarray.html?highlight=ascontiguousarray#numpy.ascontiguousarray
|
|
"""
|
|
if ffi is None:
|
|
raise ValueError(
|
|
"Trying to use the clang implementation of the point in polygon algorithm "
|
|
"while the C extension in not loaded."
|
|
)
|
|
x_coords = coords[0]
|
|
y_coords = coords[1]
|
|
nr_coords = len(x_coords)
|
|
|
|
y_coords = np.ascontiguousarray(y_coords)
|
|
x_coords = np.ascontiguousarray(x_coords)
|
|
x_coords_ffi = ffi.from_buffer(INT_LIST_REP, x_coords)
|
|
y_coords_ffi = ffi.from_buffer(INT_LIST_REP, y_coords)
|
|
contained = inside_polygon_ext.lib.inside_polygon_int(
|
|
x, y, nr_coords, x_coords_ffi, y_coords_ffi
|
|
)
|
|
return contained
|