iso19107-spatialschema
TRANSCRIPT
ISO19107 Geographic information – Spatial schema
Pusan National UniversityDept. of Computer EngineeringSpatiotemporal Database Lab.
Joon-Seok [email protected]
2
Outline
• Introduction• Schema
– Geometry• Geometry root• Geometry primitive• Coordinate geometry• Geometry aggregate• Geometry complex
– Topology• Topology root• Topology primitive• Topology complex
• Summary
3
Introduction
• ISO19107– Providing conceptual schemas for describing
and manipulating the spatial characteristic– Formal language
• Unified Modeling Language (UML) ISO19103
– Vector geometry and topology up to 3-D– Spatial operations
• For use in access, query, management, processing, and data exchange of geographic information
4
ISO 19107 Spatial Schema
ISO 19132 Location Based Services Reference Model
M
ISO 19115-2 Metadata - Imagery
ISO 19137 General ly Used Profiles
M
ISO 19134 MultiModal Navigation
M
ISO 19123 Coverages
M
ISO 19133 Tracking and Navigation
M
ISO 19141 Moving Features
M
ISO 19116 Positioning Services
M
ISO 19115 Metadata
M
ISO 06709
M
ISO 19112 Location by Identifier
M
ISO 19130 Sensor and data models for imagery and gridded data
M
ISO 19108 Temporal
M
ISO 19109 Rules for Application Schema
M
ISO 19111 Spatial Referencing by Coordinates
M
M
ISO 19144 Classi fication
M
ISO 19144-1 Classification Systems
M
M
Package Clients of ISO19107
5
ISO 19107 Spatial Schema
ISO 19103 Conceptual Schema Language
M
ISO 19111 Spatial Referencing by Coordinates
M
Package Suppliers of ISO19107
6
Topology<<normative>>
Geometry<<normative>>
Basic Types
(from ISO 19103 Conceptual Schema Language)
Main Diagram of ISO19107 Spatial Schema
Geometry
8
Geometric primitiv e<<Leaf >>
+ Bearing+ GM_Curv e
+ GM_Curv eBoundary+ GM_Curv eInterpolation
+ GM_Curv eSegment+ GM_OrientableCurv e
+ GM_OrientablePrimitiv e+ GM_OrientableSurf ace
+ GM_Point+ GM_Primitiv e
+ GM_Primitiv eBoundary+ GM_Ring+ GM_Shell+ GM_Solid
+ GM_SolidBoundary+ GM_Surf ace
+ GM_Surf aceBoundary+ GM_Surf aceInterpolation
+ GM_Surf acePatch
Geometric complex<<Leaf >>
+ GM_Complex+ GM_ComplexBoundary
+ GM_Composite+ GM_CompositeCurv e+ GM_CompositePoint+ GM_CompositeSolid
+ GM_CompositeSurf ace
Coordinate geometry<<Leaf >>
+ DirectPosition+ GM_Af f inePlacement
+ GM_Arc+ GM_ArcBy Bulge
+ GM_ArcString+ GM_ArcStringBy Bulge
+ GM_BSplineCurv e+ GM_BSplineSurf ace
+ GM_BSplineSurf aceForm+ GM_Bezier
+ GM_BicubicGrid+ GM_BilinearGrid
+ GM_Circle+ GM_Clothoid
+ GM_Cone+ GM_Conic
+ GM_CubicSpline+ GM_Cy linder+ GM_Env elope
+ GM_GenericCurv e+ GM_GenericSurf ace
+ GM_Geodesic+ GM_GeodesicString+ GM_GriddedSurf ace
+ GM_Knot+ GM_KnotTy pe
+ GM_LineSegment+ GM_LineString
+ GM_Of f setCurv e+ GM_ParametricCurv eSurf ace
+ GM_Placement+ GM_PointArray+ GM_PointGrid+ GM_PointRef+ GM_Poly gon
+ GM_Poly hedralSurf ace+ GM_Poly nomialSpline
+ GM_Position+ GM_Sphere
+ GM_SplineCurv e+ GM_SplineCurv eForm
+ GM_Tin+ GM_Triangle
+ GM_TriangulatedSurf ace+ Transf initeSet<DirectPosition>
Geometry root<<Leaf >>
+ GM_Boundary+ GM_Object
Geometric aggregates<<Leaf >>
+ GM_Aggregate+ GM_MultiCurv e+ GM_MultiPoint
+ GM_MultiPrimitiv e+ GM_MultiSolid
+ GM_MultiSurf ace
Geometry Packages
9
GM_Aggregate<<Type>>
GM_Object<<Type>>
GM_MultiPoint<<Type>>
GM_MultiCurve<<Type>>
GM_MultiSurface<<Type>>
GM_MultiSolid<<Type>>
GM_MultiPrimitive<<Type>>
GM_Surface<<Type>>
GM_Curve<<Type>>
GM_CompositePoint<<Type>>
GM_Point<<Type>>
GM_CompositeSolid<<Type>>
GM_Solid<<Type>>
GM_OrientablePrimitive(from Geometric primitive)
<<Type>>
GM_Complex<<Type>>
GM_Composite<<Type>>
GM_Primitive<<Type>>
GM_OrientableCurve(f rom Geometric primitiv e)
<<Type>>GM_CompositeCurve
<<Type>>
GM_CompositeSurface<<Type>>
GM_OrientableSurface(f rom Geometric primitiv e)
<<Type>>
Geometry basic classes
10
Basic Concept
Geometry object
Infinite set of points
PointLineRectangle…
Point set theory
11
Concept of Interior, Exterior and Boundary
U
Boundary
Interior
Exterior
Interior U Boundary= Closure
12
Boundary and Dimension
Dim. Boundary Example
Point 0 Empty
Curve 1 Point
Surface 2 Curve
Solid 3 Surface
13
Simple and Cycle
s e
s es
e
s e
(a) (b) (c) (d)
simple cycle
(a), (b), (d) (d)
14
TransfiniteSet<DirectPosition>(from Coordinate geometry)
<<Interface>> {dimension() > boundary().dimension}{boundary().notEmpty() implies boundary().dimension() = dimension() -1}{boundary().isEmpty() = isCycle()}
GM_Aggregate(from Geometric aggregates)
<<Type>>
GM_Object
mbRegion() : GM_ObjectrepresentativePoint() : DirectPositionboundary() : GM_Boundaryclosure() : GM_ComplexisSimple() : BooleanisCycle() : Booleandistance(geometry : GM_Object) : Distancedimension(point : DirectPosition = NULL) : IntegercoordinateDimension() : IntegermaximalComplex() : Set<GM_Complex>transform(newCRS : SC_CRS) : GM_Objectenvelope() : GM_Envelopecentroid() : DirectPositionconvexHull() : GM_Objectbuffer(radius : Distance) : GM_Object
<<Type>>
0..*
+element
0..*
SC_CRS(from Coordinate Reference Systems)
<<Type>>
0..*
0..1
+object
0..*
+CRS0..1
Coordinate Reference System
GM_Primitive(from Geometric primitive)
<<Type>>GM_Complex
(from Geometric complex)
<<Type>>
GM_Object
15
convexHull() and buffer()
convexHull() buffer (radius: d)
d
16GM_Ring<<Type>>
GM_PrimitiveBoundary<<Abstract>>
GM_Boundary(from Geometry root)
<<Abstract>>
GM_ComplexBoundary(from Geometric complex)
<<Type>>
{isCycle() = TRUE}
GM_Point<<Type>>
GM_CurveBoundary<<Type>>
1
0..*
+startPoint
1
0..*
1
0..*
+endPoint
1
0..*
GM_Ring<<Type>>
GM_SurfaceBoundary<<Type>>
0..*
1
+interior
0..*
1
0..1
1
+exterior
0..1
1
GM_Shell<<Type>>
GM_Complex(from Geometric complex)
<<Type>>
GM_Shell<<Type>>
GM_SolidBoundary<<Type>>
0..1
1
+exterior
0..1
1
0..*
1
+interior
0..*
1
GM_CompositeSurface(from Geometric complex)
<<Type>>GM_CompositeCurve(from Geometric complex)
<<Type>>
{isSimple() = TRUE}{isCycle() = TRUE}
Geometry Boundary Data Types
17
The Number of Exterior of GM_SurfaceBoundary
x
y
x
z
y
2-Dimension plane
1 exterior
3-Dimension surface
0 exterior
18
GM_Object(from Geometry root)
<<Type>>
GM_Solid<<Type>>
GM_Point<<Type>>
{dimension() >= cotainedPrimitive.dimension()}
GM_Curve<<Type>>
GM_Surface<<Type>>
GM_OrientableCurve<<Type>>
GM_OrientableSurface<<Type>>
GM_OrientablePrimitive<<Type>>GM_Complex
(from Geometric complex)
<<Type>>
GM_Primitive<<Type>>
0..*
1..*
+complex 0..*
+element
1..*Complex
0..*
0..*
+containingPrimitive0..*
Interior to
+containedPrimitive
0..*
GM_Primitive
Geometric Primitive
20
GM_Primitive<<Type>>
GM_Point
position : DirectPosition
boundary() : NULLbearing(toPoint : GM_Position) : BearingGM_Point(position : GM_Position) : GM_Point
<<Type>>
Bearing
angle[0,1,2] : Angledirection[0..1] : Vector
<<DataType>>
-- at least one value is not NULL{angle.isEmpty{} implies Not direction.isEmpty()}{direction.isEmpty{} implies Not angle.isEmpty()}
GM_Point
21
Concept of Orientation
s
e
For curves,direction in which the curve is traversed
When used as bounding curves,“left” of oriented curve
For surfaces,Z-axis that would form a right-handed system
When used as bounding surfaces,“below” the surface
“+” “-”
“-”
“+”
22
GM_OrientableSurface
boundary() : GM_SurfaceBoundary
<<Type>>
GM_Primitive<<Type>>
GM_OrientablePrimitive
orientation : Sign
<<Type>>
1
0,2
+primitive1
+proxy
0,2
Oriented
GM_OrientableCurve
boundary() : GM_CurveBoundary...
<<Type>>
GM_Surface<<Type>>
{primitive = self}{orientation = "+"}
GM_Curve<<Type>>
{(orientation = "+") implies (primitive = self )}
{primitive.isTypeOf(GM_Curve)} {primitive.isTypeOf(GM_Surface)}
GM_OrientedPrimitive
23
GM_Curve
GM_GenericCurve(from Coordinate geometry)
<<Interface>>
GM_CurveSegment<<Abstract>>
GM_Curve
GM_Curve(segment[1..*] : GM_CurveSegment) : GM_Curve
<<Type>>
1..*
0..1
+segment1..*{sequence}
+curve 0..1
Segmentation
GM_OrientableCurve
boundary() : GM_CurveBoundary...
<<Type>>
GM_OrientablePrimitive<<Type>>
GM_Primitive<<Type>>
24
GM_GenericSurface(from Coordinate geometry)
<<Interface>>
GM_OrientableSurface
boundary() : GM_SurfaceBoundary
<<Type>>
GM_SurfacePatch<<Abstract>>
GM_Surface
GM_Surface(patch[1..*] : GM_SurfacePatch) : GM_SurfaceGM_Surface(bdy : GM_SurfaceBoundary) : GM_Surface
<<Type>>
1..*
0..1
+patch 1..*
+surface 0..1
Segmentation
GM_OrientablePrimitive<<Type>>
GM_Primitive<<Type>>
GM_Surface
25
GM_Primitive<<Type>>
GM_Solid
boundary() : GM_SolidBoundaryarea() : Areavolume() : VolumeGM_Solid(boundary : GM_SolidBoundary) : GM_Solid
<<Type>>
GM_Solid
Coordinate Geometry
27
{coordinateReferenceSystem.dimension = coordinate.size = dimension}
if not populated, then the NameSpace of the datatype determines the CRS, e.g. the CRS of the including GM_Object
GM_Envelope
upperCorner : DirectPositionlowerCorner : DirectPosition
<<DataType>>
GM_Position
direct : DirectPositionindirect : GM_PointRef
<<Union>>
GM_Point(from Geometric primitive)
<<Type>>
GM_PointRef<<DataType>>
1
0..*
+point 1
0..*
GM_Position<<Union>>
GM_PointArray<<DataType>>
0..1j : Integer
+column
0..1j : IntegerGM_PointGrid
<<DataType>>
0..1i : Integer
+row
0..1i : Integer
row.column.count is constant
DirectPosition
coordinate : Sequence<Number>/ dimension : Integer
<<DataType>>
SC_CRS(from Coordinate Reference Systems)
<<Type>>
0..*
0..1
+directPosition0..*
+CRS 0..1
Coordinate Reference System
DirectPosition
28
GM_Arc<<Ty pe>>
GM_ArcStringByBulge<<Ty pe>>
GM_ArcString<<Ty pe>>
GM_CurveInterpolation
lineargeodesiccircularArc3PointscircularArc2PointWithBulgeell ipticalclothoidconicpolynomialSplinecubicSplinerationalSpline
(f rom Geometric primitiv e)
<<CodeList>>
GM_Geodesic<<Ty pe>>
GM_GeodesicString<<Ty pe>>
GM_LineSegment<<Ty pe>>
GM_SplineCurve<<Ty pe>>
GM_Clothoid<<Ty pe>>
GM_Conic<<Ty pe>>
GM_CubicSpline<<Ty pe>>
GM_BSplineCurve<<Ty pe>>
GM_PolynomialSpline<<Ty pe>>
GM_LineString<<Ty pe>>
GM_GenericCurve
startPoint() : DirectPositionendPoint() : DirectPositionparam(s : Distance) : DirectPositiontangent(s : Distance) : VectorstartParam() : DistanceendParam() : DistanceparamForPoint(p : DirectPosition) : Set<Distance>, DirectPositionconstrParam(cp : Real) : DirectPositionstartConstrParam() : RealendConstrParam() : Reallength(point1 : GM_Position, point2 : GM_Position) : Lengthlength(cparam1 : Real, cparam2 : Real) : LengthasLineString(spacing : Distance, offset : Distance) : GM_LineString
<<Interf ace>>
GM_Circle<<Ty pe>>
GM_Bezier<<Ty pe>>
GM_Curve(f rom Geometric primitiv e)
<<Ty pe>>
GM_OffsetCurve<<Ty pe>>
GM_CurveSegment(from Geometric primitive)
<<Abstract>>
1..*
0..1
+segment1..*
{sequence}
+curve0..1
Segmentation
0..*
1
0..*
+baseCurv e
1
Curve segment classes
29
GM_CurveSegment(from Geometric primitive)
<<Abstract>>
GM_LineSegment
GM_LineSegment(point [2] : GM_Position) : GM_LineSegment...
<<Type>>
GM_GeodesicString
controlPoint : GM_PointArray
GM_GeodesicString(points[2..*] : GM_Position) : GM_GeodesicString...asGM_Geodesic() : Sequence<GM_Geodesic>
<<Type>>
GM_Geodesic
GM_Geodesic(point [2] : GM_Position) : GM_Geodesic...
<<Type>>
GM_LineString
controlPoint : GM_PointArray
GM_LineString(points[2..*] : GM_Position) : GM_LineString...asGM_LineSegment() : Sequence<GM_LineSegment>
<<Type>>
{interpolation = "geodesic"}
--all points in the controlPoint sequence are colinear --all points in the controlPoint sequence lie on the same geodesic
{interpolation = "linear"}
Linear and Geodetic Interpolation
30
GM_CurveSegment(from Geometric primit ive)
<<Abstract>>
GM_ArcString
numArc : IntegercontrolPoints : GM_PointArray
GM_ArcString(point[3,5,7,..] : GM_Position) : GM_ArcStringasGM_Arc() : Sequence<GM_Arc>
<<Type>>
GM_Arc
GM_Arc(point[3] : GM_Position) : GM_ArcGM_Arc(point[2] : GM_Position, bulge : Real, normal : Vector) : GM_Arccenter() : DirectPositionradius() : DistancestartOfArc() : BearingendOfArc() : Bearing
<<Type>>
GM_ArcStringByBulge
bulge : Sequence<Real>numArc : Integernormal : Sequence<Vector>
GM_ArcStringByBulge(point[2..n] : GM_Position, bulge[1..n] : Real , normal[1..n] : Vector) : GM_ArcStringByBulgeasGM_ArcString() : GM_ArcString
<<Type>>
GM_Circle
GM_Circle(point[3] : GM_Position) : GM_CircleGM_Circle(center : GM_Position, radius : Distance) : GM_Circle
<<Type>>
{interpolation = "circularArc3Points"}{controlPoints.count = 2*numArc +1
{interpolation = "circularArc2PointWithBulge"}{bulge.count = normal.count = numArc}
-- all points in the controlPoint sequence are on the same circle
-- the first and last points in the controlPoint sequence are the same
GM_ArcByBulge
GM_ArcByBulge(point[2] : GM_Position, bulge : Real, normal : Vector) : GM_ArcByBulge
<<Type>>
-- all arc are on the sa...
Arcs
31
GM_AffinePlacement
location : GM_PositionrefDirection[1..*] : Vector
inDimension() : IntegeroutDimesion() : Integertransform(in : Vector) : Vector
<<Type>>
GM_Placement
inDimension() : IntegeroutDimesion() : Integertransform(in : Vector) : Vector
<<Interface>>
GM_Conic
position : GM_AffinePlacementshifted : Booleaneccentricity : RealsemiLatusRectum : RealstartConstrParam : RealendConstrParam : Real
<<Type>>
GM_CurveSegment(from Geometric primitive)
<<Abstract>>
{interpolation = "conic"} {refDirection->dimension = outDimension}{refDirection.count = inDimension}
Conics and placements
32
GM_SplineCurveForm
polylineFormcircularArcellipticArcparabolicArchyperbolicArc
<<CodeList>>GM_KnotType
uniformquasiUniformpiecewiseBezier...
<<CodeList>>
GM_Knot
value : Realmultiplicity : Integer...weight : Real
<<DataType>>
GM_SplineCurve
degree : Integerknot : Sequence<GM_Knot>controlPoints : GM_PointArray...
<<Type>>GM_PolynomialSpline
vectorAtStart : Sequence<Vector>...vectorAtEnd : Sequence<Vector>
<<Type>>GM_CubicSpline
<<Type>>
GM_BSplineCurve
curveForm[0..1] : GM_SplineCurveFormknotSpec[0..1] : GM_KnotTypeisPolynomial : Boolean
GM_BSplineCurve(deg : Integer, pts : GM_PointArray, k[0,1] : Sequence<GM_Knot>, ks[0,1] : GM_KnotType) : GM_BSplineCurve...
<<Type>>
GM_Clothoid
refLocation : GM_AffinePlacement...scaleFactor : NumberstartParameter : RealendParameter : Real
<<Type>>
{degree > 0}{interpolation = "polynomialSpline"}{vectorAtEnd.count = vectorAtStart.count...
{degree = 3}{interpolation = "cubicSpline"}
GM_CurveSegment(from Geometric primitive)
<<Abstract>>
GM_OffsetCurve
distance : LengthrefDirection[0..1] : Vector...
<<Type>>
1
0..*
+baseCurve1
0..*
{interpolation = clothoid}
{(interpolation = "polynomialSpline") OR (interpolation = "rationalSpline)}
GM_Bezier<<Type>>
{degree = controlPoint.count -1}{interpolation = "polynomial"}
Spline and specialty curves
33
GM_SurfaceInterpolation
noneplanarsphericalellipticalconictinparametricCurvepolynomialSplinerationalSplinetriangulatedSpline
(from Geometric primitive)
<<CodeList>>
GM_GriddedSurface<<Type>>
GM_BilinearGrid<<Type>>
GM_BicubicGrid<<Type>>
GM_ParametricCurveSurface<<Type>>
GM_Cylinder<<Type>>
GM_Cone<<Type>>
GM_Sphere<<Type>>
GM_Tin<<Type>>
GM_BSplineSurface<<Type>>
GM_TriangulatedSurface<<Type>>
GM_Triangle<<Type>>
GM_GenericSurfaceupNormal(point : DirectPosition) : Vectorperimeter() : Lengtharea() : Area
<<Interface>>
GM_Surface(from Geometric primitive)
<<Type>>
GM_SurfacePatch
interpolation : GM_SurfaceInterpolation = "planar"numDerivativesOnBoundary[0..1] : Integer = 0
boundary() : GM_SurfaceBoundary
(from Geometric primitive)
<<Abstract>>
GM_PolyhedralSurface<<Type>>
GM_Polygon<<Type>>
Surface patches
34
GM_PolyhedralSurface
GM_PolyhedralSurface(tiles[1..*] : GM_Polygon) : GM_PolyhedralSurface
<<Type>>
GM_Polygon
boundary : GM_SurfaceBoundaryspanningSurface[0..1] : GM_Surface
GM_Polygon(boundary : GM_SurfaceBoundary) : GM_PolygonGM_Polygon(boundary : GM_SurfaceBoundary, spanSurf : GM_Surface) : GM_Polygon
<<Type>>
0..1 1..*
+surface
0..1
+patch
1..*Segmentation
GM_TriangulatedSurface<<Type>>
GM_Triangle
corners[3] : GM_Position
<<Type>>0..1 1..*
+surface
0..1
+patch
1..*Segmentation
-- the spanni...
GM_Tin
stopLines : Set<GM_LineString>breakLines : Set<GM_LineString>maxLength : DistancecontrolPoint[3..*] : GM_Position
GM_Tin(post : Set<GM_Position>, stopLines : Set<GM_LineString>, breakLines : Set<GM_LineString>, maxLength : Number) : GM_Tin
<<Type>>
GM_SurfacePatch
interpolation : GM_SurfaceInterpolation = "planar"numDerivativesOnBoundary[0..1] : Integer = 0
boundary() : GM_SurfaceBoundary
(from Geometric primitive)
<<Abstract>>
GM_Surface
GM_Surface(patch[1..*] : GM_SurfacePatch) : GM_SurfaceGM_Surface(bdy : GM_SurfaceBoundary) : GM_Surface
(from Geometric primitive)
<<Type>>
1..*0..1
+patch
1..*
+surface
0..1
Segmentation
subset
subset
Polygonal surface
35
TIN construction
36
GM_GriddedSurface
controlPoint : GM_PointGrid/ rows : Integer/ columns : Integer
<<Type>>
GM_BilinearGrid<<Type>>
GM_BicubicGrid
horiVectorAtStart : Sequence<Vector>horiVectorAtEnd : Sequence<Vector>vertVectorAtStart : Sequence<Vector>vertVectorAtEnd : Sequence<Vector>
<<Type>>
GM_Cyl inder<<Type>>
GM_Cone<<Type>>
GM_Sphere<<Type>>
GM_BSplineSurface
degree[1,2] : Integerknot[2] : Sequence<GM_Knot>knotSpec : GM_KnotTypesurfaceForm : GM_BSplineSurfaceFormisPolynomial : Boolean
GM_BSplineSurface(pts : GM_PointGrid, deg[1,2] : Integer, k[0,2] : Sequence<GM_Knot>, ks[0,1] : GM_KnotType) : GM_BSpl ineSurface
<<Type>>
GM_Knot
value : Realmultipl ici ty : Integerweight : Real
<<DataType>>
GM_BSplineSurfaceForm
planarcyl indricalconicalsphericaltoroidalunspecified
<<CodeList>>
{horizontalCurveType = verticalCurveType = "l inear"
{horizontalCurveType = verticalCurveType = "cubicSpl ine"}{numDerivativesOnBoundary = 2}
{horizontalCurveType = "conic"}{verticalCurveType = "linear"}
{horizontalCurveType = " conic"}{verticalCurveType = "linear"}
{horizontalCurveType = "circularArc3Point...
{horizontalCurveType = " polynomialSpine" OR horizontalCurveType = "rationalSpine" }{ verticalCurveType = " polynomialSpine" OR verticalCurveType = "rationalSpine" }
GM_ParametricCurveSurface
horizontalCurveType : GM_CurveInterpolationverticalCurveType : GM_CurveInterpolation
horizontalCurve(t : Real) : GM_CurveverticalCurve(s : Real) : GM_Curvesurface(s : Real, t : Real) : DirectPosition
<<Type>>
{interpolation = " parametricCurve"}
GM_ParmetricCurveSurface and its subtypes
Geometric AggregateGeometric Complex
38
GM_MultiPrimitive<<Type>>
GM_MultiCurve
/ length : Length
<<Type>>GM_MultiSurface
/ area : Area/ perimeter : Length
<<Type>>
GM_MultiPoint
/ position : Set<DirectPosition>
<<Type>>GM_MultiSolid
/ volume : Volume/ area : Area
<<Type>>
GM_Object(from Geometry root)
<<Type>>
{element.subTypeOf(GM_Point)}
{element.subTypeOf(GM_OrientableCurve)}
{element.subTypeOf(GM_OrientableSurface)}
{element.subTypeOf(GM_Solid)}
{elements.subTypeOf(GM_Primitive)}
GM_Object(from Geometry root)
<<Type>>GM_Aggregate
fromSet(set : Set<GM_Object>) : GM_Aggregate
<<Type>>
0..*
+element
0..*
GM_Aggregate
39
--All primitives in the generator are in the complex (as a set of primitives){Set::element->includesAll(generator)}
-- a complex is closed under the boundary operation {subComplex includes boundary()}GM_Object
(from Geometry root)
<<Type>>
GM_Composite<<Type>>
GM_Complex
isMaximal() : Boolean
<<Type>>
0..*
0..*
+subComplex0..*
Contains
+superComplex0..*
GM_Primitive(from Geometric primitive)
<<Type>>
1..*0..*
+generator
1..*
+composite
0..*Composition
0..*
1..*
+complex0..*
+element1..*
Complex
subset
GM_Complex
40
GM_Solid(from Geometric primitive)
<<Type>>
GM_CompositeSolid<<Type>>
1..*
0..*
+generator
1..*
+composite
0..*
Composition
GM_CompositePoint<<Type>>
GM_Point(from Geometric primitive)
<<Type>>
0..*
1
+composite
0..*
+generator
1
Composition
GM_OrientableSurface(from Geometric primitive)
<<Type>>
GM_CompositeSurface<<Type>>
1..*
0..*
+generator
1..*
+composite
0..*
Composition
GM_CompositeCurve<<Type>>
GM_OrientableCurve(from Geometric primitive)
<<Type>>
0..*
1..*
+composite
0..*
+generator
1..*
{sequence}
Composition
{dimension() = generator.dimension()}GM_Complex<<Type>>
GM_Composite<<Type>>
GM_Primitive(from Geometric primi tive)
<<Type>>
0..*
1..*+composite
0..*
+generator1..*Composition
CM_Composite
Topology
42
Concept of Topology
• Topology– Deal with characteristics of geometric figures
that remain invariant if the space is deformed elastically and continuously
– E.g. connectivity of an n-dimensional graph
43
Topology root<<Leaf>>
+ TP_Object
Topological primitive<<Leaf>>
+ TP_Boundary+ TP_ComplexBoundary
+ TP_DirectedTopo+ TP_DirectedEdge+ TP_DirectedFace+ TP_DirectedNode+ TP_DirectedSolid
+ TP_Edge+ TP_EdgeBoundary
+ TP_Expression+ TP_ExpressionTerm
+ TP_Face+ TP_FaceBoundary
+ TP_Node+ TP_Primitive
+ TP_PrimitiveBoundary+ TP_Ring+ TP_Shell+ TP_Solid
+ TP_SolidBoundary
Topological Complex<<Leaf>>
+ TP_Complex
Topology packages
44
TP_Expression<<DataType>>
TP_Object<<Interface>>
TP_DirectedNode<<Type>>
TP_Edge<<Type>>
TP_Node<<Type>>
TP_DirectedEdge<<Type>>
TP_Face<<Type>>
TP_DirectedSolid<<Type>>
TP_Solid<<Type>>
TP_DirectedFace<<Type>>
TP_DirectedTopo<<Type>>
TP_Primitive<<Type>>
TP_Complex<<Type>>
1..* 1..*
+element
1..*
+complex
1..*
Complex
Topological class diagram
45
TP_Object(from Topology root)
<<Interface>>
{geometry.complex -> includesAll complex.geometry}
GM_Object(from Geometry root)
<<Type>>
TP_Primitive(from Topological primitive)
<<Type>>TP_Complex
(from Topological Complex)
<<Type>>
1..*
1..*
+superComplex1..*
/Contains
+subComplex1..*1..* 1..*
+element
1..*
+complex1..*Complex
GM_Primitive(from Geometric primitive)
<<Type>>
0..*
0..1
+topology 0..*
+geometry0..1
Realization
GM_Complex(from Geometric complex)
<<Type>> 0..*
0..*
+subComplex0..* Contains
+superComplex
0..*
0..1
0..1
+topology0..1
+geometry 0..1
Realization
1..*
0..*+element
1..* +complex
0..*
Complex
Relation between geometry and topology
46
{boundary().dimension() = dimension() - 1}
TP_Object
dimension() : Integerboundary() : TP_BoundarycoBoundary() : Set<TP_DirectedTopo>interior() : Set<TP_Primitive>closure() : Set<TP_Primitive>exterior() : Set<TP_Primitive>maximalComplex() : TP_Complex
<<Interface>>
TP_Complex(from Topological Complex)
<<Type>>TP_Primitive
(from Topological primi tive)
<<Type>>
TP_Object
47
TP_DirectedSolid<<Type>>
TP_Solid<<Type>> 1
2+topo
1 +proxy
2
Center
TP_DirectedFace<<Type>>
1..*
0..22
+boundary1..*
+primitive
0..22
Boundary
TP_Face<<Type>>
2
1 +proxy
2+topo
1Center
TP_DirectedEdge<<Type>>
1..*
0..*
+boundary1..*
+primitive0..*
Boundary
TP_Node<<Type>>
TP_Edge<<Type>>
2
1 +proxy
2+topo
1 Center
TP_DirectedNode<<Type>>
2
1 +proxy
2+topo
1Center
0..*
2
+primitive0..*
+boundary
2Boundary
TP_DirectedNode<<Type>>
TP_Node<<Type>> 2
1 +proxy
2+topo
1
Center
TP_DirectedEdge<<Type>>
1
0..*
+hub1
+spoke0..*
CoBoundary
TP_Edge<<Type>> 2
1 +proxy
2+topo
1
Center
TP_Solid<<Type>>
TP_DirectedFace<<Type>>
0..*
1..*
+spoke
0..*
{CircularSequence}
+hub1..*
CoBoundary
TP_DirectedSolid<<Type>>
1
2+topo
1 +proxy
2Center
TP_Face<<Type>> 2
1 +proxy
2+topo
1
Center
0..22
1..*
+spoke
0..22
+hub1..*
CoBoundary
Boundary and coboundary operation
48
TP_PrimitiveBoundary<<DataType>>
TP_FaceBoundary
exterior[0..1] : TP_Ringinterior[0..*] : TP_Ring
<<DataType>>TP_SolidBoundary
exterior[0..1] : TP_Shellinterior[0..*] : TP_Shell
<<DataType>>
TP_Shell<<DataType>>
TP_Ring<<DataType>>
TP_EdgeBoundary
startNode : TP_DirectedNodeendNode : TP_DirectedNode
<<DataType>>
TP_Boundary<<DataType>>
TP_ComplexBoundary<<DataType>>
TP_Expression<<DataType>>
{isCycle()} {isCycle()} {isSimple()}{isConnected()} {support().dimension() = 1}
{isCycle()} {isSimple()}{isConnected()} {support().dimension() = 2}
{support().dimension() = 0} {support().dimension() = 1} {support().dimension() = 2}
Boundary relation data types
49
-- topological dimension agrees with geometric dimension{geometry->forAll(geometry.dimension() = dimension())}-- basic geometric operation are preserved{complex.geometry->forAll(element->includes(geometry))}{boundary().asTP_Primitive().geometry = geometry.boundary()}-- isolated topology is codimension at least 2{coincidentSubelement.dimension() < dimension() -1}-- a primitive is its own positive TP_DirectedTopo{asTP_DirectedTopo(+) = self}
TP_Object(from Topology root)
<<Interface>>GM_Primitive
(from Geometric primitive)
<<Type>>
TP_Complex(from Topological Complex)
<<Type>>TP_Primitive
asTP_DirectedTopo(orientation : Sign) : TP_DirectedTopodimension() : Integerboundary() : TP_BoundarycoBoundary() : Set<TP_DirectedTopo>interior() : Set<TP_Primitive>closure() : Set<TP_Primitive>exterior() : Set<TP_Primitive>maximalComplex() : TP_Complex
<<Type>>
0..1
0..*
+geometry
0..1
+topology
0..*
Realization
0..*0..1 +isolated0..*
Isolated In
+container0..11..*
1..*
+element 1..*
+complex 1..*
Complex
1
+maximalComplex
1
TP_Primitive
50
TP_DirectedTopo subclasses
TP_Solid<<Type>>
TP_DirectedSolid<<Type>>
1
2
+topo1
+proxy 2
Center
TP_DirectedFace<<Type>>
TP_Face<<Type>>
2
1
+proxy 2
+topo1
Center
TP_DirectedEdge<<Type>>
TP_Edge<<Type>>
2
1
+proxy 2
+topo1
Center
TP_DirectedNode<<Type>>
TP_Node<<Type>>
2
1
+proxy 2
+topo1
Center
{orientation = "+" implies topo = self}
TP_Primitive<<Type>>
TP_DirectedTopo<<Type>>
1
2
+topo 1
+proxy 2
Center
{primitive = self}{orientation = "+"}
TP_DirectedTopo
orientation : Sign = "+"
negate() : TP_DirectedTopoasTP_Expression() : TP_Expression
<<Type>>
51
TP_Primitive<<Type>>
TP_DirectedTopo<<Type>>
1
2
+topo1
+proxy
2
Center
TP_DirectedNode<<Type>>
TP_Node
boundary() : NULL
<<Type>>
1
2
+topo
1
+proxy
2
Center
TP_DirectedEdge<<Type>>
1
0..*
+hub1
+spoke
0..*CoBoundary
subset
TP_Node
52
TP_Primitive<<Type>>
TP_DirectedTopo<<Type>>
1
2
+topo1
+proxy
2
Center
TP_DirectedFace<<Type>>
TP_DirectedNode<<Type>>
TP_Edge
boundary() : TP_EdgeBoundary...
<<Type>>
1..*
0..*
+hub 1..*
+spoke
0..*
{CircularSequence}CoBoundary
2
0..*
+boundary2
+primitive
0..* Boundary
TP_DirectedEdge<<Type>>
1
2
+topo1
+proxy2
Center
subset
TP_Edge
53
TP_Primitive<<Type>>
TP_DirectedTopo<<Type>>
1
2
+topo1
+proxy
2Center
TP_DirectedSolid<<Type>>
TP_DirectedFace<<Type>>
TP_Face<<Type>>
1..*
0..2
+hub 1..*
+spoke
0..2CoBoundary
1
2
+topo1
+proxy
2
Center
TP_DirectedEdge<<Type>>
0..* 1..*+primitive
0..*+boundary 1..*
Boundary
subset
TP_Face
54
TP_Primitive<<Type>>
TP_DirectedTopo<<Type>>
1
2
+topo1
+proxy
2Center
TP_DirectedSolid<<Type>>
TP_Solid
boundary() : TP_SolidBoundary
<<Type>>
2
1
+proxy
2
+topo1
Center
TP_DirectedFace<<Type>>
0..2
1..*
+primitive
0..2
+boundary1..*
Boundary
subset
TP_Solid
55
TP_Expression
TP_Expression(dt : TP_DirectedTopo) : TP_ExpressionTP_Expression(sdt : Set<TP_DirectedTopo>) : TP_Expressionplus(s : TP_Expression) : TP_Expressionminus(s : TP_Expression) : TP_Expressionnegate() : TP_ExpressionisZero() : BooleanisCycle() : Booleanboundary() : TP_ExpressioncoBoundary() : TP_Expressionequals(s : TP_Expression) : Booleansupport() : TP_Complex
<<DataType>>
TP_DirectedTopo
orientation : Sign = "+"
negate() : TP_DirectedTopoasTP_Expression() : TP_Expression
<<Type>>
TP_ExpressionTerm
coefficient : Integer = 1
<<DataType>>
1
0..*
+expression
1
+term0..*
Terms
1 0..*
+variable
1
+term
0..*Variable
TP_Expression
56
TP_Object(from Topology root)
<<Interface>>
-- the maximalComplex contains this complex{superComplex->contains(maximalComplex)}-- a maximal complex is contained only in itself{(self = maximalComplex) implies (superComplex = {self}) }{isMaximal() implies (self = maximalComplex)}
TP_Primitive(from Topological primitive)
<<Type>>
GM_Complex(from Geometric complex)
<<Type>>
TP_Complex
isMaximal() : BooleanisConnected() : Booleanboundary() : TP_ComplexBoundaryTP_Complex(GC : GM_Complex) : TP_Complexdimension() : IntegercoBoundary() : Set<TP_DirectedTopo>interior() : Set<TP_Primitive>closure() : Set<TP_Primitive>exterior() : Set<TP_Primitive>maximalComplex() : TP_Complex
<<Type>>
1..* 1..*+superComplex1..*
/Contains
+subComplex1..*
1..* 1..*
+element
1..*
+complex
1..*Complex
0..10..1
+topology
0..1
+geometry
0..1 Realization
1 +maximalComplex1
TP_Complex
Summary
58
Geometric primitive<<Leaf>>
(from Geometry)Geometric complex
<<Leaf>>
(from Geometry)
Coordinate geometry<<Leaf>>
(from Geometry)
Geometry root<<Leaf>>
(from Geometry)Geometric aggregates
<<Leaf>>
(from Geometry)
Topological primitive<<Leaf>>
(from Topology)
Topology root<<Leaf>>
(from Topology)
Topological Complex<<Leaf>>
(from Topology)
Geometry and Topology Packages
59
GM_Aggregate<<Type>>
GM_Object<<Type>>
GM_MultiPoint<<Type>>
GM_MultiCurve<<Type>>
GM_MultiSurface<<Type>>
GM_MultiSolid<<Type>>
GM_MultiPrimitive<<Type>>
GM_Surface<<Type>>
GM_Curve<<Type>>
GM_CompositePoint<<Type>>
GM_Point<<Type>>
GM_CompositeSolid<<Type>>
GM_Solid<<Type>>
GM_OrientablePrimitive(from Geometric primitive)
<<Type>>
GM_Complex<<Type>>
GM_Composite<<Type>>
GM_Primitive<<Type>>
GM_OrientableCurve(f rom Geometric primitiv e)
<<Type>>GM_CompositeCurve
<<Type>>
GM_CompositeSurface<<Type>>
GM_OrientableSurface(f rom Geometric primitiv e)
<<Type>>
Geometry basic classes
60GM_Ring<<Type>>
GM_PrimitiveBoundary<<Abstract>>
GM_Boundary(from Geometry root)
<<Abstract>>
GM_ComplexBoundary(from Geometric complex)
<<Type>>
{isCycle() = TRUE}
GM_Point<<Type>>
GM_CurveBoundary<<Type>>
1
0..*
+startPoint
1
0..*
1
0..*
+endPoint
1
0..*
GM_Ring<<Type>>
GM_SurfaceBoundary<<Type>>
0..*
1
+interior
0..*
1
0..1
1
+exterior
0..1
1
GM_Shell<<Type>>
GM_Complex(from Geometric complex)
<<Type>>
GM_Shell<<Type>>
GM_SolidBoundary<<Type>>
0..1
1
+exterior
0..1
1
0..*
1
+interior
0..*
1
GM_CompositeSurface(from Geometric complex)
<<Type>>GM_CompositeCurve(from Geometric complex)
<<Type>>
{isSimple() = TRUE}{isCycle() = TRUE}
Geometry Boundary Data Types
61
TP_Expression<<DataType>>
TP_Object<<Interface>>
TP_DirectedNode<<Type>>
TP_Edge<<Type>>
TP_Node<<Type>>
TP_DirectedEdge<<Type>>
TP_Face<<Type>>
TP_DirectedSolid<<Type>>
TP_Solid<<Type>>
TP_DirectedFace<<Type>>
TP_DirectedTopo<<Type>>
TP_Primitive<<Type>>
TP_Complex<<Type>>
1..* 1..*
+element
1..*
+complex
1..*
Complex
Topological class diagram
62
TP_Object(from Topology root)
<<Interface>>
{geometry.complex -> includesAll complex.geometry}
GM_Object(from Geometry root)
<<Type>>
TP_Primitive(from Topological primitive)
<<Type>>TP_Complex
(from Topological Complex)
<<Type>>
1..*
1..*
+superComplex1..*
/Contains
+subComplex1..*1..* 1..*
+element
1..*
+complex1..*Complex
GM_Primitive(from Geometric primitive)
<<Type>>
0..*
0..1
+topology 0..*
+geometry0..1
Realization
GM_Complex(from Geometric complex)
<<Type>> 0..*
0..*
+subComplex0..* Contains
+superComplex
0..*
0..1
0..1
+topology0..1
+geometry 0..1
Realization
1..*
0..*+element
1..* +complex
0..*
Complex
Relation between geometry and topology
Spatial Examples from ISO19107
64
Geometric objects in a 2-D CRS
65
P1 = GM_Point < position = < 1.00, 5.00 > >P2 = GM_Point < position = < 3.00, 5.00 > >P3 = GM_Point < position = < 3.00, 2.00 > >P4 = GM_Point < position = < 1.75, 2.75 > >P5 = GM_Point < position = < 1.50, 4.50 > >P6 = GM_Point < position = < 2.00, 3.25 > >P7 = GM_Point < position = < 5.00, 4.00 > >
66
CS1 = GM_CurveSegment <controlPoint = <P1,P2>, interpolation = “linear” >CS2 = GM_CurveSegment <controlPoint = <P2,P3 >, interpolation = “linear” >CS3 = GM_CurveSegment <controlPoint = <P2,(6,5),(6,2),P3>, interpolation = “linear” >CS4 = GM_CurveSegment <controlPoint = <P1,(1,2), P3> , interpolation = “linear” >CS5 = GM_CurveSegment <controlPoint = <P5,(1.9,4.25), (2,4)> interpolation = “arc”>CS6 = GM_CurveSegment <controlPoint = <(2,4),P6>, interpolation = “linear” >CS7 = GM_CurveSegment <controlPoint = <P7,(4.25,4),(4.25,3.25),(5,3.25),P7 >,interpolation =“linear”>
67
C1 = GM_Curve segments = <CS1>C2 = GM_Curve segments = <CS2>C3 = GM_Curve segments = <CS3>C4 = GM_Curve segments = <CS4>C5 = GM_Curve segments = <CS5, CS6>C6 = GM_Curve segments = <CS7>
68
S0 = GM_Surface patch = <GM_Polygon interior = << C1, C3, -C4 >> >S1 = GM_Surface patch = <GM_Polygon exterior = < C4, -C2, -C1 >, interior = << C5, -C5 >> >S2 = GM_Surface patch = <GM_Polygon exterior = < -C3, C2 >,interior = << -C6 >> >S3 = GM_Surface patch = <GM_Polygon exterior = < C6 > >
69
Lake = AreaFeature featureType=“Hydrography::WaterBody”, extent = S3RoadCenterline = LineFeature featureType = “Transportation::Road”, centerline = C2RoadArea = RoadCenterLine.centerline.buffer < distance = 10m >RoadExtent = AreaFeature featureType = “LandCover::Road”, extent = RoadAreaRoadInstance = ComplexFeature featureType = “LandUse::Road”,featureComponents = {RoadCenterline, RoadArea }Trail = LineFeature featureType = “CulturalFacilities::HikingTrail”, centerline = C5School = PointFeature featureType = “CulturalFacilities::School”, Location = P4