Skip to content

Commit 519051a

Browse files
committed
return tuple points from GeoInterface methods
1 parent feb0055 commit 519051a

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

src/geo_interface.jl

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,40 @@ GeoInterface.getgeom(::MultiLineStringTrait, geom::MultiLineString, i) =
4343
getGeometry(geom, i)::LineString
4444
GeoInterface.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
5180
GeoInterface.getgeom(t::AbstractPointTrait, geom::PreparedGeometry) = nothing
5281
function GeoInterface.getgeom(::PolygonTrait, geom::Polygon, i::Int)
5382
if i == 1

test/test_geo_interface.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,10 @@ const LG = LibGEOS
7171
@test GeoInterface.geomtrait(ls) == LineStringTrait()
7272
p = GeoInterface.ngeom(ls) == 4
7373
p = GeoInterface.getgeom(ls, 3)
74-
@test p isa LibGEOS.Point
74+
@test p isa Tuple{Float64,Float64}
7575
@test GeoInterface.coordinates(p) == [9, 2]
7676
@test GeoInterface.testgeometry(ls)
77+
@test collect(GeoInterface.getpoint(ls)) == [(8, 1), (9, 1), (9, 2), (8, 2)]
7778
plot(ls)
7879

7980
@inferred GeoInterface.ncoord(ls)
@@ -104,9 +105,10 @@ const LG = LibGEOS
104105
@test GeoInterface.geomtrait(lr) == LinearRingTrait()
105106
@test GeoInterface.ngeom(lr) == 5
106107
p = GeoInterface.getgeom(lr, 3)
107-
@test p isa LibGEOS.Point
108+
@test p isa Tuple{Float64,Float64}
108109
@test GeoInterface.coordinates(p) == [9, 2]
109110
@test GeoInterface.testgeometry(lr)
111+
@test collect(GeoInterface.getpoint(lr)) == [(8, 1), (9, 1), (9, 2), (8, 2), (8, 1)]
110112
# Cannot convert LinearRingTrait to series data for plotting
111113
# plot(lr)
112114

0 commit comments

Comments
 (0)