Tina4

GIS and PostGIS#

Tina4's GIS support stores geographic points in PostGIS, queries distance in metres, and serializes map-ready GeoJSON. Coordinates are always (longitude, latitude).

Define a point field#

python
from tina4_python.orm import ORM, IntegerField, StringField, PointField, Point, feature_collectionclass ChargePoint(ORM):    id = IntegerField(primary_key=True, auto_increment=True)    name = StringField()    location = PointField()site = ChargePoint({    "name": "V&A Waterfront",    "location": Point(18.4241, -33.9249),})site.save()

PointField() creates a geography(Point,4326) column and a GiST index. Tina4 fails clearly on an unsupported database instead of pretending a text column is spatial.

Query by distance#

python
nearby = (    ChargePoint.query()    .within_distance("location", (18.42, -33.92), 5_000)    .select_distance("location", (18.42, -33.92))    .order_by_distance("location", (18.42, -33.92))    .get())

Radius and returned distance are metres. Spatial values remain parameters; column and alias names are validated identifiers.

Return GeoJSON#

python
feature = site.to_feature()collection = feature_collection([site])

A Point also exposes .wkt, .ewkt, .geojson, .lon, .lat, and .srid. Point.parse() accepts a coordinate pair, WKT/EWKT, GeoJSON, or WKB/EWKB without guessing coordinate order.