Working with Google Earth's KML format in Julia.
This package takes inspiration from Python's simplekml package.
file = KMLFile(
Document(
Features = [
Placemark(
Geometry = Point(coordinates=(77.0369, 38.9072)),
name = "Washington, D.C."
)
]
)
)
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Document>
<Placemark>
<name>Washington, D.C.</name>
<Point>
<coordinates>77.0369,38.9072</coordinates>
</Point>
</Placemark>
</Document>
</kml>
path = download("https://developers.google.com/kml/documentation/KML_Samples.kml")
file = read(path, KMLFile)
KML.write(filename::String, kml_file) # Write to file
KML.write(io::IO, kml_file) # Write to IO stream
KML.write(kml_file) # String
This package is designed to be used intuitively alongside Google's KML Reference Page. Thus, there are rules that guide the mapping between KML (XML) Objects and Julia structs.
- In Julia, each
Object
is constructed with keyword arguments only. - Keywords are the associated attributes as well as child elements of the
Object
- E.g.
pt = Point(id="mypoint", coordinates=(0,1))
sets theid
attribute andcoordinates
child element.
- E.g.
- Every keyword has a default value (most often
nothing
). They can be set after construction.- E.g.
pt.coordinates = (2, 3)
- E.g.
- If a child element is itself an
Object
, the keyword matches the type name.- E.g.
pl = Placemark(); pl.Geometry = Point()
. Here, aPlacemark
can hold anyGeometry
, which is an abstract type. APoint
is a subtype ofGeometry
.
- E.g.
- Some
Object
s can hold several children of the same type. Fields with plural names expect aVector
.- E.g.
mg = MultiGeometry(); mg.Geometries = [Point(), Polygon()]
- E.g.
- Enum types are in the
KML.Enums
module. However, you shouldn't need to create them directly as conversion is handled for you/helpful error messages are provided.
julia> pt.altitudeMode = "clamptoground"
ERROR: altitudeMode ∉ clampToGround, relativeToGround, absolute
- Google extensions (things with
gx:
in the name) replace:
with_
.- E.g.
gx:altitudeMode
→gx_altitudeMode
- E.g.
Fields
≡≡≡≡≡≡≡≡
id :: Union{Nothing, String}
targetId :: Union{Nothing, String}
name :: Union{Nothing, String}
visibility :: Union{Nothing, Bool}
open :: Union{Nothing, Bool}
atom_author :: Union{Nothing, String}
atom_link :: Union{Nothing, String}
address :: Union{Nothing, String}
xal_AddressDetails :: Union{Nothing, String}
phoneNumber :: Union{Nothing, String}
Snippet :: Union{Nothing, KML.Snippet}
description :: Union{Nothing, String}
AbstractView :: Union{Nothing, KML.AbstractView} # Camera or LookAt
TimePrimitive :: Union{Nothing, KML.TimePrimitive} # TimeSpan or TimeMap
styleURL :: Union{Nothing, String}
StyleSelector :: Union{Nothing, KML.StyleSelector} # Style or StyleMap
region :: Union{Nothing, KML.Region}
ExtendedData :: Union{Nothing, KML.ExtendedData}
Schemas :: Union{Nothing, Vector{KML.Schema}} # Multiple Schemas allowed
Features :: Union{Nothing, Vector{KML.Feature}} # Multiple Features (abstract type) allowed