@@ -41,11 +41,40 @@ GeoInterface.getgeom(::MultiLineStringTrait, geom::MultiLineString, i) =
4141 getGeometry (geom, i):: LineString
4242GeoInterface. getgeom (:: MultiPolygonTrait , geom:: MultiPolygon , i) =
4343 getGeometry (geom, i):: Polygon
44- GeoInterface. getgeom (
45- :: Union{LineStringTrait,LinearRingTrait} ,
46- geom:: Union{LineString,LinearRing} ,
47- i,
48- ) = Point (getPoint (geom, i))
44+ function GeoInterface. getgeom (:: AbstractGeometryTrait , geom:: Union{LineString,LinearRing} , i)
45+ ref = Ref {Float64} ()
46+ seq = getCoordSeq (geom:: Union{LineString, LinearRing} )
47+ _get_tuple_point (geom, seq, ref, i)
48+ end
49+ function GeoInterface. getgeom (:: AbstractGeometryTrait , geom:: Union{LineString,LinearRing} )
50+ n = GeoInterface. ngeom (geom)
51+ seq = getCoordSeq (geom:: Union{LineString, LinearRing} )
52+ ref = Ref {Float64} ()
53+ return (_get_tuple_point (geom, seq, ref, i) for i in 1 : n)
54+ end
55+
56+ function _get_tuple_point (geom, seq, ref, i)
57+ context = get_global_context ()
58+ if GeoInterface. is3d (geom)
59+ GC. @preserve ref begin
60+ GEOSCoordSeq_getX_r (context, seq, i - 1 , ref)
61+ x = ref[]
62+ GEOSCoordSeq_getY_r (context, seq, i - 1 , ref)
63+ y = ref[]
64+ GEOSCoordSeq_getZ_r (context, seq, i - 1 , ref)
65+ z = ref[]
66+ end
67+ return (x, y, z)
68+ else
69+ GC. @preserve ref begin
70+ GEOSCoordSeq_getX_r (context, seq, i - 1 , ref)
71+ x = ref[]
72+ GEOSCoordSeq_getY_r (context, seq, i - 1 , ref)
73+ y = ref[]
74+ end
75+ return (x, y)
76+ end
77+ end
4978GeoInterface. getgeom (t:: AbstractPointTrait , geom:: PreparedGeometry ) = nothing
5079function GeoInterface. getgeom (:: PolygonTrait , geom:: Polygon , i:: Int )
5180 if i == 1
0 commit comments