Skip to content

Commit 7d5c218

Browse files
committed
Implemented GeoInterface.
1 parent 92755fc commit 7d5c218

File tree

5 files changed

+111
-2
lines changed

5 files changed

+111
-2
lines changed

Project.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
name = "GeometryBasics"
22
uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326"
33
authors = ["SimonDanisch <[email protected]>"]
4-
version = "0.4.2"
4+
version = "0.4.3"
55

66
[deps]
77
EarCut_jll = "5ae413db-bbd1-5e63-b57d-d24a61df00f5"
8+
GeoInterface = "cf35fbd7-0cd7-5166-be24-54bfbe79505f"
89
IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e"
910
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
1011
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
@@ -21,6 +22,7 @@ julia = "1.3"
2122
[extras]
2223
OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881"
2324
Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c"
25+
StaticArrays = "90137ffa-7385-5640-81b9-e52037218182"
2426
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
2527

2628
[targets]

src/GeometryBasics.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module GeometryBasics
22

3-
using StaticArrays, Tables, StructArrays, IterTools, LinearAlgebra
3+
using StaticArrays, Tables, StructArrays, IterTools, LinearAlgebra, GeoInterface
44
using EarCut_jll
55

66
using Base: @propagate_inbounds
@@ -25,6 +25,7 @@ include("lines.jl")
2525
include("boundingboxes.jl")
2626

2727
include("deprecated.jl")
28+
include("geointerface.jl")
2829

2930
export AbstractGeometry, GeometryPrimitive
3031
export Mat, Point, Vec

src/geointerface.jl

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# Implementation of trait based interface from https://github.com/JuliaGeo/GeoInterface.jl/
2+
3+
GeoInterface.isgeometry(::AbstractGeometry) = true
4+
GeoInterface.isgeometry(::AbstractFace) = true
5+
GeoInterface.isgeometry(::AbstractPoint) = true
6+
GeoInterface.isgeometry(::AbstractVector{<:AbstractGeometry}) = true
7+
GeoInterface.isgeometry(::AbstractVector{<:AbstractPoint}) = true
8+
GeoInterface.isgeometry(::AbstractVector{<:LineString}) = true
9+
GeoInterface.isgeometry(::AbstractVector{<:AbstractPolygon}) = true
10+
GeoInterface.isgeometry(::AbstractVector{<:AbstractFace}) = true
11+
GeoInterface.isgeometry(::Mesh) = true
12+
13+
GeoInterface.geomtrait(::Point) = GeoInterface.PointTrait()
14+
GeoInterface.geomtrait(::Line) = GeoInterface.LineTrait()
15+
GeoInterface.geomtrait(::LineString) = GeoInterface.LineStringTrait()
16+
GeoInterface.geomtrait(::Polygon) = GeoInterface.PolygonTrait()
17+
GeoInterface.geomtrait(::MultiPoint) = GeoInterface.MultiPointTrait()
18+
GeoInterface.geomtrait(::MultiLineString) = GeoInterface.MultiLineStringTrait()
19+
GeoInterface.geomtrait(::MultiPolygon) = GeoInterface.MultiPolygonTrait()
20+
GeoInterface.geomtrait(::Ngon) = GeoInterface.PolygonTrait()
21+
GeoInterface.geomtrait(::AbstractMesh) = GeoInterface.PolyhedralSurfaceTrait()
22+
23+
GeoInterface.geomtrait(::Simplex{Dim,T,1}) where {Dim,T} = GeoInterface.PointTrait()
24+
GeoInterface.geomtrait(::Simplex{Dim,T,2}) where {Dim,T} = GeoInterface.LineStringTrait()
25+
GeoInterface.geomtrait(::Simplex{Dim,T,3}) where {Dim,T} = GeoInterface.PolygonTrait()
26+
27+
GeoInterface.ncoord(::GeoInterface.PointTrait, g::Point) = length(g)
28+
GeoInterface.getcoord(::GeoInterface.PointTrait, g::Point, i::Int) = g[i]
29+
30+
GeoInterface.ngeom(::GeoInterface.LineTrait, g::Line) = length(g)
31+
GeoInterface.getgeom(::GeoInterface.LineTrait, g::Line, i::Int) = g[i]
32+
33+
GeoInterface.ngeom(::GeoInterface.LineStringTrait, g::LineString) = length(g)
34+
function GeoInterface.getgeom(::GeoInterface.LineStringTrait, g::LineString, i::Int)
35+
return coordinates(g)[i]
36+
end
37+
38+
GeoInterface.ngeom(::GeoInterface.PolygonTrait, g::Polygon) = length(g.interiors) + 1 # +1 for exterior
39+
function GeoInterface.getgeom(::GeoInterface.PolygonTrait, g::Polygon, i::Int)
40+
return i > 1 ? g.interiors[i - 1] : g.exterior
41+
end
42+
43+
GeoInterface.ngeom(::GeoInterface.MultiPointTrait, g::MultiPoint) = length(g)
44+
GeoInterface.getgeom(::GeoInterface.MultiPointTrait, g::MultiPoint, i::Int) = g[i]
45+
46+
function GeoInterface.ngeom(::GeoInterface.MultiLineStringTrait, g::MultiLineString)
47+
return length(g)
48+
end
49+
function GeoInterface.getgeom(::GeoInterface.MultiLineStringTrait, g::MultiLineString,
50+
i::Int)
51+
return g[i]
52+
end
53+
54+
GeoInterface.ngeom(::GeoInterface.MultiPolygonTrait, g::MultiPolygon) = length(g)
55+
GeoInterface.getgeom(::GeoInterface.MultiPolygonTrait, g::MultiPolygon, i::Int) = g[i]
56+
57+
function GeoInterface.ncoord(::GeoInterface.AbstractGeometryTrait,
58+
::Simplex{Dim,T,N,P}) where {Dim,T,N,P}
59+
return Dim
60+
end
61+
function GeoInterface.ncoord(::GeoInterface.AbstractGeometryTrait,
62+
::AbstractGeometry{Dim,T}) where {Dim,T}
63+
return Dim
64+
end
65+
function GeoInterface.ngeom(::GeoInterface.AbstractGeometryTrait,
66+
::Simplex{Dim,T,N,P}) where {Dim,T,N,P}
67+
return N
68+
end
69+
GeoInterface.ngeom(::PolygonTrait, ::Ngon) = 1 # can't have any holes
70+
GeoInterface.getgeom(::PolygonTrait, g::Ngon, _) = LineString(g.points)
71+
72+
GeoInterface.ncoord(::PolyhedralSurfaceTrait, ::Mesh{Dim,T,E,V} where {Dim,T,E,V}) = Dim
73+
GeoInterface.ngeom(::PolyhedralSurfaceTrait, g::AbstractMesh) = length(g)
74+
GeoInterface.getgeom(::PolyhedralSurfaceTrait, g::AbstractMesh, i) = g[i]

test/geointerface.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
@testset "Basic types" begin
2+
point = Point(2, 3)
3+
GeoInterface.testgeometry(point)
4+
5+
mp = MultiPoint([point, point])
6+
GeoInterface.testgeometry(mp)
7+
8+
linestring = LineString(Point{2,Int}[(10, 10), (20, 20), (10, 40)])
9+
GeoInterface.testgeometry(linestring)
10+
11+
multilinestring = MultiLineString([linestring, linestring])
12+
GeoInterface.testgeometry(multilinestring)
13+
14+
poly = Polygon(rand(Point{2,Float32}, 5))
15+
GeoInterface.testgeometry(poly)
16+
17+
triangle = Triangle(point, point, point)
18+
GeoInterface.testgeometry(triangle)
19+
20+
polys = MultiPolygon([poly, poly])
21+
GeoInterface.testgeometry(polys)
22+
end
23+
24+
@testset "Mesh" begin
25+
mesh = triangle_mesh(Sphere(Point3f(0), 1))
26+
GeoInterface.testgeometry(mesh)
27+
end

test/runtests.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ using Test, Random, StructArrays, Tables, StaticArrays, OffsetArrays
22
using GeometryBasics
33
using LinearAlgebra
44
using GeometryBasics: attributes
5+
using GeoInterface
56

67
@testset "GeometryBasics" begin
78

@@ -715,4 +716,8 @@ end
715716
include("fixed_arrays.jl")
716717
end
717718

719+
@testset "GeoInterface" begin
720+
include("geointerface.jl")
721+
end
722+
718723
end # testset "GeometryBasics"

0 commit comments

Comments
 (0)