mortie.geometry
Lazy WKB/WKT geometry codec. The geometry backend (shapely>=2 preferred,
spherely accepted) is imported on first use, so numpy stays the only runtime
dependency.
Lazy WKB/WKT geometry codec for mortie (issue #71).
The runtime stays numpy-only: this module imports a geometry backend
(shapely>=2 preferred, spherely accepted) lazily and uses it only as a
codec — bytes/text ↔ ring coordinate arrays. All spherical correctness
(antimeridian / pole handling) stays mortie's own job; the backend is never
asked for spatial predicates. Importing :mod:mortie succeeds with neither
backend installed; the geometry functions raise a clear :class:ImportError
when first touched without one (the same lazy-gate pattern :mod:mortie.arrow
uses for pyarrow).
Coordinate convention: WKB/WKT store (x, y) = (lon, lat) degrees
(EPSG:4326). mortie's coverage entry points take (lats, lons), so this
module flips the axes at the boundary and works in degrees throughout.
from_wkb(data, order=18, moc=False, normalize=True, tolerance=None, max_cells=None)
Cover a geometry given as WKB (or EWKB) bytes.
Thin wrapper: decode with :func:geometry_from_wkb, then
:func:from_geometry.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data
|
bytes
|
WKB or EWKB bytes. |
required |
order
|
optional
|
Forwarded to :func: |
18
|
moc
|
optional
|
Forwarded to :func: |
18
|
normalize
|
optional
|
Forwarded to :func: |
18
|
tolerance
|
optional
|
Forwarded to :func: |
18
|
max_cells
|
optional
|
Forwarded to :func: |
18
|
Returns:
| Type | Description |
|---|---|
numpy.ndarray or list of numpy.ndarray
|
As :func: |
Raises:
| Type | Description |
|---|---|
ValueError
|
As :func: |
See Also
from_geometry : The shared parameter semantics and the full contract.
Source code in mortie/geometry.py
412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 | |
from_wkt(text, order=18, moc=False, normalize=True, tolerance=None, max_cells=None)
Cover a geometry given as WKT (or EWKT) text.
Thin wrapper: decode with :func:geometry_from_wkt, then
:func:from_geometry.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
WKT or EWKT text. |
required |
order
|
optional
|
Forwarded to :func: |
18
|
moc
|
optional
|
Forwarded to :func: |
18
|
normalize
|
optional
|
Forwarded to :func: |
18
|
tolerance
|
optional
|
Forwarded to :func: |
18
|
max_cells
|
optional
|
Forwarded to :func: |
18
|
Returns:
| Type | Description |
|---|---|
numpy.ndarray or list of numpy.ndarray
|
As :func: |
Raises:
| Type | Description |
|---|---|
ValueError
|
As :func: |
See Also
from_geometry : The shared parameter semantics and the full contract.
Source code in mortie/geometry.py
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 | |
from_geometry(geom, order=18, moc=False, normalize=True, tolerance=None, max_cells=None)
Cover a backend geometry with morton indices (issue #71).
The geometry is decomposed via :func:decompose and routed to mortie's
existing coverage entry points — so WKB/WKT ingest produces exactly the same
cover as calling those functions on the same (lats, lons) arrays.
- Polygon / MultiPolygon → :func:
mortie.morton_coverage(flat) or, withmoc=True, :func:mortie.morton_coverage_moc(compact mixed-order). Holes and disjoint parts are handled by the one even-odd descent. - LineString / MultiLineString → :func:
mortie.linestring_coverage.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
geom
|
backend geometry
|
A shapely/spherely geometry object (e.g. from :func: |
required |
order
|
int
|
HEALPix order (1–29). Default 18. |
18
|
moc
|
bool
|
Polygonal only: return a compact MOC instead of a flat cover. |
False
|
normalize
|
bool
|
Polygonal: auto-correct ring orientation at ingest, on both the
flat and the |
True
|
tolerance
|
optional
|
Polygonal |
None
|
max_cells
|
optional
|
Polygonal |
None
|
Returns:
| Type | Description |
|---|---|
numpy.ndarray or list of numpy.ndarray
|
Polygonal → 1-D |
Raises:
| Type | Description |
|---|---|
ValueError
|
If |
Source code in mortie/geometry.py
333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 | |
to_wkb(morton, dissolve=True, step=1, srid=None)
Emit a morton cover as WKB (or EWKB) bytes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
morton
|
array_like of uint64
|
A morton cover (flat or mixed-order MOC). |
required |
dissolve
|
optional
|
Forwarded to :func: |
True
|
step
|
optional
|
Forwarded to :func: |
True
|
srid
|
int
|
With |
None
|
Returns:
| Type | Description |
|---|---|
bytes
|
The encoded WKB (or EWKB) bytes. |
Raises:
| Type | Description |
|---|---|
NotImplementedError
|
As :func: |
See Also
to_geometry : The dissolve / step contract in full.
Source code in mortie/geometry.py
1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 | |
to_wkt(morton, dissolve=True, step=1, srid=None)
Emit a morton cover as WKT (or EWKT) text.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
morton
|
array_like of uint64
|
A morton cover (flat or mixed-order MOC). |
required |
dissolve
|
optional
|
Forwarded to :func: |
True
|
step
|
optional
|
Forwarded to :func: |
True
|
srid
|
int
|
With |
None
|
Returns:
| Type | Description |
|---|---|
str
|
The encoded WKT (or EWKT) text. |
Raises:
| Type | Description |
|---|---|
NotImplementedError
|
As :func: |
See Also
to_geometry : The dissolve / step contract in full.
Source code in mortie/geometry.py
1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 | |
to_geometry(morton, dissolve=True, step=1)
Convert a morton cover to a backend geometry (issue #71).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
morton
|
array_like of uint64
|
A morton cover (flat or mixed-order MOC; each word self-encodes order). |
required |
dissolve
|
bool
|
|
True
|
step
|
int
|
Boundary points per cell edge (default 1 = 4 corners / straight chords).
|
1
|
Returns:
| Type | Description |
|---|---|
backend geometry
|
A shapely (or spherely) |
Raises:
| Type | Description |
|---|---|
NotImplementedError
|
If the active backend is not shapely, or if a dissolved hole nests
into no exterior (pass |
Notes
Emit requires the shapely backend (it constructs geometry objects). The
dissolved emit (dissolve=True) handles pole-enclosing covers (e.g. polar
caps), exteriors crossing the antimeridian any even number of times, and
antimeridian-crossing holes: crossing rings are cut at ±180° and reconnected
by the GeoJSON convention — a single split MultiPolygon with explicit
±90° pole vertices stitched down the antimeridian. A cover spanning near
or over a hemisphere (2π sr), or one with a boundary ring enclosing more
than a hemisphere (e.g. an equatorial band), raises ValueError — its
exterior/hole winding is ambiguous (issue #108); split such a cover or use
dissolve=False.
Source code in mortie/geometry.py
1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 | |