@base . #GENERAL @prefix : . @prefix geomapi: . @prefix dcterms: . #this has source @prefix owl: . @prefix rdf: . @prefix rdfs: . @prefix xsd: . # literals @prefix vann: . @prefix voaf: . @prefix dbp: . @prefix xml: . # you don't use this #GEOMETRIES @prefix gom: . @prefix geom: . @prefix geo: . # geometries/literals @prefix omg: . #geometries @prefix fog: . # geometries @prefix ifc: . @prefix dggs: . #IMAGES @prefix exif: . @prefix xcr: . #BUILDINGS @prefix bot: . @prefix ifc: . ################################################################# # ONTOLOGY DESCRIPTION ################################################################### rdf:type owl:Ontology , voaf:Vocabulary ; dcterms:modified "2024-01-01T01:01:01"^^xsd:dateTime ; dcterms:issued "2024-01-01T01:01:01"^^xsd:dateTime ; owl:versionInfo "0.0.1" ; owl:versionIRI ; dcterms:title "Geomatics API ontology (GEOMAPI)"@en ; dcterms:description """The Geomatics API ontology (GEOMAPI) is an ontology defining the core concepts of close-range sensing observations. It manage point clouds, imagery, polygonal meshes, BIM and CAD information in relation with the geomapi api (https://github.com/KU-Leuven-Geomatics/geomapi). """ ; dcterms:creator "Maarten Bassier" ; dcterms:creator "Jelle Vermandere" ; dcterms:creator "Heinder De Winter" ; dcterms:creator "Sam De Geyter" ; dcterms:creator ; dcterms:creator ; dcterms:creator ; dcterms:creator ; dcterms:license ; vann:preferredNamespacePrefix "geomapi" ; vann:preferredNamespaceUri ; owl:imports . ################################################################# # DATA TYPES ################################################################# ### https://w3id.org/geomapi#matrix :matrix rdf:type rdfs:Datatype ; rdfs:comment "a python np.array i.e. a 2 X 2 matrix M: \"[[m11,m21],[m12,m22]]\"^^geomapi:matrix"@en ; rdfs:isDefinedBy : ; rdfs:seeAlso gom:rowMajorArray; :method "geomapi.utils.literal_to_matrix"; rdfs:label "Matrix"@en . ### https://w3id.org/geomapi#list :list rdf:type rdfs:Datatype ; rdfs:comment "a python list i.e. a 2 X 2 matrix M: \"[m11,m21,m12,m22]\"^^geomapi:list"@en ; rdfs:isDefinedBy : ; :method "geomapi.utils.literal_to_list"; rdfs:label "List"@en . ### http://www.w3.org/2001/XMLSchema#dateTime xsd:dateTime :method "geomapi.utils.literal_to_datetime" . ### http://www.w3.org/2001/XMLSchema#float xsd:float :method "geomapi.utils.literal_to_float" . ### https://w3id.org/gom#rowMajorArray #gom:rowMajorArray # :method "geomapi.utils.literal_to_matrix". #this is not working #how do we deal with dictionaries? ################################################################# # PROPERTIES differentiate between AnnotationProperty (human info), DatatypeProperty (literals), ObjectProperty (classes) ################################################################## # omg:transformsGeometry ex:globalTransform_1 #is this for an offset? :cartesianTransform rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """The 4x4 transformation matrix."""@en ; rdfs:label "Transformation matrix"@en ; rdfs:seeAlso geo:hasBoundingBox; # this is with lat,long e.g. "MINLAT:40.7644, MAXLAT:40.8005, MINLON:-73.9818, MAXLON:-73.9498" rdfs:domain :Node ; # this properties applies to nodes rdfs:range geomapi:matrix. # this property should be connected to a literal such as xsd:str :convexHull rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """The nx3 matrix with the location "[[u_1,v_1,w_1],....[u_i,v_i,w_1]]" of the 3D bounding points of the convex hull in the resource. Minumum 4 non-coplanar points needed! """@en ; rdfs:seeAlso ; rdfs:label "Convex Hull"@en ; rdfs:domain :Node; rdfs:range geomapi:matrix. :orientedBoundingBox rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """The 9x1 matrix with the parameters (location, rotation, size) in (m) of the Oriented Bounding Box [x,y,z,rx,ry,rz,sx,sy,sz], with rotations applied Rz->Ry->Rz. If it is a relative definition, then its [u,v,w,ru,rv,rw,su,sv,sw]"""@en ; rdfs:seeAlso ; rdfs:label "Oriented Bounding Box"@en ; rdfs:seeAlso geo:hasBoundingBox; rdfs:domain :Node; rdfs:range geomapi:matrix. :path rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """The path to the :resource"""@en ; rdfs:seeAlso ; #there should be similar concepts no? rdfs:label "Path"@en ; rdfs:seeAlso ; #there should be similar concepts no? rdfs:domain :Node; rdfs:range xsd:string. :pointCount rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Number of points in a mesh or point cloud."""@en ; rdfs:label "Number of vertices"@en ; rdfs:domain :Node; rdfs:range xsd:integer. :faceCount rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Number of faces in a polygonal mesh."""@en ; rdfs:label "Number of faces"@en ; rdfs:domain :MeshNode, :BIMNode; rdfs:range xsd:integer. :depth rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Average depth of the image projection. Defaults to 50m."""@en ; rdfs:label "Depth"@en ; rdfs:domain :ImageNode, :PanoNode, :OrthoNode; rdfs:range xsd:float. :focalLength35mm rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """The 35 mm equivalent focal length is a measure of the angle of view for a particular combination of a camera lens and film or image sensor size. Calculated in mm """@en ; rdfs:label "focalLength35mm"@en ; rdfs:domain :ImageNode, :PanoNode; rdfs:seeAlso exif:focalLengthIn35mmFilm; rdfs:range xsd:float. :principalPointU rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """The deviation (in X) from the centerpoint on the image plane onto which the perspective center is projected. Defaults to 0."""@en ; rdfs:label "Principal Point U"@en ; rdfs:domain :ImageNode; rdfs:range xsd:float. :principalPointV rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """The deviation (in Y or vertical) from the centerpoint on the image plane onto which the perspective center is projected. Defaults to 0."""@en ; rdfs:label "Principal Point V"@en ; rdfs:domain :ImageNode; rdfs:range xsd:float. :intrinsicMatrix rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Transformation matrix that converts points from the camera coordinate system to the pixel coordinate system. k= [fx 0 cx] [0 fy cy] [0 0 1] """@en ; rdfs:label "Intrinsic Matrix "@en ; rdfs:domain :ImageNode; rdfs:range geomapi:matrix. :lineCount rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Number of lines in an Open3D LineSet."""@en ; rdfs:label "Number of lines"@en ; rdfs:domain :LineSetNode; rdfs:range xsd:integer. :e57Index rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """E57 file point cloud index."""@en ; rdfs:label "E57 index"@en ; rdfs:domain :PointCloudNode; rdfs:range xsd:integer. :ifcGlobalId # we currently add these as ifc:IfcGloballyUniqueId directly rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """IFC (Industry Foundation Classes) GUID identifier."""@en ; rdfs:label "IFC GUID"@en ; rdfs:domain :BIMNode; rdfs:range xsd:string; rdfs:seeAlso fog:hasIfcId-guid,ifc:IfcGloballyUniqueId. :ifcObjectType # we currently add these as ifc:objectType_IfcObject directly rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """IFC Family type e.g. [Basic Roof:Warm Roof - Concrete, etc.]"""@en ; rdfs:label "IFC ObjectType"@en ; rdfs:domain :BIMNode; rdfs:range xsd:string; rdfs:seeAlso ifc:objectType_IfcObject. :ifcBuildingElement # this is a URI, no definition needed rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """IFCOWL IfcBuildingElement class i.e. [IfcBeam,IfcColumn, etc.]."""@en ; rdfs:label "IfcBuildingElement"@en ; rdfs:domain :BIMNode; rdfs:range xsd:string; rdfs:seeAlso ifc:IfcBuildingElement. :parameter rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Superclass of parameters that are assigned to Nodes, Results or Analyses. should be formatted as "key:value" i.e. a "searchdistance:0.5" ."""@en ; rdfs:label "Parameter"@en ; rdfs:domain :; rdfs:range xsd:string. :accuracy rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Spatial accuracy (m) of a resource."""@en ; rdfs:label "Accuracy"@en ; rdfs:domain :Node; rdfs:range xsd:float; rdfs:seeAlso geo:hasSpatialAccuracy; rdfs:subClassOf :parameter . :probability rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Percentual probability [0:1] of a result."""@en ; rdfs:label "Probability"@en ; rdfs:domain :Result; rdfs:range xsd:float; rdfs:subClassOf :parameter . :method rdf:type owl:DatatypeProperty ; rdf:type owl:FunctionalProperty ; rdfs:comment """Method that was used for an analysis."""@en ; rdfs:label "Method"@en ; rdfs:domain :Analysis; rdfs:range xsd:float; rdfs:subClassOf :parameter . ################################################################# # RELATIONSHIPS -> between classes ################################################################## #from here rdflib cannot parse the ontology! :adjacent rdf:type owl:SymmetricProperty ; rdfs:comment """Geomatics property: The target and source node hull's have a common border in 3D. This is evaluated by comparing the plane equations within the domain of both convex hulls. In the case of a lineset, the line equations will be used instead."""@en ; rdfs:label "Adjacent"@en ; rdfs:seeAlso bot:adjacentElement, dggs:sfTouches; rdfs:domain :Node; rdfs:range :Node; :method """"geomapi.tools.select_nodes_adjacent""". # :overlaps # rdf:type owl:SymmetricProperty ; # rdfs:comment """Geomatics property: Target and source node oriented bounding boxes intersect in 3D."""@en ; # rdfs:label "Overlaps"@en ; # rdfs:seeAlso bot:intersectingElement, # dggs:sfOverlaps, # geo:sfOverlap; # rdfs:domain :Node; # rdfs:range :Node; # :method """"geomapi.tools.select_overlapping_nodes""". :intersects # this goes in two directions rdf:type owl:SymmetricProperty ; rdfs:comment """Geomatics property: Target and source node convex hulls collide geometrically in 3D."""@en ; rdfs:label "Intersects"@en ; rdfs:seeAlso bot:intersectingElement, dggs:sfIntersects, geo:sfIntersects; rdfs:domain :Node; rdfs:range :Node; :method """"geomapi.tools.select_nodes_intersecting_convex_hull""". # rdfs:subPropertyOf :overlaps . :contains rdf:type owl:ObjectProperty ; rdfs:comment """Geomatics property: Target nodes hulls' lies completely within source node convex hull in 3D."""@en ; rdfs:seeAlso bot:containsElement, dggs:sfContains, geo:sfContains ; rdfs:domain :Node; rdfs:range :Node; owl:inverseOf :within ; :method """geomapi.tools.select_nodes_within_boundaries""". # :within # rdf:type owl:ObjectProperty ; # rdfs:comment """Geomatics property: Source node convex hull lies completely within target node convex hull in 3D. This is inverse to the contain statement"""@en ; # rdfs:seeAlso geo:sfWithin, # dggs:sfWithin; # rdfs:domain :Node; # rdfs:range :Node; # :method """geomapi.tools.select_nodes_that_contain_boundaries""". :disjoint # this is an inverse relationship that can also be inferred rdf:type owl:SymmetricProperty ; rdfs:comment """Geomatics property: Source node convex hull does not overlap with the target Nodes' convex hull in 3D."""@en ; rdfs:seeAlso geo:sfDisjoint, dggs:sfDisjoint; rdfs:domain :Node; rdfs:range :Node; owl:inverseOf :overlaps, :intersects, :contains, :within; :method """geomapi.tools.select_nodes_with_overlapping_boundaries""". :derivedFrom # you might use this to shortcut the resultOf and hasResult chain, if you can infer something about a resource that does not really need an analysis rdf:type owl:ObjectProperty ; rdfs:comment """The source node has information that is derived from target Node i.e. a camera Node that has its depthmap raytraced based on a PointCloudNode. Note that this does not have to be part of a resource. Use partOf instead if that is the case."""@en ; rdfs:seeAlso owl:similarAs; rdfs:domain :Node; rdfs:range :Node. :similarAs #redundant rdf:type owl:ObjectProperty ; rdfs:comment """The source and reference Nodes describe the similar content i.e. two separately scanned point clouds of the same scene. This is not a strict relationship that implies that some but not all metadata is shared between both Nodes and that for most applications, using either one will yield te intented result. Use geomapi:sameAs if you a need a more strict relationship."""@en ; rdfs:seeAlso owl:similarAs; rdfs:domain :Node; rdfs:range :Node. :sameAs #strict rdf:type owl:ObjectProperty ; rdfs:comment """The source and reference Nodes are direct mutations of each other i.e. a pointcloud converted to a meshNode or the point cloud colorized by a different scalar field. This is a strict relationship that implies that the metadata is shared between both Nodes and that only one of the Nodes should be used at a time in an application."""@en ; rdfs:seeAlso owl:sameAs, dggs:sfEqual; rdfs:domain :Node; rdfs:range :Node; rdfs:subPropertyOf :similarAs. :partOf rdf:type owl:ObjectProperty ; rdfs:comment """Geomatics property: Source Node is a part of the target Node. Depending whether Absolute or a Relative copy, the metadata or the data itself is inherited."""@en ; rdfs:seeAlso omg:isPartOfGeometry, geo:partOf; rdfs:domain :Node; rdfs:range :Node, :AbsolutePart, :RelativePart. :hasPart rdf:type owl:ObjectProperty ; rdfs:comment """Geomatics property: Source Node is the origin of the target Node. Depending whether Absolute or a Relative copy, the metadata or the data itself is inherited."""@en ; rdfs:seeAlso geo:GeometryCollection, bot:hasSubElement; rdfs:domain :Node; rdfs:range :setNode; owl:inverseOf :partOf . :resultOf rdf:type owl:ObjectProperty ; rdfs:comment """Relationship from a geomapi:Result to a geomapi:Analysis."""@en ; rdfs:domain :Node; rdfs:range :Analysis. :hasResult rdf:type owl:ObjectProperty ; rdfs:comment """Relationship from a geomapi:Node to a geomapi:Result."""@en ; rdfs:domain :Node; rdfs:range :Result. ################################################################# # CLASSES ################################################################# :Node rdf:type owl:Class ; rdfs:seeAlso geo:SpatialObject; #any spatial phenomenon rdfs:label "Node"@en ; rdfs:comment """Archetype of all geomapi resource classes. Defines a set of Geospatial metadata e.g. the cartesian transform of a geomatics resource e.g. a geolocated image or a point cloud. Each node definition is tied to specific GEOMAPI python functionality."""@en ; dbp:extension ".TTL" ; rdfs:isDefinedBy : . :SetNode rdf:type owl:Class ; rdfs:subClassOf :Node ; rdfs:label "SetNode"@en ; rdfs:comment """setNode is a metadata collection of several data Nodes defined by a 3DBox, 3Dhull and cartesianTransform. It is used to easly select groups of resource Nodes and jointly transform them."""@en ; rdfs:isDefinedBy : ; rdfs:seeAlso geo:GeometryCollection . #any spatial phenomenon :PointCloudNode rdf:type owl:Class ; rdfs:subClassOf :Node ; rdfs:label "PointCloudNode"@en ; rdfs:comment """PointCloudNode connecting the RDF graph, point cloud resource and metadata with geospatial methods."""@en ; dbp:extension ".PCD", ".E57",".PTS", ".PLY",".LAS",".LAZ"; rdfs:isDefinedBy : ; owl:disjointWith :MeshNode, :LineSetNode, :BIMNode, :ImageNode, :OrthoNode, :PanoNode . :MeshNode rdf:type owl:Class ; rdfs:subClassOf :Node ; rdfs:label "MeshNode"@en ; rdfs:comment """MeshNode connecting the RDF graph, mesh resource and metadata with geospatial methods."""@en ; dbp:extension ".OBJ",".PLY",".FBX" ; rdfs:isDefinedBy : ; owl:disjointWith :PointCloudNode, :LineSetNode, :BIMNode , :ImageNode, :OrthoNode, :PanoNode . :LineSetNode rdf:type owl:Class ; rdfs:subClassOf :Node ; rdfs:label "LineSetNode"@en ; rdfs:comment """LineSetNode connecting the RDF graph, lineset resources and metadata with geospatial methods."""@en ; dbp:extension ".PLY",".DXF",".TFW" ; rdfs:isDefinedBy : ; owl:disjointWith :PointCloudNode, :MeshNode, :BIMNode , :ImageNode, :OrthoNode, :PanoNode . :BIMNode rdf:type owl:Class ; rdfs:subClassOf :Node ; rdfs:label "BIMNode"@en ; rdfs:comment """BIMNode connecting the RDF graph, ifc geometries and metadata with geospatial methods."""@en ; dbp:extension ".PLY",".DXF",".TFW" , ".IFC", ".OBJ", ".FBX"; rdfs:isDefinedBy : ; rdfs:seeAlso bot:Element; owl:disjointWith :PointCloudNode, :MeshNode, :LineSetNode , :ImageNode, :OrthoNode, :PanoNode . :ImageNode rdf:type owl:Class ; rdfs:subclassof :node ; rdfs:label "ImageNode"@en ; rdfs:comment """ImageNode connecting the RDF graph, pinhole camera parameters, image and metadata with geospatial methods."""@en ; dbp:extension ".JPG", ".PNG", ".JPEG",".TIF"; rdfs:isdefinedby : ; owl:disjointWith :PointCloudNode, :MeshNode, :BIMNode, :LineSetNode, :OrthoNode, :PanoNode . :OrthoNode rdf:type owl:Class ; rdfs:subClassOf :Node ; rdfs:label "OrthoNode"@en ; rdfs:comment """OrthoNode connecting the RDF graph, orthomosaic image projection parameters, and metadata with geospatial methods."""@en ; dbp:extension ".JPG", ".PNG", ".JPEG",".TIF"; rdfs:isDefinedBy : ; owl:disjointWith :PointCloudNode, :MeshNode, :BIMNode, :LineSetNode, :ImageNode, :PanoNode . :PanoNode rdf:type owl:Class ; rdfs:subClassOf :Node ; rdfs:label "PanoNode"@en ; rdfs:comment """PanoNode connecting the RDF graph, panoramic image projection parameters, and metadata with geospatial methods."""@en ; dbp:extension ".JPG", ".PNG", ".JPEG",".TIF"; rdfs:isDefinedBy : ; owl:disjointWith :PointCloudNode, :MeshNode, :BIMNode, :LineSetNode , :ImageNode, :OrthoNode . :RelativePart rdf:type owl:Class ; rdfs:label "RelativePart"@en ; rdfs:comment """RelativePart is an undeep copy of a part of a resource defined by a 2DBox,2DHull,3DBox or 3Dhull. It is used to store subselections without copying the data."""@en ; rdfs:isDefinedBy : ; rdfs:seeAlso omg:isPartOfGeometry, geo:partOf. #aren't these relationships? :AbsolutePart rdf:type owl:Class ; rdfs:subClassOf :Node ; rdfs:label "AbsolutePart"@en ; rdfs:comment """AbsolutePart is a deep copy of a part of a resource and thus has its own resource. It is used to store parts of a resource that have been altered or manipulated."""@en ; rdfs:isDefinedBy : ; rdfs:seeAlso omg:isPartOfGeometry, geo:partOf. #aren't these relationships? #waar zijn de classes voor multi-modality -> je zou moeten kunnen switchen tussen classes #waar zijn de classes voor multi-temporality -> je zou gemakkelijk time-series moeten kunnen construeren :Analysis rdf:type owl:Class ; rdfs:label "Analysis"@en ; rdfs:comment """Geospatial analysis. This URI contains the parameters of the analysis and which nodes have contributed to the analysis."""@en ; rdfs:isDefinedBy : . :Result rdf:type owl:Class ; rdfs:label "Result"@en ; rdfs:comment """Result of a geospatial analysis. This URI contains the results of the analysis and which node it is assigned to."""@en ; rdfs:isDefinedBy : .