Sha256: a026dc80b5a0ebe87d62abc5ab32b1ba00374332ad8f399f73b03cffffb348c0

Contents?: true

Size: 1.88 KB

Versions: 6

Compression:

Stored size: 1.88 KB

Contents

require 'ostruct'

module SpatialFeatures
  module Importers
    class KML < Base
      private

      def each_record(&block)
        {'Polygon' => 'POLYGON', 'LineString' => 'LINE', 'Point' => 'POINT'}.each do |kml_type, sql_type|
          Nokogiri::XML(@data).css(kml_type).each do |feature|
            if placemark = feature.ancestors('Placemark').first
              name = placemark.css('name').text
              metadata = extract_metadata(placemark)
            else
              metadata = {}
            end
    
            next if blank_feature?(feature)

            yield OpenStruct.new(:feature_type => sql_type, :geog => geom_from_kml(feature), :name => name, :metadata => metadata)
          end
        end
      end

      def blank_feature?(feature)
        feature.css('coordinates').text.blank?
      end

      def geom_from_kml(kml)
        ActiveRecord::Base.connection.select_value("SELECT ST_GeomFromKML(#{ActiveRecord::Base.connection.quote(kml.to_s)})")
      end

      def extract_metadata(placemark)
        metadata = {}
        metadata.merge! extract_table(placemark)
        metadata.merge! extract_extended_data(placemark)
        metadata.merge! :description => placemark.css('description').text if metadata.empty?
        metadata.delete_if {|key, value| value.blank? }

        return metadata
      end

      def extract_extended_data(placemark)
        metadata = {}
        placemark.css('ExtendedData SimpleData').each do |node|
          metadata[node['name']] = node.text
        end
        return metadata
      end

      def extract_table(placemark)
        metadata = {}
        placemark.css('description').each do |description|
          Nokogiri::XML(description.text).css('html table table td').each_slice(2) do |key, value|
            metadata[key.text] = value ? value.text : ''
          end
        end
        return metadata
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
spatial_features-2.13.0 lib/spatial_features/importers/kml.rb
spatial_features-2.12.3 lib/spatial_features/importers/kml.rb
spatial_features-2.12.2 lib/spatial_features/importers/kml.rb
spatial_features-2.12.1 lib/spatial_features/importers/kml.rb
spatial_features-2.12.0 lib/spatial_features/importers/kml.rb
spatial_features-2.11.1 lib/spatial_features/importers/kml.rb