Skip to content

Commit 9c707d6

Browse files
authored
Merge pull request #65 from Sov-trotter/dev
Add metatype for MultiPolygon and LineString
2 parents 572de54 + 67ac263 commit 9c707d6

File tree

4 files changed

+44
-20
lines changed

4 files changed

+44
-20
lines changed

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ julia> metafree(poi)
4949
3
5050
1
5151

52+
# for other geometries metatypes are predefined
53+
julia> multipoi = MultiPointMeta([p1], city="Abuja", rainfall=1221.2)
54+
1-element MultiPointMeta{Point{2,Int64},MultiPoint{2,Int64,Point{2,Int64},Array{Point{2,Int64},1}},(:city, :rainfall),Tuple{String,Float64}}:
55+
[3, 1]
56+
5257
# connect the points with lines
5358
julia> l1 = Line(p1, p2)
5459
Line([3, 1] => [1, 3])

src/GeometryBasics.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ module GeometryBasics
2929
export OffsetInteger, ZeroIndex, OneIndex, GLIndex
3030
export FaceView, SimpleFaceView
3131
export AbstractPoint, PointMeta, PointWithUV
32-
export PolygonMeta, MultiPointMeta, MultiLineStringMeta, MeshMeta
32+
export PolygonMeta, MultiPointMeta, MultiLineStringMeta, MeshMeta, LineStringMeta, MultiPolygonMeta
3333
export decompose, coordinates, faces, normals, decompose_uv, decompose_normals, texturecoordinates
3434
export Tesselation, pointmeta, Normal, UV, UVW
3535
export GLTriangleFace, GLNormalMesh3D, GLPlainTriangleMesh, GLUVMesh3D, GLUVNormalMesh3D

src/metadata.jl

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,10 @@ Base.getindex(x::SimplexFaceMeta, idx::Int) = getindex(metafree(x), idx)
171171

172172
@meta_type(Polygon, polygon, AbstractPolygon, N, T)
173173

174+
@meta_type(LineString, lines, AbstractVector, P <: Line)
175+
Base.getindex(x::LineStringMeta, idx::Int) = getindex(metafree(x), idx)
176+
Base.size(x::LineStringMeta) = size(metafree(x))
177+
174178
@meta_type(MultiPoint, points, AbstractVector, P <: AbstractPoint)
175179
Base.getindex(x::MultiPointMeta, idx::Int) = getindex(metafree(x), idx)
176180
Base.size(x::MultiPointMeta) = size(metafree(x))
@@ -179,6 +183,10 @@ Base.size(x::MultiPointMeta) = size(metafree(x))
179183
Base.getindex(x::MultiLineStringMeta, idx::Int) = getindex(metafree(x), idx)
180184
Base.size(x::MultiLineStringMeta) = size(metafree(x))
181185

186+
@meta_type(MultiPolygon, polygons, AbstractVector, P <: Polygon)
187+
Base.getindex(x::MultiPolygonMeta, idx::Int) = getindex(metafree(x), idx)
188+
Base.size(x::MultiPolygonMeta) = size(metafree(x))
189+
182190
@meta_type(Mesh, mesh, AbstractMesh, Element <: Polytope)
183191
Base.getindex(x::MeshMeta, idx::Int) = getindex(metafree(x), idx)
184192
Base.size(x::MeshMeta) = size(metafree(x))

test/runtests.jl

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -56,38 +56,31 @@ using GeometryBasics: attributes
5656
end
5757

5858
end
59+
5960
@testset "polygon with metadata" begin
6061
polys = [Polygon(rand(Point{2, Float32}, 20)) for i in 1:10]
6162
pnames = [randstring(4) for i in 1:10]
6263
numbers = LinRange(0.0, 1.0, 10)
6364
bin = rand(Bool, 10)
64-
# create just an array
65-
plain = meta(polys, name = pnames, value = numbers, category = bin)
65+
# create a polygon
66+
poly = PolygonMeta(polys[1], name = pnames[1], value = numbers[1], category = bin[1])
6667
# create a MultiPolygon with the right type & meta information!
67-
multipoly = MultiPolygon(polys; name = pnames, value = numbers, category = bin)
68-
for x in (plain, multipoly)
69-
for (mp, p, n, num, b) in zip(x, polys, pnames, numbers, bin)
70-
@test mp.polygon == p
71-
@test mp.name == n
72-
@test mp.value == num
73-
@test mp.category == b
74-
end
75-
76-
filtered = filter(i -> i.value < 0.7, x)
77-
@test length(filtered) == 7
78-
end
79-
@test GeometryBasics.getcolumn(plain, :name) == pnames
80-
@test GeometryBasics.MetaType(Polygon) == PolygonMeta
81-
@test_throws ErrorException GeometryBasics.meta(plain)
68+
multipoly = MultiPolygonMeta(polys, name = pnames, value = numbers, category = bin)
69+
@test multipoly isa AbstractVector
70+
@test poly isa GeometryBasics.AbstractPolygon
71+
72+
@test GeometryBasics.getcolumn(poly, :name) == pnames[1]
8273
@test GeometryBasics.MetaFree(PolygonMeta) == Polygon
8374

75+
@test GeometryBasics.getcolumn(multipoly, :name) == pnames
76+
@test GeometryBasics.MetaFree(MultiPolygonMeta) == MultiPolygon
77+
8478
meta_p = meta(polys[1], boundingbox=Rect(0, 0, 2, 2))
8579
@test meta_p.boundingbox === Rect(0, 0, 2, 2)
8680
@test metafree(meta_p) === polys[1]
8781
attributes(meta_p) == Dict{Symbol, Any}(:boundingbox => meta_p.boundingbox,
8882
:polygon => polys[1])
8983
end
90-
9184
@testset "point with metadata" begin
9285
p = Point(1.1, 2.2)
9386
@test p isa AbstractVector{Float64}
@@ -99,8 +92,26 @@ using GeometryBasics: attributes
9992
@test metafree(pm) === p
10093
@test propertynames(pm) == (:position, :a, :b)
10194
end
95+
96+
@testset "MultiPoint with metadata" begin
97+
p = collect(Point{2, Float64}(x, x+1) for x in 1:5)
98+
@test p isa AbstractVector
99+
mpm = MultiPointMeta(p, a=1, b=2)
100+
@test coordinates(mpm) == mpm
101+
@test meta(mpm) === (a=1, b=2)
102+
@test metafree(mpm) == p
103+
@test propertynames(mpm) == (:points, :a, :b)
104+
end
105+
106+
@testset "LineString with metadata" begin
107+
linestring = LineStringMeta(Point{2, Int}[(10, 10), (20, 20), (10, 40)], a = 1, b = 2)
108+
@test linestring isa AbstractVector
109+
@test meta(linestring) === (a = 1, b = 2)
110+
@test metafree(linestring) == linestring
111+
@test propertynames(linestring) == (:lines, :a, :b)
112+
end
102113

103-
@testset "MultiLineString with metadata" begin
114+
@testset "MultiLineString with metadata" begin
104115
linestring1 = LineString(Point{2, Int}[(10, 10), (20, 20), (10, 40)])
105116
linestring2 = LineString(Point{2, Int}[(40, 40), (30, 30), (40, 20), (30, 10)])
106117
multilinestring = MultiLineString([linestring1, linestring2])

0 commit comments

Comments
 (0)