Skip to content

Commit ee9e84e

Browse files
committed
return tuple points from GeoInterface methods
1 parent 1c12df5 commit ee9e84e

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
@@ -41,11 +41,40 @@ GeoInterface.getgeom(::MultiLineStringTrait, geom::MultiLineString, i) =
4141
getGeometry(geom, i)::LineString
4242
GeoInterface.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
4978
GeoInterface.getgeom(t::AbstractPointTrait, geom::PreparedGeometry) = nothing
5079
function GeoInterface.getgeom(::PolygonTrait, geom::Polygon, i::Int)
5180
if i == 1

test/test_geo_interface.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@ const LG = LibGEOS
6565
@test GeoInterface.geomtrait(ls) == LineStringTrait()
6666
p = GeoInterface.ngeom(ls) == 4
6767
p = GeoInterface.getgeom(ls, 3)
68-
@test p isa LibGEOS.Point
68+
@test p isa Tuple{Float64,Float64}
6969
@test GeoInterface.coordinates(p) == [9, 2]
7070
@test GeoInterface.testgeometry(ls)
71+
@test collect(GeoInterface.getpoint(ls)) == [(8, 1), (9, 1), (9, 2), (8, 2)]
7172
plot(ls)
7273

7374
@inferred GeoInterface.ncoord(ls)
@@ -98,9 +99,10 @@ const LG = LibGEOS
9899
@test GeoInterface.geomtrait(lr) == LinearRingTrait()
99100
@test GeoInterface.ngeom(lr) == 5
100101
p = GeoInterface.getgeom(lr, 3)
101-
@test p isa LibGEOS.Point
102+
@test p isa Tuple{Float64,Float64}
102103
@test GeoInterface.coordinates(p) == [9, 2]
103104
@test GeoInterface.testgeometry(lr)
105+
@test collect(GeoInterface.getpoint(lr)) == [(8, 1), (9, 1), (9, 2), (8, 2), (8, 1)]
104106
# Cannot convert LinearRingTrait to series data for plotting
105107
# plot(lr)
106108

0 commit comments

Comments
 (0)