mormon 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,9 +1,20 @@
1
1
  require 'nokogiri'
2
+ require 'tmpdir'
2
3
 
3
4
  module Mormon
4
5
  module OSM
5
6
  class Loader
6
- attr_reader :options, :routing, :nodes, :ways, :tiles, :routeable_nodes, :route_types
7
+
8
+ @route_types = [:cycle, :car, :train, :foot, :horse]
9
+ @cache_dir = File.join Dir.tmpdir, "mormon", "cache"
10
+
11
+ class << self
12
+ attr_reader :route_types
13
+ attr_accessor :cache_dir
14
+ end
15
+
16
+ attr_reader :options, :routing, :nodes, :ways, :tiles, :routeable_nodes, :route_types,
17
+ :osm_filename
7
18
 
8
19
  def initialize(filename, options = {})
9
20
  @options = options
@@ -14,9 +25,8 @@ module Mormon
14
25
 
15
26
  @routing = {}
16
27
  @routeable_nodes = {}
17
- @route_types = [:cycle, :car, :train, :foot, :horse]
18
28
 
19
- @route_types.each do |type|
29
+ Loader.route_types.each do |type|
20
30
  @routing[type] = {}
21
31
  @routeable_nodes[type] = {}
22
32
  end
@@ -24,35 +34,87 @@ module Mormon
24
34
  # @tilename = Mormon::Tile::Name.new
25
35
  # @tiledata = Mormon::Tile::Data.new
26
36
 
27
- parse filename
28
- end
29
-
30
- def parse(filename)
31
- puts "Loading %s.." % filename
32
-
33
- if !File.exists?(filename)
34
- print "No such data file %s" % filename
35
- return false
36
- end
37
-
38
- osm = Nokogiri::XML(File.open(filename))
39
-
40
- load_nodes osm
41
- load_ways osm
37
+ @osm_filename = filename
38
+ @options[:cache] ? load_cached : parse
42
39
  end
43
40
 
44
41
  def report
45
42
  report = "Loaded %d nodes,\n" % @nodes.keys.size
46
43
  report += "%d ways, and...\n" % @ways.keys.size
47
44
 
48
- @route_types.each do |type|
45
+ Loader.route_types.each do |type|
49
46
  report += " %d %s routes\n" % [@routing[type].keys.size, type]
50
47
  end
51
48
 
52
49
  report
53
50
  end
54
51
 
52
+ def cache_filename
53
+ File.join Loader.cache_dir, File.basename(@osm_filename) + ".pstore"
54
+ end
55
+
55
56
  private
57
+ def load_cached
58
+ require "pstore"
59
+
60
+ store_path = cache_filename
61
+
62
+ FileUtils.mkdir_p Loader.cache_dir
63
+ FileUtils.touch store_path
64
+
65
+ store = PStore.new store_path
66
+
67
+ if !File.zero? store_path
68
+ puts "Loading from cache %s..." % store.path
69
+
70
+ store.transaction(true) do
71
+ @tiles = store[:tiles]
72
+ @nodes = store[:nodes]
73
+ @ways = store[:ways]
74
+ @tiles = store[:tiles]
75
+
76
+ Loader.route_types.each do |type|
77
+ @routing[type] = store[:routing][type]
78
+ @routeable_nodes[type] = store[:routeable_nodes][type]
79
+ end
80
+ end
81
+
82
+ else
83
+ puts "Parsing %s..." % @osm_filename
84
+ parse
85
+
86
+ puts "Creating cache %s..." % store.path
87
+ store.transaction do
88
+ store[:tiles] = @tiles
89
+ store[:nodes] = @nodes
90
+ store[:ways] = @ways
91
+ store[:tiles] = @tiles
92
+
93
+ store[:routing] = {}
94
+ store[:routeable_nodes] = {}
95
+
96
+ Loader.route_types.each do |type|
97
+ store[:routing][type] = @routing[type]
98
+ store[:routeable_nodes][type] = @routeable_nodes[type]
99
+ end
100
+ end
101
+ end
102
+
103
+ end
104
+
105
+ def parse
106
+ puts "Loading %s.." % @osm_filename
107
+
108
+ if !File.exists?(@osm_filename)
109
+ print "No such data file %s" % @osm_filename
110
+ return false
111
+ end
112
+
113
+ osm = Nokogiri::XML File.open(@osm_filename)
114
+
115
+ load_nodes osm
116
+ load_ways osm
117
+ end
56
118
 
57
119
  def load_nodes(nokosm)
58
120
  nokosm.css('node').each do |node|
@@ -121,7 +183,7 @@ module Mormon
121
183
  last = -1
122
184
  way[:nodes].each do |node|
123
185
  if last != -1
124
- @route_types.each do |route_type|
186
+ Loader.route_types.each do |route_type|
125
187
  if access[route_type]
126
188
  weight = Mormon::Weight.get route_type, highway.to_sym
127
189
  add_link(last, node, route_type, weight)
@@ -1,3 +1,3 @@
1
1
  module Mormon
2
- VERSION = "0.0.2"
2
+ VERSION = "1.0.0"
3
3
  end
data/spec/mormon_spec.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'mormon'
3
+ require 'benchmark'
3
4
 
4
5
  describe Mormon::Weight do
5
6
  it "get (transport, way type) must to return a value" do
@@ -36,31 +37,64 @@ describe Mormon::Tile::Name do
36
37
  end
37
38
  end
38
39
 
40
+ def spec_osm_file
41
+ File.join File.dirname(__FILE__), "spec.osm"
42
+ end
43
+
39
44
  describe Mormon::OSM::Loader do
40
- before :each do
41
- @loader = Mormon::OSM::Loader.new File.dirname(__FILE__) + "/spec.osm"
45
+ def common_specs(loader)
46
+ loader.nodes.keys.size.should eq 534
47
+ loader.ways.keys.size.should eq 135
48
+
49
+ loader.routing[:cycle].keys.size.should eq 240
50
+ loader.routing[:car].keys.size.should eq 240
51
+ loader.routing[:train].keys.size.should eq 0
52
+ loader.routing[:foot].keys.size.should eq 281
53
+ loader.routing[:horse].keys.size.should eq 216
42
54
  end
43
55
 
44
- it "should load the correct data" do
45
- @loader.nodes.keys.size.should eq 534
46
- @loader.ways.keys.size.should eq 135
47
-
48
- @loader.routing[:cycle].keys.size.should eq 240
49
- @loader.routing[:car].keys.size.should eq 240
50
- @loader.routing[:train].keys.size.should eq 0
51
- @loader.routing[:foot].keys.size.should eq 281
52
- @loader.routing[:horse].keys.size.should eq 216
56
+ describe "whitout cache" do
57
+ before :each do
58
+ @loader = Mormon::OSM::Loader.new spec_osm_file
59
+ end
60
+
61
+ it "should load the correct data" do
62
+ common_specs @loader
63
+ end
64
+
65
+ it "should has the correct nodes" do
66
+ map = { "448193026" => 1, "448193243" => 1, "448193220" => 1, "318099173" => 1 }
67
+ @loader.routing[:foot]["448193024"].should eq(map)
68
+ end
53
69
  end
54
70
 
55
- it "should has the correct nodes" do
56
- map = { "448193026" => 1, "448193243" => 1, "448193220" => 1, "318099173" => 1 }
57
- @loader.routing[:foot]["448193024"].should eq(map)
71
+ describe "with cache" do
72
+ it "should exists the cached version" do
73
+ @loader = Mormon::OSM::Loader.new spec_osm_file, :cache => true
74
+ File.exists?(@loader.cache_filename).should eq true
75
+ File.zero?(@loader.cache_filename).should eq false
76
+ end
77
+
78
+ it "should have stored the same data" do
79
+ @without_cache = Mormon::OSM::Loader.new spec_osm_file
80
+ @with_cache = Mormon::OSM::Loader.new spec_osm_file, :cache => true
81
+
82
+ common_specs @without_cache
83
+ common_specs @with_cache
84
+
85
+ @without_cache.nodes.should eq @with_cache.nodes
86
+ @without_cache.ways.should eq @with_cache.ways
87
+ @without_cache.routing.should eq @with_cache.routing
88
+ @without_cache.routeable_nodes.should eq @with_cache.routeable_nodes
89
+ end
90
+
58
91
  end
92
+
59
93
  end
60
94
 
61
95
  describe Mormon::OSM::Router do
62
96
  before :each do
63
- @loader = Mormon::OSM::Loader.new File.dirname(__FILE__) + "/spec.osm"
97
+ @loader = Mormon::OSM::Loader.new spec_osm_file
64
98
  @router = Mormon::OSM::Router.new @loader
65
99
  end
66
100
 
@@ -81,7 +115,7 @@ describe Mormon::OSM::Router do
81
115
  end
82
116
 
83
117
  it "should find the route in tandil map" do
84
- @loader = Mormon::OSM::Loader.new File.dirname(__FILE__) + "/tandil.osm"
118
+ @loader = Mormon::OSM::Loader.new File.join(File.dirname(__FILE__), "tandil.osm")
85
119
  @router = Mormon::OSM::Router.new @loader
86
120
 
87
121
  response, route = @router.find_route 1355012894, 1527759159, :car
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mormon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: