aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuc Donnet2013-07-05 17:17:49 +0200
committerLuc Donnet2013-07-05 17:17:49 +0200
commite3aab2a4851eb84fa3993637e78cd4b21b04e1fa (patch)
tree2b6586214d2d60ec96fef814b98ddee4bd8c292f
parenteec54db17585f6c1e7354dcd8cf37749527071f1 (diff)
downloadchouette-core-e3aab2a4851eb84fa3993637e78cd4b21b04e1fa.tar.bz2
Add kml export for lines network and company
-rw-r--r--Gemfile3
-rw-r--r--Gemfile.lock8
-rw-r--r--app/exporters/chouette/kml/exporter.rb68
-rw-r--r--app/exporters/chouette/kml/line_exporter.rb10
-rw-r--r--app/exporters/chouette/kml/route_exporter.rb25
-rw-r--r--app/exporters/chouette/kml/stop_area_exporter.rb28
-rw-r--r--app/models/export.rb13
-rw-r--r--app/models/kml_export.rb11
-rw-r--r--app/views/api/kml/lines/show.kml.erb58
-rw-r--r--app/views/api/kml/routes/show.kml.erb55
-rw-r--r--app/views/api/kml/stop_areas/_stop_area.kml.erb83
-rw-r--r--app/views/api/kml/stop_areas/index.kml.erb72
-rw-r--r--spec/exporters/chouette/kml/exporter_spec.rb28
-rw-r--r--spec/models/export_spec.rb2
14 files changed, 381 insertions, 83 deletions
diff --git a/Gemfile b/Gemfile
index 7bf8dd7ab..bb7067d36 100644
--- a/Gemfile
+++ b/Gemfile
@@ -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