from .._typeinfo import TypeInfo
try:
- from shapely.wkb import dumps, loads
+ from shapely import from_wkb, to_wkb
from shapely.geometry.base import BaseGeometry
except ImportError:
format = Format.BINARY
def load(self, data: Buffer) -> BaseGeometry:
- if not isinstance(data, bytes):
- data = bytes(data)
- return loads(data)
+ return from_wkb(bytes(data))
class GeometryLoader(Loader):
def load(self, data: Buffer) -> BaseGeometry:
# it's a hex string in binary
- if isinstance(data, memoryview):
- data = bytes(data)
- return loads(data.decode(), hex=True)
+ return from_wkb(bytes(data))
class BaseGeometryBinaryDumper(Dumper):
format = Format.BINARY
def dump(self, obj: BaseGeometry) -> Buffer | None:
- return dumps(obj) # type: ignore
+ return to_wkb(obj, include_srid=True)
class BaseGeometryDumper(Dumper):
def dump(self, obj: BaseGeometry) -> Buffer | None:
- return dumps(obj, hex=True).encode() # type: ignore
+ return to_wkb(obj, True, include_srid=True).encode()
def register_shapely(info: TypeInfo, context: AdaptContext | None = None) -> None:
pytest.importorskip("shapely")
+from shapely import get_srid, set_srid
from shapely.geometry import MultiPolygon, Point, Polygon
from psycopg.types.shapely import register_shapely
@pytest.mark.parametrize("fmt_out", Format)
def test_write_read_shape(shapely_conn, fmt_in, fmt_out):
SAMPLE_POINT = Point(1.2, 3.4)
- SAMPLE_POLYGON = Polygon([(0, 0), (1, 1), (1, 0)])
+ SAMPLE_POLYGON_4326 = Polygon([(0, 0), (1, 1), (1, 0)])
+ set_srid(SAMPLE_POLYGON_4326, 4326)
with shapely_conn.cursor(binary=fmt_out) as cur:
cur.execute(
)
cur.execute(
f"insert into sample_geoms(id, geom) VALUES(2, %{fmt_in})",
- (SAMPLE_POLYGON,),
+ (SAMPLE_POLYGON_4326,),
)
cur.execute("select geom from sample_geoms where id=1")
result = cur.fetchone()[0]
assert result == SAMPLE_POINT
+ assert get_srid(result) == 0
cur.execute("select geom from sample_geoms where id=2")
result = cur.fetchone()[0]
- assert result == SAMPLE_POLYGON
+ assert result == SAMPLE_POLYGON_4326
+ assert get_srid(result) == 4326
@pytest.mark.parametrize("fmt_out", Format)