gb_mapfish_appserver 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,7 @@
1
1
  class AppsController < ApplicationController
2
2
 
3
+ before_filter :redirect_to_https_if_signed_in
4
+
3
5
  def show
4
6
  @current_roles = current_roles.roles.collect(&:name)
5
7
 
@@ -63,4 +65,15 @@ class AppsController < ApplicationController
63
65
  render :action => @app, :layout => false
64
66
  end
65
67
 
68
+ private
69
+
70
+ def redirect_to_https_if_signed_in
71
+ if REDIRECT_APP_TO_HTTPS_IF_SIGNED_IN && user_signed_in?
72
+ # redirect to HTTPS if user is logged in
73
+ unless request.ssl?
74
+ redirect_to :protocol => 'https://', :status => :temporary_redirect
75
+ end
76
+ end
77
+ end
78
+
66
79
  end
@@ -31,8 +31,9 @@ class TopicsController < ApplicationController
31
31
  end
32
32
 
33
33
  def query
34
- # optional parameter (default = false) to return only the feature nearest to the center of the search geometry, if no custom layer query is used
35
- nearest = params['nearest'] == 'true'
34
+ # optional parameter to return only the feature nearest to the center of the search geometry, if no custom layer query is used
35
+ # use layer setting by default
36
+ nearest = params['nearest'].nil? ? nil : params['nearest'] == 'true'
36
37
 
37
38
  @query_topics = ActiveSupport::JSON.decode(params[:infoQuery])['queryTopics']
38
39
  #e.g. [{"layers"=>"lk25,grenzen,gemeindegrenzen,seen,wald,haltestellen", "divCls"=>"legmain", "level"=>"main", "topic"=>"BASISKARTEZH"}, {"layers"=>"", "divCls"=>"legover", "level"=>"over", "topic"=>"AVParzOverlayZH"}]
@@ -61,8 +61,18 @@ class GeoModel < ActiveRecord::Base
61
61
 
62
62
  if nearest
63
63
  logger.debug "*** query nearest ***"
64
- # get the feature nearest to the center of the search geometry
65
- filter = filter.order("ST_Distance(#{table_name}.#{geometry_column_name}, #{center})").limit(1)
64
+ min_dist = filter.select("Min(ST_Distance(#{table_name}.#{geometry_column_name}, #{center})) AS min_dist").first
65
+ unless min_dist.nil?
66
+ logger.debug "*** min_dist = #{min_dist.min_dist} ***"
67
+ if min_dist.min_dist.to_f == 0
68
+ # center of the search geometry is within a feature (may be overlapping features)
69
+ filter = filter.where("ST_Within(#{center}, #{table_name}.#{geometry_column_name})")
70
+ else
71
+ # get the feature nearest to the center of the search geometry
72
+ filter = filter.order("ST_Distance(#{table_name}.#{geometry_column_name}, #{center})").limit(1)
73
+ end
74
+ end
75
+ # else no features in filter
66
76
  end
67
77
 
68
78
  filter
data/app/models/layer.rb CHANGED
@@ -118,7 +118,10 @@ EOS
118
118
  allowed_fields
119
119
  end
120
120
 
121
- def query(ability, query_topic, searchgeo, nearest=false)
121
+ def query(ability, query_topic, searchgeo, nearest=nil)
122
+ # use layer setting by default
123
+ nearest = search_nearest if nearest.nil?
124
+
122
125
  if table =~ /^https?:/
123
126
  features = get_feature_info(searchgeo)
124
127
  [self, features, searchgeo.split(',')]
@@ -141,7 +144,7 @@ EOS
141
144
  feature_class.identify_query(searchgeo, searchdistance)
142
145
  else
143
146
  logger.debug "*** Identify on layer #{name} with query fields #{query_fields(ability)} at #{searchgeo.inspect}"
144
- feature_class.identify_filter(searchgeo, searchdistance, nearest).select(query_fields(ability)).all
147
+ feature_class.identify_filter(searchgeo, searchdistance, nearest).where(where_filter).select(query_fields(ability)).all
145
148
  end
146
149
  logger.debug "Number of features: #{features.size}"
147
150
  # calculate bbox of all features
@@ -296,7 +299,7 @@ EOS
296
299
  wms_layers.split(',').collect {|l| %Q<"#{l}"> }.join(',')
297
300
  end
298
301
 
299
- DEFAULT_SELECTION_STYLE = {
302
+ @@default_selection_styles = {
300
303
  'POLYGON' =>
301
304
  '<PolygonSymbolizer>'+
302
305
  '<Fill>'+
@@ -329,11 +332,19 @@ EOS
329
332
  '</PointSymbolizer>'
330
333
  }
331
334
 
335
+ def self.set_default_selection_styles(styles)
336
+ @@default_selection_styles = styles
337
+ end
338
+
339
+ def self.default_selection_styles
340
+ @@default_selection_styles
341
+ end
342
+
332
343
  def selection_symbolizer
333
344
  if selection_style.blank?
334
345
  gtyp = feature_class.geometry_type.sub(/^MULTI/, '').sub(/M$/, '') #MULTIPOINTM -> POINT
335
- logger.error "Unsupported selection geometry type #{feature_class.geometry_type}" unless DEFAULT_SELECTION_STYLE.has_key?(gtyp)
336
- DEFAULT_SELECTION_STYLE[gtyp] || ''
346
+ logger.error "Unsupported selection geometry type #{feature_class.geometry_type}" unless self.class.default_selection_styles.has_key?(gtyp)
347
+ self.class.default_selection_styles[gtyp] || ''
337
348
  else
338
349
  selection_style
339
350
  end
data/app/models/topic.rb CHANGED
@@ -179,7 +179,7 @@ class Topic < ActiveRecord::Base
179
179
  perms.collect(&:role)
180
180
  end
181
181
 
182
- def query(ability, query_topic, searchbbox, nearest=false)
182
+ def query(ability, query_topic, searchbbox, nearest=nil)
183
183
  active_layers = query_topic['layers'].split(',')
184
184
  qlayers = query_layers(ability, active_layers)
185
185
  results = []
data/app/models/wms.rb CHANGED
@@ -17,23 +17,22 @@ class Wms
17
17
  sld << "<UserStyle>"
18
18
  sld << "<Name>default</Name>"
19
19
  sld << "<FeatureTypeStyle>"
20
-
20
+ sld << "<Rule>"
21
+ sld << "<Name>show-selection</Name>"
22
+ sld << '<ogc:Filter>'
23
+ sld << '<ogc:Or>' if filter_values.size > 1
21
24
  filter_values.each do |value|
22
- # NOTE: use a separate rule for each value as workaround, as combined filter with <ogc:Or> does not work as expected
23
- sld << "<Rule>"
24
- sld << "<Name>show-#{value}</Name>"
25
- sld << '<ogc:Filter>'
26
25
  sld << "<ogc:PropertyIsEqualTo>"
27
26
  sld << "<ogc:PropertyName>#{filter_property}</ogc:PropertyName>"
28
27
  sld << "<ogc:Literal>#{value}</ogc:Literal>"
29
28
  sld << "</ogc:PropertyIsEqualTo>"
30
- sld << "</ogc:Filter>"
31
- sld << layer.selection_symbolizer
32
- sld << "<MinScaleDenominator>0</MinScaleDenominator>"
33
- sld << "<MaxScaleDenominator>999999999</MaxScaleDenominator>"
34
- sld << "</Rule>"
35
29
  end
36
-
30
+ sld << '</ogc:Or>' if filter_values.size > 1
31
+ sld << "</ogc:Filter>"
32
+ sld << layer.selection_symbolizer
33
+ sld << "<MinScaleDenominator>0</MinScaleDenominator>"
34
+ sld << "<MaxScaleDenominator>999999999</MaxScaleDenominator>"
35
+ sld << "</Rule>"
37
36
  sld << "</FeatureTypeStyle>"
38
37
  sld << "</UserStyle>"
39
38
  sld << "</NamedLayer>"
@@ -0,0 +1,5 @@
1
+ class AddWhereFilterToLayers < ActiveRecord::Migration
2
+ def change
3
+ add_column :layers, :where_filter, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddSearchNearestToLayer < ActiveRecord::Migration
2
+ def change
3
+ add_column :layers, :search_nearest, :boolean, :default => false
4
+ end
5
+ end
@@ -1,3 +1,3 @@
1
1
  module GbMapfishAppserver
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.1"
3
3
  end
@@ -5,6 +5,9 @@ HOST_ZONE = {
5
5
  }
6
6
  HOST_ZONE.default = SITE_DEFAULT
7
7
 
8
+ # redirect app to HTTPS if user is logged in
9
+ REDIRECT_APP_TO_HTTPS_IF_SIGNED_IN = false
10
+
8
11
  #Hostnames in image links (e.g. identify symbol) which should be replaced by 127.0.0.1 for printing
9
12
  LOCAL_GRAPHICS_HOST = /<%= options["default-site-name"] %>/
10
13
 
@@ -104,6 +104,24 @@ namespace :mapfile do
104
104
  puts "Warning: Couldn't extract table name of layer '#{layer.name}' from data '#{mlayer.data}'" if layer.table.blank?
105
105
  mlayer.data =~ /UNIQUE (\w+)/i
106
106
  layer.pkey = $1 || 'oid'
107
+ #extract where statement -if exists
108
+ mlayer.data =~ /WHERE (.*)?/i
109
+ tmp_where = $1 #return nil if nothing found
110
+ if !tmp_where.nil? && !tmp_where.strip.empty?
111
+ tmp_where = tmp_where.split(/AS/i)[0].split(/USING/i)[0].strip
112
+ if tmp_where.count("\"").odd?
113
+ tmp_where = tmp_where.gsub(/^["]/,'').gsub(/["]$/,'') #trim (") at start/end of string
114
+ end
115
+ if tmp_where.count("(") != tmp_where.count(")")
116
+ if tmp_where.count("(") < tmp_where.count(")")
117
+ tmp_where = tmp_where.gsub(/[)]$/,'') #trim ")" at end of string
118
+ else
119
+ tmp_where = tmp_where.gsub(/^[(]/,'') #trim "(" at start of string
120
+ end
121
+ end
122
+ puts "Info: Found where filter for layer '#{layer.name}' from data '#{mlayer.data}': '#{tmp_where}'"
123
+ layer.where_filter = tmp_where
124
+ end
107
125
  elsif mlayer.connectiontype == MS_WMS
108
126
  url = mlayer.getWMSFeatureInfoURL(@map, 0, 0, 10, "text/xml")
109
127
  #extract necessary params
@@ -5,6 +5,9 @@ HOST_ZONE = {
5
5
  }
6
6
  HOST_ZONE.default = SITE_DEFAULT
7
7
 
8
+ # redirect app to HTTPS if user is logged in
9
+ REDIRECT_APP_TO_HTTPS_IF_SIGNED_IN = false
10
+
8
11
  #Hostnames in image links (e.g. identify symbol) which should be replaced by 127.0.0.1 for printing
9
12
  LOCAL_GRAPHICS_HOST = /maps.example.com/
10
13
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gb_mapfish_appserver
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-09-24 00:00:00.000000000 Z
12
+ date: 2014-12-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
16
- requirement: &19441660 !ruby/object:Gem::Requirement
16
+ requirement: &12844980 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 3.2.13
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *19441660
24
+ version_requirements: *12844980
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: json
27
- requirement: &19441160 !ruby/object:Gem::Requirement
27
+ requirement: &12844480 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *19441160
35
+ version_requirements: *12844480
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: acts_as_tree
38
- requirement: &19440540 !ruby/object:Gem::Requirement
38
+ requirement: &12843860 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - =
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 0.2.0
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *19440540
46
+ version_requirements: *12843860
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: devise
49
- requirement: &19440020 !ruby/object:Gem::Requirement
49
+ requirement: &12843340 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.2.0
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *19440020
57
+ version_requirements: *12843340
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: cancan
60
- requirement: &19439500 !ruby/object:Gem::Requirement
60
+ requirement: &12842820 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - =
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: 1.6.8
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *19439500
68
+ version_requirements: *12842820
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rails_admin
71
- requirement: &19438840 !ruby/object:Gem::Requirement
71
+ requirement: &12842140 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ~>
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: 0.4.9
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *19438840
79
+ version_requirements: *12842140
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: fastercsv
82
- requirement: &19438360 !ruby/object:Gem::Requirement
82
+ requirement: &12841660 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *19438360
90
+ version_requirements: *12841660
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: sass
93
- requirement: &19437700 !ruby/object:Gem::Requirement
93
+ requirement: &12841000 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ~>
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: 3.2.12
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *19437700
101
+ version_requirements: *12841000
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: GeoRuby
104
- requirement: &19437100 !ruby/object:Gem::Requirement
104
+ requirement: &12856820 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: 0.1.4
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *19437100
112
+ version_requirements: *12856820
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rgeo
115
- requirement: &19452980 !ruby/object:Gem::Requirement
115
+ requirement: &12856280 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ~>
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: 0.3.20
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *19452980
123
+ version_requirements: *12856280
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: rgeo-geojson
126
- requirement: &19452460 !ruby/object:Gem::Requirement
126
+ requirement: &12855780 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ~>
@@ -131,10 +131,10 @@ dependencies:
131
131
  version: 0.2.3
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *19452460
134
+ version_requirements: *12855780
135
135
  - !ruby/object:Gem::Dependency
136
136
  name: hpricot
137
- requirement: &19451900 !ruby/object:Gem::Requirement
137
+ requirement: &12855220 !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
140
  - - ! '>='
@@ -142,10 +142,10 @@ dependencies:
142
142
  version: '0'
143
143
  type: :runtime
144
144
  prerelease: false
145
- version_requirements: *19451900
145
+ version_requirements: *12855220
146
146
  - !ruby/object:Gem::Dependency
147
147
  name: pg
148
- requirement: &19451320 !ruby/object:Gem::Requirement
148
+ requirement: &12854620 !ruby/object:Gem::Requirement
149
149
  none: false
150
150
  requirements:
151
151
  - - ~>
@@ -153,10 +153,10 @@ dependencies:
153
153
  version: 0.14.0
154
154
  type: :runtime
155
155
  prerelease: false
156
- version_requirements: *19451320
156
+ version_requirements: *12854620
157
157
  - !ruby/object:Gem::Dependency
158
158
  name: activerecord-postgis-adapter
159
- requirement: &19450720 !ruby/object:Gem::Requirement
159
+ requirement: &12854060 !ruby/object:Gem::Requirement
160
160
  none: false
161
161
  requirements:
162
162
  - - =
@@ -164,7 +164,7 @@ dependencies:
164
164
  version: 0.4.1
165
165
  type: :runtime
166
166
  prerelease: false
167
- version_requirements: *19450720
167
+ version_requirements: *12854060
168
168
  description: Mapfish Appserver is a framework for web mapping applications using OGC
169
169
  standards and the Mapfish protocol.
170
170
  email:
@@ -272,6 +272,8 @@ files:
272
272
  - config/initializers/rgeo.rb
273
273
  - config/routes.rb
274
274
  - db/migrate/20130118151946_setup_mapfish_tables.rb
275
+ - db/migrate/20141009135720_add_where_filter_to_layers.rb
276
+ - db/migrate/20141212103049_add_search_nearest_to_layer.rb
275
277
  - db/seeds.rb
276
278
  - gb_mapfish_appserver.gemspec
277
279
  - lib/gb_mapfish_appserver.rb