osm-import 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -29,7 +29,7 @@ module OsmImport
29
29
  require 'osm_import/target'
30
30
 
31
31
  schema = Schema.load mapping_file
32
- target = Target.new :pg, options
32
+ target = Target.new(options[:target] || :pg_tables, options)
33
33
 
34
34
  target.import(schema)
35
35
  end
@@ -13,7 +13,7 @@ class OsmImport::Mapper::Type < OsmImport::Mapper::Base
13
13
 
14
14
  def assigns
15
15
  if @multi
16
- { :type => expression, :type_array => expression_multi }
16
+ { :type => expression, :types => expression_multi }
17
17
  else
18
18
  { :type => expression }
19
19
  end
@@ -21,7 +21,7 @@ class OsmImport::Mapper::Type < OsmImport::Mapper::Base
21
21
 
22
22
  def fields
23
23
  if @multi
24
- { :type => 'VARCHAR(100) NOT NULL', :type_array => 'VARCHAR(100)[]' }
24
+ { :type => 'VARCHAR(100) NOT NULL', :types => 'VARCHAR(100)[]' }
25
25
  else
26
26
  { :type => 'VARCHAR(100) NOT NULL' }
27
27
  end
@@ -29,7 +29,7 @@ class OsmImport::Mapper::Type < OsmImport::Mapper::Base
29
29
 
30
30
  def indexes
31
31
  if @multi
32
- { :type => "BTREE(type)", :type_array => "GIN(type_array)" }
32
+ { :type => "BTREE(type)", :types => "GIN(types)" }
33
33
  else
34
34
  { :type => "BTREE(type)" }
35
35
  end
@@ -0,0 +1,91 @@
1
+ require 'osm_import'
2
+ require 'pg'
3
+
4
+ class OsmImport::Target::PgBase < Struct.new(:options)
5
+
6
+ def prefix
7
+ options[:prefix] or 'osm_'
8
+ end
9
+
10
+ def raw_prefix
11
+ options[:raw_prefix] or 'raw_osm_'
12
+ end
13
+
14
+ def new_prefix
15
+ options[:new_prefix] or 'new_osm_'
16
+ end
17
+
18
+ def projection
19
+ options[:projection]
20
+ end
21
+
22
+ GEOTYPES = { 'point' => 'POINT', 'line' => 'LINESTRING', 'polygon' => 'POLYGON', 'multiline' => 'MULTILINESTRING', 'multipolygon' => 'MULTIPOLYGON' }
23
+
24
+ def geometry_type(type)
25
+ GEOTYPES[type.to_s] or raise StandardError.new("Unknown geometry type #{type.inspect}")
26
+ end
27
+
28
+ class Connection < Struct.new(:options)
29
+
30
+ def initialize(*args)
31
+ super
32
+ @conn = PG.connect options[:pg]
33
+ end
34
+
35
+ def exec(q)
36
+ puts " #{q}"
37
+ @conn.exec q
38
+ end
39
+
40
+ def close
41
+ @conn.close
42
+ end
43
+
44
+ end
45
+
46
+ class TargetEntry
47
+
48
+ attr_reader :target, :conn, :table, :type_mapping, :types_mapping, :name_mapping, :fields, :conditions, :assigns
49
+
50
+ def initialize(target, conn, table)
51
+ @target = target
52
+ @conn = conn
53
+ @table = table
54
+
55
+ @type_mapping = table.type_mapper.expression
56
+ @types_mapping = table.type_mapper.expression_multi
57
+ @name_mapping = "NULLIF(COALESCE(src.tags->'name:ru', src.tags->'name', src.tags->'int_name'), '')"
58
+
59
+ @fields = table.type_mapper.fields.merge :id => 'INT8 PRIMARY KEY', :name => 'VARCHAR(255)', :tags => 'HSTORE', :osm_type => 'VARCHAR(10)'
60
+ @assigns = table.type_mapper.assigns.merge :id => osm_id_expr, :name => name_mapping, :tags => 'src.tags', :osm_type => osm_type_expr
61
+ @conditions = table.type_mapper.conditions
62
+
63
+ table.mappers.each do |key, mapper|
64
+ @fields.merge! mapper.fields
65
+ @assigns.merge! mapper.assigns
66
+ end
67
+ end
68
+
69
+ def osm_id_expr
70
+ "ABS(src.osm_id)"
71
+ end
72
+
73
+ def osm_type_expr(t = table.type)
74
+ "CASE WHEN src.osm_id < 0 THEN 'relation' ELSE '#{if t.to_s == 'point' then 'node' else 'way' end}' END"
75
+ end
76
+
77
+ def geometry_expr
78
+ if table.type =~ /^multi/
79
+ 'ST_Multi(way)'
80
+ else
81
+ 'way'
82
+ end
83
+ end
84
+
85
+ def name
86
+ "#{target.new_prefix}#{table.name}"
87
+ end
88
+
89
+ end
90
+
91
+ end
@@ -1,23 +1,9 @@
1
1
  require 'osm_import'
2
- require 'pg'
3
2
 
4
- class OsmImport::Target::Pg < Struct.new(:options)
5
-
6
- def projection
7
- options[:projection]
8
- end
9
-
10
- def prefix
11
- 'osm_'
12
- end
13
-
14
- def new_prefix
15
- 'new_osm_'
16
- end
3
+ class OsmImport::Target::PgTables < OsmImport::Target::PgBase
17
4
 
18
5
  def import(schema)
19
6
  conn = Connection.new options
20
-
21
7
  conn.exec "BEGIN TRANSACTION"
22
8
 
23
9
  puts "Dropping old tables:"
@@ -51,60 +37,7 @@ class OsmImport::Target::Pg < Struct.new(:options)
51
37
  conn.close
52
38
  end
53
39
 
54
- GEOTYPES = { 'point' => 'POINT', 'line' => 'LINESTRING', 'polygon' => 'POLYGON', 'multiline' => 'MULTILINESTRING', 'multipolygon' => 'MULTIPOLYGON' }
55
-
56
- def geometry_type(type)
57
- GEOTYPES[type.to_s] or raise StandardError.new("Unknown geometry type #{type.inspect}")
58
- end
59
-
60
- class Connection < Struct.new(:options)
61
-
62
- def initialize(*args)
63
- super
64
- @conn = PG.connect options[:pg]
65
- end
66
-
67
- def exec(q)
68
- puts " #{q}"
69
- @conn.exec q
70
- end
71
-
72
- def close
73
- @conn.close
74
- end
75
-
76
- end
77
-
78
- class TargetTable
79
-
80
- attr_reader :target, :conn, :table, :type_mapping, :type_array_mapping, :name_mapping, :fields, :conditions, :assigns
81
-
82
- def initialize(target, conn, table)
83
- @target = target
84
- @conn = conn
85
- @table = table
86
-
87
- @type_mapping = table.type_mapper.expression
88
- @type_array_mapping = table.type_mapper.expression_multi
89
- @name_mapping = "NULLIF(COALESCE(src.tags->'name:ru', src.tags->'name', src.tags->'int_name'), '')"
90
-
91
- @fields = table.type_mapper.fields.merge :id => 'INT8 PRIMARY KEY', :name => 'VARCHAR(255)', :tags => 'HSTORE', :osm_type => 'VARCHAR(10)'
92
- @assigns = table.type_mapper.assigns.merge :id => osm_id_expr, :name => name_mapping, :tags => 'src.tags', :osm_type => osm_type_expr
93
- @conditions = table.type_mapper.conditions
94
-
95
- table.mappers.each do |key, mapper|
96
- @fields.merge! mapper.fields
97
- @assigns.merge! mapper.assigns
98
- end
99
- end
100
-
101
- def osm_id_expr
102
- "ABS(src.osm_id)"
103
- end
104
-
105
- def osm_type_expr(t = table.type)
106
- "CASE WHEN src.osm_id < 0 THEN 'relation' ELSE '#{if t.to_s == 'point' then 'node' else 'way' end}' END"
107
- end
40
+ class TargetTable < TargetEntry
108
41
 
109
42
  def add_geometry_column(column, type)
110
43
  if target.projection
@@ -114,10 +47,6 @@ class OsmImport::Target::Pg < Struct.new(:options)
114
47
  end
115
48
  end
116
49
 
117
- def name
118
- "#{target.new_prefix}#{table.name}"
119
- end
120
-
121
50
  def create!
122
51
  conn.exec "CREATE TABLE #{name}(#{fields.map{|k,v| "#{k} #{v}"}.join(', ')})"
123
52
  add_geometry_column :geometry, table.type
@@ -148,12 +77,6 @@ class OsmImport::Target::Pg < Struct.new(:options)
148
77
 
149
78
  def import!
150
79
  unless table.type_mapper.mappings.empty?
151
- if table.type =~ /^multi/
152
- geometry_expr = 'ST_Multi(way)'
153
- else
154
- geometry_expr = 'way'
155
- end
156
-
157
80
  field_keys = fields.keys.to_a
158
81
  conn.exec "INSERT INTO #{name}(geometry, #{field_keys.join(', ')}) SELECT #{geometry_expr} AS geometry, #{field_keys.map{|k| "#{assigns[k]} AS #{k}"}.join(',')} FROM raw_osm_#{table.type.gsub('multi','')} src WHERE #{conditions.join(' AND ')}"
159
82
  end
@@ -0,0 +1,45 @@
1
+ require 'osm_import'
2
+
3
+ class OsmImport::Target::PgViews < OsmImport::Target::PgBase
4
+
5
+ def new_prefix
6
+ prefix
7
+ end
8
+
9
+ def import(schema)
10
+ conn = Connection.new options
11
+ conn.exec "BEGIN TRANSACTION"
12
+
13
+ puts "Preparing target views"
14
+ tvs = schema.tables.map{|table| TargetView.new self, conn, table }
15
+
16
+ puts "Dropping old views"
17
+ tvs.each(&:drop!)
18
+
19
+ puts "Creating views"
20
+ tvs.each(&:create!)
21
+
22
+ puts "Restoring geometry columns"
23
+ conn.exec "TRUNCATE geometry_columns"
24
+ conn.exec "SELECT probe_geometry_columns()"
25
+
26
+ puts "Commiting"
27
+ conn.exec "COMMIT"
28
+ conn.close
29
+ end
30
+
31
+ class TargetView < TargetEntry
32
+
33
+ def drop!
34
+ conn.exec "DROP VIEW IF EXISTS #{name}"
35
+ end
36
+
37
+ def create!
38
+ return if table.type_mapper.mappings.empty?
39
+
40
+ conn.exec "CREATE VIEW #{name} AS SELECT #{geometry_expr} AS geometry, #{fields.keys.map{|k| "#{assigns[k]} AS #{k}"}.join(',')} FROM #{target.raw_prefix}#{table.type.gsub('multi','')} src WHERE #{conditions.join(' AND ')}"
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -2,7 +2,7 @@ module OsmImport
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- TINY = 0
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: osm-import
3
3
  version: !ruby/object:Gem::Version
4
- hash: 31
4
+ hash: 29
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 0
10
- version: 0.0.0
9
+ - 1
10
+ version: 0.0.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alexey Noskov
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-03-29 00:00:00 Z
18
+ date: 2012-06-17 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: pg
@@ -67,7 +67,9 @@ files:
67
67
  - lib/osm_import/mapper/address.rb
68
68
  - lib/osm_import/version.rb
69
69
  - lib/osm_import/target.rb
70
- - lib/osm_import/target/pg.rb
70
+ - lib/osm_import/target/pg_tables.rb
71
+ - lib/osm_import/target/pg_base.rb
72
+ - lib/osm_import/target/pg_views.rb
71
73
  - lib/osm_import/schema.rb
72
74
  - lib/osm_import.rb
73
75
  - MIT-LICENSE