cleder/fastkml

Refactor geometry.Polygon

Closed this issue · 1 comments

A Polygon is expressed in KML as:

<Polygon id="ID">
  <!-- specific to Polygon -->
  <extrude>0</extrude>                       <!-- boolean -->
  <tessellate>0</tessellate>                 <!-- boolean -->
  <altitudeMode>clampToGround</altitudeMode>
        <!-- kml:altitudeModeEnum: clampToGround, relativeToGround, or absolute -->
        <!-- or, substitute gx:altitudeMode: clampToSeaFloor, relativeToSeaFloor -->
  <outerBoundaryIs>
    <LinearRing>
      <coordinates>...</coordinates>         <!-- lon,lat[,alt] -->
    </LinearRing>
  </outerBoundaryIs>
  <innerBoundaryIs>
    <LinearRing>
      <coordinates>...</coordinates>         <!-- lon,lat[,alt] -->
    </LinearRing>
  </innerBoundaryIs>
</Polygon>

Normalize fastkml.geometry.Polygon to take parameters shell and holes:

class Polygon(_Geometry):
    def __init__(
        self,
        *,
        ns: Optional[str] = None,
        name_spaces: Optional[Dict[str, str]] = None,
        id: Optional[str] = None,
        target_id: Optional[str] = None,
        extrude: Optional[bool] = None,
        tessellate: Optional[bool] = None,
        altitude_mode: Optional[AltitudeMode] = None,
        shell: Optional[Shell] = None,
        holes: Iterable[Holes] = None,
        geometry: geo.Polygon,
    ) -> None:

Shell should be a BaseObject, or XMLObject which takes a fastkml.geometry.LinearRing as kml_geometry parameter
Holes should be a BaseObject, or XMLObject which takes an Iterable[fastkml.geometry.LinearRing] as kml_geometry parameter

Tag name to be overwritten for Shell as

    @classmethod
    def get_tag_name(cls) -> str:
         return 'outerBoundaryIs'

and similar for Holes

Then it should be possible to use the registry and remove the custom etree_element and _get_geometry methods.

see also: #316