The examples concern geographic objects belonging to three classes: StreamSection, ForestStand, and Swamp. These classes are assumed part of a schema designated as MS (my schema).
< GeographicObject subclass: ForestStand::MS attributes: majorSpecies String(20) minorSpecies String(20) restricted: position.geometry:Polygon comments: "This is a simple definition suitable as an example." > < GeographicObject subclass: StreamSection::MS attributes: substrate Composition::MS bankFullWidth Real32 restricted: position.geometry:ArcDirected comments: "bankFullWidth is in metres." > < GeographicObject subclass: Swamp::MS restricted: position.geometry:Polygon comments: "Typically a user defined class includes new attributes, but there is no requirement that new attributes be supplied." > < Enumeration subclass: Composition::MS values: gravelly sandy fineGrained comments: "Three options for the composition of the bottom of a stream are available." >
// Here is the OSN for a stream section. Assume that the stream is // represented by a single arc and that it was digitized in a downstream // direction (from North to South for the purposes // of the example). Here and throughout these examples, all arcs are // treated as straight lines between specified points. StreamSection::MS ( position: SpatialObject ( geometry: ArcDirected ( pointList: List { Point ( position: CoordXYZ ( x: 497560 y: 5431050 z: 132 ) ) Point ( position: CoordXYZ ( x: 497575 y: 5431042 z: 123 ) ) Point ( position: CoordXYZ ( x: 497561 y: 5431034 z: 115 ) ) Point ( position: CoordXYZ ( x: 497578 y: 5431028 z: 102 ) ) } ) flowDirection: forward ) substrate: gravelly bankFullWidth: 7.3 ) // If the stream positional data are provided in a downstream direction, then flowDirection need not be given, as // its default value is forward. Next is the OSN for the same stream section, but this time an object identifier is //used and flowDirection is not stated. Also, this time spatial referencing is provided. ArcDirected ( objectIdentifier: *13 pointList: List { Point ( position: CoordXYZ ( x: 497560 y: 5431050 z: 132 ) ) Point ( position: CoordXYZ ( x: 497575 y: 5431042 z: 123 ) ) Point ( position: CoordXYZ ( x: 497561 y: 5431034 z: 115 ) ) Point ( position: CoordXYZ ( x: 497578 y: 5431028 z: 102 ) } ) ) SpatialReferencing ( objectIdentifier: *7 coordSystem: CoordinateSystem ( horizontal: UTM ( zone: 10 hemisphere: north ) ) geodeticReference: GeodeticReferenceSystem ( horizontal: HorizontalReference ( adjustment: nad83 ) vertical: VerticalReference ( adjustment: navd88 ) ) ) StreamSection::MS ( position: SpatialObject ( geometry: *13 spatialReferencing: *7 ) substrate: gravelly bankFullWidth: 7.3 ) // Next we introduce two forest stands, one on the left of the stream and the other on the right of the stream. // The forest stand on the left is defined first. We'll assume that two other arcs have been defined, with object // identifiers (sometimes referred to as oids) specified as *48 and *49. For the moment, ignore the inner // boundary of the area on the left. // Notice that this time oriented arcs are used. Both oriented arcs and oriented paths include a traversal direction, // which by default is assumed to be forward unless otherwise stated. In Figure 4.2 the arrows indicate the // direction of compilation of the points for each arc. For the stand on the left, the three arcs were all captured // such that the area of interest is on the right. SAIF dictates that the arcs on the boundary of a polygon must be // traversed in a right hand fashion; thus, there is no need to change the traversal direction for these arcs when // specifying the forest stand on the left. ForestStand::MS ( position: SpatialObject ( geometry: Polygon ( boundary: OrientedPath ( path: Ring ( arcList: List { OrientedArc ( arc: *48 ) OrientedArc ( arc: *13 ) OrientedArc ( arc: *49 ) } ) ) ) spatialReferencing: *7 ) majorSpecies: Douglas Fir minorSpecies: Grand Fir ) // Now we'll look at the forest stand on the right. Assume that an arc with object identifier *50 has been // previously specified. Note that the traversal direction of the arc with an object identifier of *13 is now in the // opposite direction. ForestStand::MS ( position: SpatialObject ( geometry: Polygon ( boundary: OrientedPath ( path: Ring ( arcList: List { OrientedArc ( arc: *13 traversalDirection: backward ) OrientedArc ( arc: *50 ) } ) ) ) spatialReferencing: *7 ) majorSpecies: Grand Fir minorSpecies: Douglas Fir ) // We'll continue the example by assuming that the forest stand on the left has a hole in the middle of it, // occupied by a swamp. We'll also assign object identifiers to the forest stands and the swamp. Another arc, // with an object identifier equal to *51, is an inner boundary of the forest stand on the left and the (outer) // boundary of the swamp. // First we redefine the forest stand on the left. ForestStand::MS ( objectIdentifier: *1 position: SpatialObject ( geometry: PolygonComplex ( boundary: OrientedPath ( path: Ring ( arcList: List { OrientedArc ( arc: *48 ) OrientedArc ( arc: *13 ) OrientedArc ( arc: *49 ) } ) ) innerBoundaries: Set ( OrientedPath: ( path: Ring ( arcList: List { OrientedArc ( arc: *51 traversalDirection: backward ) } ) ) ) ) spatialReferencing: *7 ) majorSpecies: Douglas Fir minorSpecies: Grand Fir ) Swamp::MS ( objectIdentifier: *3 position: SpatialObject ( geometry: Polygon ( boundary: OrientedPath ( path: Ring ( arcList: List { OrientedArc ( arc: *51 ) } ) ) ) spatialReferencing: *7 ) ) // In the cases described above, sharing of arcs is demonstrated. It is also practical to share the rings, which may // at times be more efficient. Examining the stand on the left and the swamp, two oriented paths can be defined, // each with an object identifier. Ring ( objectIdentifier: *76 arcList: List { OrientedArc ( arc: *48 ) OrientedArc ( arc: *13 ) OrientedArc ( arc: *49 ) } ) Ring ( objectIdentifier: *78 arcList: List { OrientedArc ( arc: *51 ) } ) ForestStand::MS ( objectIdentifier: *1 position: SpatialObject ( geometry: PolygonComplex ( boundary: OrientedPath ( path: *76 ) innerBoundaries: Set { OrientedPath ( path: *78 traversalDirection: backward ) } ) spatialReferencing: *7 ) majorSpecies: Douglas Fir minorSpecies: Grand Fir ) Swamp::MS ( objectIdentifier: *3 position: SpatialObject ( geometry: Polygon ( boundary: OrientedPath ( path: *78 ) ) spatialReferencing: *7 ) ) // As demonstrated above, there are several ways of representing the same data. Making use of extensive // referencing and sharing, as in the last examples, has two advantages: brevity and more explicit information. // This must be balanced against the overhead of tracking references.