After completing no small amount of refactoring, I’m pleased to announce a new release of Kamelopard, a Ruby gem for generating KML. KML, as with most XML variants, requires an awful lot of typing to write by hand; Kamelopard makes it all much easier by mechanically generating all the repetitive XML bits and letting the developer focus on content. An example of this appears below, but first, here’s what has changed most recently:
- All KML output comes via Ruby’s REXML library, rather than simply as string data that happens to contain XML. This not only makes it much harder for Kamelopard developers to mess up basic syntax, it also allows examination and modification of the KML data using XML standards such as XPath.
- Kamelopard classes now live within a module, preventing namespace collisions. This is important for any large-ish library, and probably should have been done all along. Previous to this, some classes had awfully strange names designed to prevent namespace collisions; these classes have been changed to simpler, more intuitive names now that collisions aren’t a problem.
- Perhaps the biggest change is the incorporation of a large and (hopefully) comprehensive test suite. I’m a fan of test-driven development, but didn’t start off on the right foot with Kamelopard. It originally shipped with a Ruby script that tried a few examples and hoped it didn’t crash; that has been replaced with a full RSpec-based test suite, including tests for each class and in particular, extensive test of the KML output to ensure it meets the KML specification. Run these tests from the Kamelopard source with the command
Now for some code. We recently got a data set containing several thousand locations, describing the movement of an aircraft on final approach and landing, with the request that we turn it into a Google Earth tour, where the viewer would follow the aircraft’s path, flight simulator style. The actual KML result is over 56,000 lines, but the KML code is fairly simple:
require 'rubygems' require 'kamelopard' require 'csv' CSV.foreach(ARGV) do |row| time = row lon = row.to_f lat = row.to_f alt = row.to_f p = Kamelopard::Point.new lon, lat, alt, :absolute c = Kamelopard::Camera.new(p, get_heading, get_tilt, get_roll, :absolute) f = Kamelopard::FlyTo.new c, nil, pause, :smooth end puts Kamelopard::Document.instance.get_kml_document.to_s
Along with some trigonometry and linear algebra to calculate the heading, tilt, and roll, and a CSV file of data points, the script above is all it took; the KML result runs correctly in Google Earth without further modification. Kamelopard has been published to RubyGems.org, so installation is simply
gem install kamelopard
Give it a try!