class SpatialFeatures::Importers::KML

Private Instance Methods

blank_feature?(feature) click to toggle source
# File lib/spatial_features/importers/kml.rb, line 29
def blank_feature?(feature)
  feature.css('coordinates').text.blank?
end
each_record() { |open_struct(:feature_type => sql_type, :geog => geog, :name => name, :metadata => metadata)| ... } click to toggle source
# File lib/spatial_features/importers/kml.rb, line 8
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)

      geog = geom_from_kml(feature)

      next if geog.blank?

      yield OpenStruct.new(:feature_type => sql_type, :geog => geog, :name => name, :metadata => metadata)
    end
  end
end
extract_extended_data(placemark) click to toggle source
# File lib/spatial_features/importers/kml.rb, line 56
def extract_extended_data(placemark)
  metadata = {}
  placemark.css('ExtendedData SimpleData').each do |node|
    metadata[node['name']] = node.text
  end
  return metadata
end
extract_metadata(placemark) click to toggle source
# File lib/spatial_features/importers/kml.rb, line 46
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
extract_table(placemark) click to toggle source
# File lib/spatial_features/importers/kml.rb, line 64
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
geom_from_kml(kml) click to toggle source
# File lib/spatial_features/importers/kml.rb, line 33
def geom_from_kml(kml)
  geom = nil

  # Do query in a new thread so we use a new connection (if the query fails it will poison the transaction of the current connection)
  Thread.new do
    geom = ActiveRecord::Base.connection.select_value("SELECT ST_GeomFromKML(#{ActiveRecord::Base.connection.quote(kml.to_s)})")
  rescue ActiveRecord::StatementInvalid => e # Discard Invalid KML features
    geom = nil
  end.join

  return geom
end