MapGuide RFC 16 - Elevation and Extrusion Support for KML
This page contains a change request (RFC) for the MapGuide Open Source project. More MapGuide RFCs can be found on the RFCs page.
Status
RFC Template Version | (1.0) |
Submission Date | Feb 23, 2007 |
Last Modified | Chris ClaydonTimestamp |
Author | Chris Claydon |
RFC Status | Adopted |
Implementation Status | completed |
Proposed Milestone | 1.2 |
Assigned PSC guide(s) | Tom Fukushima |
Voting History | March 5, 2007 |
+1 | Tom, Andy, Bruce, Jason, Haris, Paul, Bob |
+0 | |
-0 | |
-1 |
Overview
The purpose of this RFC is to allow MapGuide users to configure elevation and extrusion parameters in a layer definition, and to use those settings to extrude features vertically in the KML generated for consumption by Google Earth. This provides a highly compelling way to visualize spatial data that contains a vertical component.
Motivation
MapGuide currently supports 2D representation of spatial data. However, many spatial data sets contain height information for the features they contain, giving the potential for 2.5D representation. This RFC describes how the MapGuide Layer Definition schema can be extended to specify expressions to be used to calculate a base elevation and extrusion size. Support for 2.5D would initially be implemented by the KML service, allowing visualization of solid objects in Google Earth, though it could be extended to other viewers at a later date. An example of the potential output is shown below:
Proposed Solution
The proposed solution contains modifications to: the Layer Definition XML schema, the MDF Model, the MDF Parser, and the Stylization project.
Layer Definition Schema Modifications
The affected section of the original schema looks like this:
<xs:complexType name="VectorScaleRangeType"> <xs:sequence> <xs:element name="MinScale" type="xs:double" minOccurs="0">... <xs:element name="MaxScale" type="xs:double" minOccurs="0">... <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="AreaTypeStyle" type="AreaTypeStyleType">... <xs:element name="LineTypeStyle" type="LineTypeStyleType">... <xs:element name="PointTypeStyle" type="PointTypeStyleType">... </xs:choice> <xs:element name="ExtendedData1" type="ExtendedDataType" minOccurs="0" /> </xs:sequence> </xs:complexType>
With the proposed changes, it would look like this:
<xs:complexType name="VectorScaleRangeType"> <xs:sequence> <xs:element name="MinScale" type="xs:double" minOccurs="0">... <xs:element name="MaxScale" type="xs:double" minOccurs="0">... <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="AreaTypeStyle" type="AreaTypeStyleType">... <xs:element name="LineTypeStyle" type="LineTypeStyleType">... <xs:element name="PointTypeStyle" type="PointTypeStyleType">... </xs:choice> <xs:element name="ElevationSettings" type="ElevationSettingsType" minOccurs="0" /> <xs:element name="ExtendedData1" type="ExtendedDataType" minOccurs="0" /> </xs:sequence> </xs:complexType> <xs:complexType name="ElevationSettingsType"> <xs:sequence> <xs:element name="ZOffset" type="xs:string" minOccurs="0" /> <xs:element name="ZExtrusion" type="xs:string" minOccurs="0" /> <xs:element name="ZOffsetType" type="ElevationTypeType" minOccurs="0" /> <xs:element name="Unit" type="LengthUnitType"> <xs:element name="ExtendedData1" type="ExtendedDataType" minOccurs="0" /> </xs:sequence> </xs:complexType> <xs:simpleType name="ElevationTypeType"> <xs:annotation> <xs:documentation>The possible interpretations of a ZOffset value.</xs:documentation> </xs:annotation> <xs:restriction base="xs:string"> <xs:enumeration value="RelativeToGround"/> <xs:enumeration value="Absolute"/> </xs:restriction> </xs:simpleType>
Descriptions of the key parameters are given below:
ZOffset | An expression that evaluates to the height of the base of the feature in the units specified in the <Unit> element |
ZExtrusion | An expression that evaluates to the desired vertical extrusion (in specified units) to be applied to the feature |
ZOffsetType | A string value, either "RelativeToGround" or "Absolute", that indicates how to interpret the ZOffset value |
Unit | A string value corresponding to one of the values in the existing LengthUnitType type |
Additional ExtendedData elements have been added to allow for future extensions to this part of the schema.
Example ===
The following XML snippet is taken from the layer definition used to generate the screenshot above:
<VectorLayerDefinition> ... ... <VectorScaleRange> ... ... <ElevationSettings> <ZOffset>0</ZOffset> <ZExtrusion>HEIGHT_AGL</ZExtrusion> <ZOffsetType>RelativeToGround</ZOffsetType> <Unit>Meters</Unit> </ElevationSettings> </VectorScaleRange> </VectorLayerDefinition> </LayerDefinition>
MDF Model and Parser Modifications
The MDF Model would require the addition of the new class: ElevationSettings, corresponding to the <ElevationSettings> elements. Similarly, the MDF Parser would require the new class: IOElevationSettings.
The parser class would be responsible for reading and writing the elevation settings to and from XML. The model class would be used to store and access those settings. The methods implemented by each class would be very simple get/set or read/write functions.
Stylization Modifications
The Stylization project would be modified to make the necessary elevation settings available to the KmlRenderer class that generates KML output for the KML Service. This class would be updated to set the Z coordinate of the generated geometries to be equal to (zOffset + zExtrusion). Also, if zExtrusion > 0, we would write out the KML element <extrude>1</extrude> to indicate that the features should be extruded down to the ground. If zOffset > 0, we will stil extrude the features down to the ground level, since Google Earth does not currently provide a means for rendering floating extruded objects.
Implications
This RFC does not describe any modifications to the GUI tools used to create layer definitions. The elevation settings would need to be configured by manual modification of the layer definition XML files.
There are no changes to the existing public API.
Test Plan
Unit tests should include KML generation for layers that contain elevation settings
Funding/Resources
Autodesk to provide resources / funding.
Attachments (1)
-
KmlExtrusionScreenshot.jpg
(92.5 KB
) - added by 18 years ago.
Screenshot of KML with extrusion in Google Earth
Download all attachments as: .zip