diff options
| author | Luc Donnet | 2013-07-05 17:17:49 +0200 |
|---|---|---|
| committer | Luc Donnet | 2013-07-05 17:17:49 +0200 |
| commit | e3aab2a4851eb84fa3993637e78cd4b21b04e1fa (patch) | |
| tree | 2b6586214d2d60ec96fef814b98ddee4bd8c292f | |
| parent | eec54db17585f6c1e7354dcd8cf37749527071f1 (diff) | |
| download | chouette-core-e3aab2a4851eb84fa3993637e78cd4b21b04e1fa.tar.bz2 | |
Add kml export for lines network and company
| -rw-r--r-- | Gemfile | 3 | ||||
| -rw-r--r-- | Gemfile.lock | 8 | ||||
| -rw-r--r-- | app/exporters/chouette/kml/exporter.rb | 68 | ||||
| -rw-r--r-- | app/exporters/chouette/kml/line_exporter.rb | 10 | ||||
| -rw-r--r-- | app/exporters/chouette/kml/route_exporter.rb | 25 | ||||
| -rw-r--r-- | app/exporters/chouette/kml/stop_area_exporter.rb | 28 | ||||
| -rw-r--r-- | app/models/export.rb | 13 | ||||
| -rw-r--r-- | app/models/kml_export.rb | 11 | ||||
| -rw-r--r-- | app/views/api/kml/lines/show.kml.erb | 58 | ||||
| -rw-r--r-- | app/views/api/kml/routes/show.kml.erb | 55 | ||||
| -rw-r--r-- | app/views/api/kml/stop_areas/_stop_area.kml.erb | 83 | ||||
| -rw-r--r-- | app/views/api/kml/stop_areas/index.kml.erb | 72 | ||||
| -rw-r--r-- | spec/exporters/chouette/kml/exporter_spec.rb | 28 | ||||
| -rw-r--r-- | spec/models/export_spec.rb | 2 |
14 files changed, 381 insertions, 83 deletions
@@ -38,6 +38,7 @@ gem "modernizr-rails", "~> 2.0.6" # Format Output gem 'json' +gem 'rubyzip', :require => 'zip/zip' # Controller gem 'inherited_resources' @@ -46,7 +47,7 @@ gem 'inherited_resources' gem 'will_paginate', '~> 3.0' gem 'ransack' gem 'squeel' -gem 'ninoxe', :git => 'git://github.com/dryade/ninoxe.git' +gem 'ninoxe', :path => "/home/luc/projects/ninoxe" #:git => 'git://github.com/dryade/ninoxe.git' #gem 'ninoxe', '0.1.2' gem 'acts_as_list', '0.1.6' gem "acts_as_tree-1.8", '1.1.0', :require => "acts_as_tree" diff --git a/Gemfile.lock b/Gemfile.lock index cfb7ca0ba..7ef6c78e2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -13,9 +13,8 @@ GIT nokogiri (= 1.5.10) rgeo (= 0.3.20) -GIT - remote: git://github.com/dryade/ninoxe.git - revision: 6aeb68e174b35f70c368997282923f95f0d31299 +PATH + remote: /home/luc/projects/ninoxe specs: ninoxe (0.1.2) activerecord (~> 3.1) @@ -100,7 +99,7 @@ GEM coffee-script-source execjs coffee-script-source (1.3.3) - dbf (2.0.4) + dbf (2.0.5) fastercsv (~> 1.5.4) delayed_job (3.0.3) activesupport (~> 3.0) @@ -371,6 +370,7 @@ DEPENDENCIES remarkable (~> 4.0.0.alpha4) remarkable_activerecord (~> 4.0.0.alpha4) rspec-rails (~> 2.0) + rubyzip sass-rails (~> 3.2.3) shoulda-matchers sqlite3 diff --git a/app/exporters/chouette/kml/exporter.rb b/app/exporters/chouette/kml/exporter.rb index e033317d2..29fcac879 100644 --- a/app/exporters/chouette/kml/exporter.rb +++ b/app/exporters/chouette/kml/exporter.rb @@ -1,10 +1,64 @@ -class Chouette::Kml::Exporter - def export(file, options = {}) - if options.include?(:line) - Chouette::Kml::LineExporter.new( options[:line]).tap do |line_exporter| - line_exporter.save(file) - end - end +class Chouette::Kml::Exporter + + def initialize() + + end + + def lines(object, ids) + if object == "network" + Chouette::Network.find( ids ).collect(&:lines) + elsif object == "company" + Chouette::Company.find( ids ).collect(&:lines) + elsif object == "line" + Chouette::Line.find( ids ).to_a + else + [] + end end + + def export(zip_file_path, options = {}) + + begin + FileUtils.rm(zip_file_path) if File.exists? zip_file_path + + Dir.mktmpdir{ |temp_dir| + + lines_collected = lines( options[:o], options[:id] ) + lines_collected.each do |line| + Chouette::Kml::LineExporter.new( line ).tap do |line_exporter| + line_exporter.save(temp_dir) + end + end + + routes = lines_collected.collect(&:routes).flatten.uniq + routes.each do |route| + Chouette::Kml::RouteExporter.new( route ).tap do |route_exporter| + route_exporter.save(temp_dir) + end + end + + stop_areas = lines_collected.collect(&:stop_areas).flatten.uniq + puts stop_areas.inspect + Chouette::Kml::StopAreaExporter.new( stop_areas ).tap do |stop_area_exporter| + stop_area_exporter.save(temp_dir, "stop_areas") + end + + commercial_stop_areas = lines_collected.collect(&:commercial_stop_areas).flatten.uniq + Chouette::Kml::StopAreaExporter.new( commercial_stop_areas ).tap do |stop_area_exporter| + stop_area_exporter.save(temp_dir, "commercial_stop_areas") + end + + ::Zip::ZipFile.open(zip_file_path, ::Zip::ZipFile::CREATE) do |zipfile| + Dir[File.join(temp_dir, '*.kml')].each do |f| + zipfile.add(File.basename(f), f) + end + end + } + ensure + # Always cleanup files + #FileUtils.remove_entry(temp_directory) + end + end + end diff --git a/app/exporters/chouette/kml/line_exporter.rb b/app/exporters/chouette/kml/line_exporter.rb index f74912a22..2359bb072 100644 --- a/app/exporters/chouette/kml/line_exporter.rb +++ b/app/exporters/chouette/kml/line_exporter.rb @@ -11,10 +11,14 @@ class Chouette::Kml::LineExporter ERB.new(@template).result(binding) end - def save(file) - File.open(file, "w+") do |f| + def kml_name + "/line_#{line.id}.kml" + end + + def save(directory) + File.open(directory + kml_name , "w+") do |f| f.write(render) - end + end if line.present? end end diff --git a/app/exporters/chouette/kml/route_exporter.rb b/app/exporters/chouette/kml/route_exporter.rb new file mode 100644 index 000000000..44327f8c8 --- /dev/null +++ b/app/exporters/chouette/kml/route_exporter.rb @@ -0,0 +1,25 @@ +class Chouette::Kml::RouteExporter + include ERB::Util + attr_accessor :route, :template + + def initialize(route) + @route = route + @template = File.open('app/views/api/kml/routes/show.kml.erb' ){ |f| f.read } + end + + def render() + ERB.new(@template).result(binding) + end + + def kml_name + "/line_#{route.line_id}_route_#{route.id}.kml" + end + + def save(directory) + File.open(directory + kml_name , "w+") do |f| + f.write(render) + end if route.present? + end +end + + diff --git a/app/exporters/chouette/kml/stop_area_exporter.rb b/app/exporters/chouette/kml/stop_area_exporter.rb new file mode 100644 index 000000000..990e18c32 --- /dev/null +++ b/app/exporters/chouette/kml/stop_area_exporter.rb @@ -0,0 +1,28 @@ +class Chouette::Kml::StopAreaExporter + include ERB::Util + attr_accessor :stop_areas, :template + + def initialize(stop_areas) + @stop_areas = stop_areas + @template = File.open('app/views/api/kml/stop_areas/index.kml.erb' ){ |f| f.read } + end + + def render() + ERB.new(@template).result(binding) + end + + def kml_name + "stop_areas" + end + + def file_extension + ".kml" + end + + def save(directory, name = nil) + File.open(directory + "/" + (name || kml_name) + file_extension, "w+") do |f| + f.write(render) + end if stop_areas.present? + end +end + diff --git a/app/models/export.rb b/app/models/export.rb index d8c7820be..566b0c435 100644 --- a/app/models/export.rb +++ b/app/models/export.rb @@ -137,10 +137,13 @@ class Export < ActiveRecord::Base end def self.format_name(format) - name_by_format = { "NeptuneExport" => "Neptune", - "CsvExport" => "CSV", - "GtfsExport" => "GTFS", - "NetexExport" => "NeTEx"} + name_by_format = { + "NeptuneExport" => "Neptune", + "CsvExport" => "CSV", + "GtfsExport" => "GTFS", + "NetexExport" => "NeTEx", + "KmlExport" => "KML" + } name_by_format[format] end @@ -149,7 +152,7 @@ class Export < ActiveRecord::Base subclasses.map(&:to_s) else # FIXME - %w{NeptuneExport CsvExport GtfsExport NetexExport} + %w{NeptuneExport CsvExport GtfsExport NetexExport KmlExport} end end diff --git a/app/models/kml_export.rb b/app/models/kml_export.rb new file mode 100644 index 000000000..83218a09f --- /dev/null +++ b/app/models/kml_export.rb @@ -0,0 +1,11 @@ +class KmlExport < Export + + def export_options + super.merge(:format => :kml) + end + + def exporter + exporter ||= ::Chouette::Kml::Exporter.new() + end + +end diff --git a/app/views/api/kml/lines/show.kml.erb b/app/views/api/kml/lines/show.kml.erb index 936801266..7f123874c 100644 --- a/app/views/api/kml/lines/show.kml.erb +++ b/app/views/api/kml/lines/show.kml.erb @@ -1,27 +1,47 @@ <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> - <% @line.commercial_stop_areas.each do |stop_area| %> - <Placemark id="<%= stop_area.objectid %>" > - <name><%= stop_area.name %></name> - <stop_area_type><%= stop_area.area_type.underscore %></stop_area_type> - <%= (stop_area.position or stop_area.default_position).kml_representation.html_safe %> - </Placemark> - <% end %> + <name><%= @line.name %></name> <Placemark id="<%= @line.objectid %>" > - <objectid><%= @line.objectid %></objectid> - <object_version><%= @line.object_version %></object_version> - <creation_time><%= @line.creation_time %></creation_time> - <creator_id><%= @line.creator_id %></creator_id> <name><%= @line.name %></name> - <number><%= @line.number %></number> - <published_name><%= @line.published_name %></published_name> - <transport_mode_name><%= @line.transport_mode_name %></transport_mode_name> - <registration_number><%= @line.registration_number %></registration_number> - <comment><%= @line.comment %></comment> - <mobility_restricted_suitability><%= @line.mobility_restricted_suitability %></mobility_restricted_suitability> - <int_user_needs><%= @line.int_user_needs %></int_user_needs> - + <ExtendedData> + <Data name="object_id"> + <value><%= @line.objectid %></value> + </Data> + <Data name="object_version"> + <value><%= @line.object_version %></value> + </Data> + <Data name="creation_time"> + <value><%= @line.creation_time %></value> + </Data> + <Data name="creator_id"> + <value><%= @line.creator_id %></value> + </Data> + <Data name="name"> + <value><%= @line.name %></value> + </Data> + <Data name="number"> + <value><%= @line.number %></value> + </Data> + <Data name="published_name"> + <value><%= @line.published_name %></value> + </Data> + <Data name="transport_mode_name"> + <value><%= @line.transport_mode_name %></value> + </Data> + <Data name="registration_number"> + <value><%= @line.registration_number %></value> + </Data> + <Data name="comment"> + <value><%= @line.comment %></value> + </Data> + <Data name="mobility_restricted_suitability"> + <value><%= @line.mobility_restricted_suitability %></value> + </Data> + <Data name="int_user_needs"> + <value><%= @line.int_user_needs %></value> + </Data> + </ExtendedData> <%= @line.geometry_presenter.geometry.kml_representation.html_safe %> </Placemark> </Document> diff --git a/app/views/api/kml/routes/show.kml.erb b/app/views/api/kml/routes/show.kml.erb index 0b9bf7629..310eb418b 100644 --- a/app/views/api/kml/routes/show.kml.erb +++ b/app/views/api/kml/routes/show.kml.erb @@ -1,25 +1,46 @@ <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> - <% @route.stop_areas.each do |stop_area| %> - <Placemark id="<%= stop_area.objectid %>" > - <name><%= stop_area.name %></name> - <stop_area_type><%= stop_area.area_type.underscore %></stop_area_type> - <%= (stop_area.position or stop_area.default_position).kml_representation.html_safe %> - </Placemark> - <% end %> <Placemark id="<%= @route.objectid %>" > - <objectid><%= @route.objectid %></objectid> - <object_version><%= @route.object_version %></object_version> - <creation_time><%= @route.creation_time %></creation_time> - <creator_id><%= @route.creator_id %></creator_id> <name><%= @route.name %></name> - <direction_code><%= @route.direction_code %></direction_code> - <comment><%= @route.comment %></comment> - <published_name><%= @route.published_name %></published_name> - <number><%= @route.number %></number> - <direction><%= @route.direction %></direction> - <wayback><%= @route.wayback %></wayback> + <ExtendedData> + <Data name="object_id"> + <value><%= @route.objectid %></value> + </Data> + <Data name="object_version"> + <value><%= @route.object_version %></value> + </Data> + <Data name="creation_time"> + <value><%= @route.creation_time %></value> + </Data> + <Data name="creator_id"> + <value><%= @route.creator_id %></value> + </Data> + <Data name="name"> + <value><%= @route.name %></value> + </Data> + <Data name="direction_code"> + <value><%= @route.direction_code %></value> + </Data> + <Data name="comment"> + <value><%= @route.comment %></value> + </Data> + <Data name="published_name"> + <value><%= @route.published_name %></value> + </Data> + <Data name="number"> + <value><%= @route.number %></value> + </Data> + <Data name="direction"> + <value><%= @route.direction %></value> + </Data> + <Data name="number"> + <value><%= @route.number %></value> + </Data> + <Data name="wayback"> + <value><%= @route.wayback %></value> + </Data> + </ExtendedData> <%= @route.geometry_presenter.geometry.kml_representation.html_safe %> </Placemark> </Document> diff --git a/app/views/api/kml/stop_areas/_stop_area.kml.erb b/app/views/api/kml/stop_areas/_stop_area.kml.erb index 401bff052..e6e5a1cc8 100644 --- a/app/views/api/kml/stop_areas/_stop_area.kml.erb +++ b/app/views/api/kml/stop_areas/_stop_area.kml.erb @@ -1,21 +1,64 @@ - <objectid><%= stop_area.objectid.to_s.html_safe %></objectid> - <object_version><%= stop_area.object_version.to_s.html_safe %></object_version> - <creation_time><%= stop_area.creation_time.to_s.html_safe %></creation_time> - <creator_id><%= stop_area.creator_id.to_s.html_safe %></creator_id> - <name><%= stop_area.name.to_s.html_safe %></name> - <comment><%= stop_area.comment.to_s.html_safe %></comment> - <area_type><%= stop_area.area_type.to_s.html_safe %></area_type> - <registration_number><%= stop_area.registration_number.to_s.html_safe %></registration_number> - <nearest_topic_name><%= stop_area.nearest_topic_name.to_s.html_safe %></nearest_topic_name> - <fare_code><%= stop_area.fare_code.to_s.html_safe %></fare_code> - <longitude><%= stop_area.longitude.to_s.html_safe %></longitude> - <latitude><%= stop_area.latitude.to_s.html_safe %></latitude> - <long_lat_type><%= stop_area.long_lat_type.to_s.html_safe %></long_lat_type> - <x><%= stop_area.projection_x.to_s.html_safe %></x> - <y><%= stop_area.projection_y.to_s.html_safe %></y> - <projection_type><%= stop_area.projection.to_s.html_safe %></projection_type> - <country_code><%= stop_area.country_code.to_s.html_safe %></country_code> - <street_name><%= stop_area.street_name.to_s.html_safe %></street_name> + <Placemark id="<%= stop_area.objectid %>" > + <name><%= stop_area.name %></name> + <ExtendedData> + <Data name="object_id"> + <value><%= stop_area.objectid %></value> + </Data> + <Data name="object_version"> + <value><%= stop_area.object_version %></value> + </Data> + <Data name="object_id"> + <value><%= stop_area.objectid %></value> + </Data> + <Data name="creation_time"> + <value><%= stop_area.creation_time %></value> + </Data> + <Data name="creator_id"> + <value><%= stop_area.creator_id %></value> + </Data> + <Data name="name"> + <value><%= stop_area.name %></value> + </Data> + <Data name="comment"> + <value><%= stop_area.comment %></value> + </Data> + <Data name="area_type"> + <value><%= stop_area.area_type %></value> + </Data> + <Data name="registration_number"> + <value><%= stop_area.registration_number %></value> + </Data> + <Data name="nearest_topic_name"> + <value><%= stop_area.nearest_topic_name %></value> + </Data> + <Data name="fare_code"> + <value><%= stop_area.fare_code %></value> + </Data> + <Data name="longitude"> + <value><%= stop_area.longitude %></value> + </Data> + <Data name="latitude"> + <value><%= stop_area.latitude %></value> + </Data> + <Data name="long_lat_type"> + <value><%= stop_area.long_lat_type %></value> + </Data> + <Data name="projection_x"> + <value><%= stop_area.projection_x %></value> + </Data> + <Data name="projection_y"> + <value><%= stop_area.projection_y %></value> + </Data> + <Data name="projection"> + <value><%= stop_area.projection %></value> + </Data> + <Data name="country_code"> + <value><%= stop_area.country_code %></value> + </Data> + <Data name="street_name"> + <value><%= stop_area.street_name %></value> + </Data> + </ExtendedData> - <%= stop_area.geometry_presenter.geometry.kml_representation.html_safe %> - + <%= stop_area.geometry_presenter.geometry.kml_representation.html_safe %> + </Placemark> diff --git a/app/views/api/kml/stop_areas/index.kml.erb b/app/views/api/kml/stop_areas/index.kml.erb index 635921f03..09708f193 100644 --- a/app/views/api/kml/stop_areas/index.kml.erb +++ b/app/views/api/kml/stop_areas/index.kml.erb @@ -1,12 +1,72 @@ <?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> - <Document> - <% @stop_areas.each do |stop_area| %> - <Placemark id="<%= stop_area.objectid %>" > - <%= render :partial => "stop_area", :locals => { :stop_area => stop_area} %> - </Placemark> - <% end %> + <% @stop_areas.each do |stop_area| %> + <Placemark id="<%= stop_area.objectid %>" > + <name><%= stop_area.name %></name> + <ExtendedData> + <Data name="object_id"> + <value><%= stop_area.objectid %></value> + </Data> + <Data name="object_version"> + <value><%= stop_area.object_version %></value> + </Data> + <Data name="object_id"> + <value><%= stop_area.objectid %></value> + </Data> + <Data name="creation_time"> + <value><%= stop_area.creation_time %></value> + </Data> + <Data name="creator_id"> + <value><%= stop_area.creator_id %></value> + </Data> + <Data name="name"> + <value><%= stop_area.name %></value> + </Data> + <Data name="comment"> + <value><%= stop_area.comment %></value> + </Data> + <Data name="area_type"> + <value><%= stop_area.area_type %></value> + </Data> + <Data name="registration_number"> + <value><%= stop_area.registration_number %></value> + </Data> + <Data name="nearest_topic_name"> + <value><%= stop_area.nearest_topic_name %></value> + </Data> + <Data name="fare_code"> + <value><%= stop_area.fare_code %></value> + </Data> + <Data name="longitude"> + <value><%= stop_area.longitude %></value> + </Data> + <Data name="latitude"> + <value><%= stop_area.latitude %></value> + </Data> + <Data name="long_lat_type"> + <value><%= stop_area.long_lat_type %></value> + </Data> + <Data name="projection_x"> + <value><%= stop_area.projection_x %></value> + </Data> + <Data name="projection_y"> + <value><%= stop_area.projection_y %></value> + </Data> + <Data name="projection"> + <value><%= stop_area.projection %></value> + </Data> + <Data name="country_code"> + <value><%= stop_area.country_code %></value> + </Data> + <Data name="street_name"> + <value><%= stop_area.street_name %></value> + </Data> + </ExtendedData> + + <%= stop_area.geometry_presenter.geometry.kml_representation.html_safe %> + </Placemark> + <% end %> </Document> </kml> diff --git a/spec/exporters/chouette/kml/exporter_spec.rb b/spec/exporters/chouette/kml/exporter_spec.rb new file mode 100644 index 000000000..e83cc1ad6 --- /dev/null +++ b/spec/exporters/chouette/kml/exporter_spec.rb @@ -0,0 +1,28 @@ +require 'spec_helper' + +describe Chouette::Kml::Exporter do + + subject { Chouette::Kml::Exporter.new } + + let(:zip_file_path) { "#{Rails.root}/tmp/exports/test.zip" } + let(:line) { Factory(:line_with_stop_areas_having_parent) } + + describe "#export" do + + it "should return a zip file with nothing inside with no objects in arguments" do + subject.export(zip_file_path, {} ) + File.exists?(zip_file_path).should be_true + puts ::Zip::ZipFile.open(zip_file_path).entries.inspect + ::Zip::ZipFile.open(zip_file_path).size.should == 0 + end + + it "should return a zip file with the kml of the line inside with a line in arguments" do + subject.export(zip_file_path, {:export_id => 1, :o => "line", :id => "#{line.id}" } ) + File.exists?(zip_file_path).should be_true + ::Zip::ZipFile.open(zip_file_path).size.should == 4 + end + + end + + +end diff --git a/spec/models/export_spec.rb b/spec/models/export_spec.rb index 4d5556998..fb83236b0 100644 --- a/spec/models/export_spec.rb +++ b/spec/models/export_spec.rb @@ -46,7 +46,7 @@ describe Export do describe ".types" do it "should return available Export implementations" do - Export.types.should =~ %w{NeptuneExport CsvExport GtfsExport NetexExport} + Export.types.should =~ %w{NeptuneExport CsvExport GtfsExport NetexExport KmlExport} end end |
