gis_scraper 0.1.3.pre → 0.1.4.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/gis_scraper/layer.rb +44 -42
- data/lib/gis_scraper/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79913e4d0eaa973a3d7395a2a411253b7548aaaf
|
4
|
+
data.tar.gz: f9991565da85450b9cf9933ed693ab886023cda6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d8f18966bcb062ffffe0aa594317322f9ffb1fea45db118f664b2df96cd896925fb444c10b6ad2dedad750f06fbb4480cdfb4f5573b1e517de98ef4467a5a91
|
7
|
+
data.tar.gz: 25d3d263e3be058d95849546f794fc2438cc05b7fdfde8bbc2c9068c1479c0b2fea6c53ce611031c1b1119214bb0482713ea62f4489dcbf07da71552ceb81693
|
data/lib/gis_scraper/layer.rb
CHANGED
@@ -15,7 +15,7 @@ class Layer
|
|
15
15
|
class NoDatabase < StandardError; end
|
16
16
|
class OgrMissing < StandardError; end
|
17
17
|
|
18
|
-
attr_reader :type
|
18
|
+
attr_reader :type
|
19
19
|
|
20
20
|
TYPES = ['Group Layer',
|
21
21
|
'Feature Layer',
|
@@ -25,19 +25,19 @@ class Layer
|
|
25
25
|
|
26
26
|
CONN = [:host, :port, :dbname, :user, :password] # PG connection options
|
27
27
|
|
28
|
-
GEOM_TYPES = {esriGeometryPoint
|
29
|
-
esriGeometryMultipoint
|
30
|
-
esriGeometryLine
|
31
|
-
esriGeometryPolyline
|
32
|
-
esriGeometryPolygon
|
28
|
+
GEOM_TYPES = {'esriGeometryPoint' => 'POINT',
|
29
|
+
'esriGeometryMultipoint' => 'MULTIPOINT',
|
30
|
+
'esriGeometryLine' => 'LINESTRING',
|
31
|
+
'esriGeometryPolyline' => 'MULTILINESTRING',
|
32
|
+
'esriGeometryPolygon' => 'MULTIPOLYGON'}
|
33
33
|
|
34
34
|
|
35
35
|
OGR2OGR = 'ogr2ogr -f "PostgreSQL" PG:'
|
36
36
|
|
37
|
-
def initialize(url,
|
37
|
+
def initialize(url, path = nil)
|
38
38
|
@conn_hash = CONN.zip(CONN.map { |key| GisScraper.config[key] }).to_h
|
39
39
|
@url = url
|
40
|
-
@output_path = output_path || config_path
|
40
|
+
@output_path = output_path(path) || config_path
|
41
41
|
@ms_url = ms_url # map server url ending '../MapServer'
|
42
42
|
@id = id
|
43
43
|
@agent = Mechanize.new
|
@@ -46,22 +46,35 @@ class Layer
|
|
46
46
|
@page_json = page_json
|
47
47
|
@type = type
|
48
48
|
@name = name
|
49
|
+
@sub_layer_ids = sub_layer_ids
|
49
50
|
end
|
50
51
|
|
51
52
|
def output_json
|
52
|
-
|
53
|
+
output(:json)
|
53
54
|
end
|
54
55
|
|
55
56
|
def output_to_db
|
56
57
|
raise OgrMissing.new, 'ogr2ogr missing, is GDAL installed?' if !ogr2ogr?
|
57
58
|
raise NoDatabase.new, "No db connection: #{@conn_hash.inspect}" if !db?
|
58
|
-
|
59
|
-
output_json
|
60
|
-
write_json_files_to_db_tables
|
59
|
+
output(:db)
|
61
60
|
end
|
62
61
|
|
63
62
|
private
|
64
63
|
|
64
|
+
def output(format) # recurses sub-layers :)
|
65
|
+
QUERYABLE.any? { |l| @type == l } ? method(format) : do_sub_layers(format)
|
66
|
+
end
|
67
|
+
|
68
|
+
def method(format)
|
69
|
+
return write_json if format == :json
|
70
|
+
return write_to_db if format == :db
|
71
|
+
raise "Unknown output format: #{format}"
|
72
|
+
end
|
73
|
+
|
74
|
+
def output_path(path)
|
75
|
+
File.expand_path(path) if path
|
76
|
+
end
|
77
|
+
|
65
78
|
def db?
|
66
79
|
PG.connect(@conn_hash) rescue nil
|
67
80
|
end
|
@@ -104,31 +117,31 @@ class Layer
|
|
104
117
|
type
|
105
118
|
end
|
106
119
|
|
107
|
-
def
|
108
|
-
@page_json['subLayers'] || []
|
120
|
+
def sub_layer_ids
|
121
|
+
@page_json['subLayers'].map { |hash| hash['id'] } || []
|
109
122
|
end
|
110
123
|
|
111
124
|
def json_data(url)
|
112
125
|
FeatureScraper.new(url).json_data
|
113
126
|
end
|
114
127
|
|
115
|
-
def
|
128
|
+
def write_json
|
116
129
|
File.write "#{@output_path}/#{@name}.json", json_data("#{@ms_url}/#{@id}")
|
117
130
|
end
|
118
131
|
|
119
|
-
def
|
120
|
-
|
121
|
-
|
122
|
-
|
132
|
+
def write_to_db
|
133
|
+
@output_path = 'tmp'
|
134
|
+
write_json
|
135
|
+
`#{OGR2OGR}"#{conn}" "tmp/#{@name}.json" -nln #{table} #{srs} -nlt #{geom}`
|
123
136
|
end
|
124
137
|
|
125
|
-
def geom
|
126
|
-
esri = esri_geom
|
127
|
-
GEOM_TYPES[esri
|
138
|
+
def geom
|
139
|
+
esri = esri_geom
|
140
|
+
GEOM_TYPES[esri] || raise("Unknown geometry: '#{esri}' for layer #{@name}")
|
128
141
|
end
|
129
142
|
|
130
|
-
def esri_geom
|
131
|
-
|
143
|
+
def esri_geom
|
144
|
+
@page_json['geometryType']
|
132
145
|
end
|
133
146
|
|
134
147
|
def srs
|
@@ -136,12 +149,8 @@ class Layer
|
|
136
149
|
"-a_srs #{GisScraper.config[:srs]}" || ''
|
137
150
|
end
|
138
151
|
|
139
|
-
def
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
def files
|
144
|
-
Dir.glob('tmp/**/*.json')
|
152
|
+
def table
|
153
|
+
Shellwords.escape @name.downcase
|
145
154
|
end
|
146
155
|
|
147
156
|
def conn
|
@@ -149,21 +158,14 @@ class Layer
|
|
149
158
|
"host=#{host} port=#{port} dbname=#{db} user=#{user} password=#{pwd}"
|
150
159
|
end
|
151
160
|
|
152
|
-
def
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
recurse_json sub_layer(id, path), path
|
157
|
-
end
|
158
|
-
end
|
159
|
-
|
160
|
-
def recurse_json(layer, dir)
|
161
|
-
FileUtils.mkdir dir
|
162
|
-
layer.output_json
|
161
|
+
def do_sub_layers(format)
|
162
|
+
FileUtils.mkdir File.join(@output_path, @name) if format == :json
|
163
|
+
path = @output_path << "/#{@name}"
|
164
|
+
@sub_layer_ids.each { |n| sub_layer(n, path).send(:output, format) }
|
163
165
|
end
|
164
166
|
|
165
167
|
def sub_layer(id, path)
|
166
|
-
Layer.new
|
168
|
+
Layer.new("#{@ms_url}/#{id}", path)
|
167
169
|
end
|
168
170
|
|
169
171
|
def replace_forwardslashes_with_underscores(string)
|
data/lib/gis_scraper/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gis_scraper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bruce Steedman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|