@@ -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