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