arcserver.rb 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +12 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +274 -0
- data/LICENSE +20 -20
- data/README.md +160 -0
- data/Rakefile +9 -62
- data/arcserver.rb.gemspec +35 -0
- data/lib/arcserver.rb +33 -7
- data/lib/arcserver/Identifiable.rb +10 -0
- data/lib/arcserver/Queryable.rb +10 -0
- data/lib/arcserver/feature_server.rb +19 -0
- data/lib/arcserver/geometry/geometry.rb +91 -0
- data/lib/arcserver/geometry_service.rb +18 -0
- data/lib/arcserver/gp_server.rb +20 -0
- data/lib/arcserver/graphics/feature.rb +23 -0
- data/lib/arcserver/graphics/feature_set.rb +26 -0
- data/lib/arcserver/map_server.rb +34 -40
- data/lib/arcserver/rest/feature_server.rb +30 -0
- data/lib/arcserver/rest/geometry_service.rb +54 -0
- data/lib/arcserver/rest/gp_server.rb +80 -0
- data/lib/arcserver/rest/identify.rb +66 -0
- data/lib/arcserver/rest/map_server.rb +230 -230
- data/lib/arcserver/rest/query.rb +68 -0
- data/lib/arcserver/url_helper.rb +31 -25
- data/lib/arcserver/util/legend_image.rb +0 -0
- data/lib/arcserver/version.rb +6 -6
- data/spec/custom_spec.rb +50 -0
- data/spec/factories/feature.rb +21 -0
- data/spec/feature_server_spec.rb +52 -0
- data/spec/feature_spec.rb +20 -0
- data/spec/geometry_service_spec.rb +31 -0
- data/spec/geometry_spec.rb +80 -0
- data/spec/gp_server_spec.rb +57 -0
- data/spec/identify_spec.rb +21 -0
- data/spec/query_spec.rb +38 -0
- data/spec/shared_context.rb +17 -0
- data/spec/spec_helper.rb +15 -0
- metadata +217 -158
- data/README.rdoc +0 -57
- data/lib/arcserver/soap/map_server.rb +0 -263
- data/test/functional/soap/map_server_test.rb +0 -193
- data/test/test_helper.rb +0 -25
- data/test/unit/map_server_test.rb +0 -61
- data/test/unit/url_helper_test.rb +0 -54
- data/test/unit/util/legend_image_test.rb +0 -69
data/README.rdoc
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
= arcserver.rb
|
2
|
-
|
3
|
-
arcserver.rb is a unified interface for interacting with ESRI Arcserver (9.3+)
|
4
|
-
SOAP and REST APIs from Ruby. Extra utility methods are also provided for
|
5
|
-
generating legend images.
|
6
|
-
|
7
|
-
== Installation
|
8
|
-
|
9
|
-
[sudo] gem install arcserver.rb
|
10
|
-
|
11
|
-
<em>Optional: (some of the utility methods require RMagick)</em>
|
12
|
-
[sudo] gem install rmagick
|
13
|
-
|
14
|
-
== Quick Example
|
15
|
-
|
16
|
-
require 'arcserver'
|
17
|
-
|
18
|
-
# connect to a map server instance using either its REST or SOAP url
|
19
|
-
map_server = ArcServer::MapServer.new('http://sampleserver1.arcgisonline.com/ArcGIS/services/Portland/ESRI_LandBase_WebMercator/MapServer')
|
20
|
-
|
21
|
-
# get the default map name using the SOAP API
|
22
|
-
puts map_server.get_default_map_name
|
23
|
-
|
24
|
-
# get legend information using the SOAP API
|
25
|
-
puts map_server.get_legend_info
|
26
|
-
|
27
|
-
# export an image using the REST
|
28
|
-
puts map_server.export
|
29
|
-
|
30
|
-
== Contributors
|
31
|
-
|
32
|
-
The following people have contributed their time and effort to arcserver.rb:
|
33
|
-
|
34
|
-
* Colin Casey
|
35
|
-
* Glenn Goodrich
|
36
|
-
|
37
|
-
== Contribute
|
38
|
-
|
39
|
-
If you'd like to hack on arcserver.rb, start by forking my repo on GitHub:
|
40
|
-
|
41
|
-
http://github.com/colincasey/arcserver.rb
|
42
|
-
|
43
|
-
To get all of the dependencies, install the gem first. The best way to get your changes merged back into core is as follows:
|
44
|
-
|
45
|
-
1. Clone your fork
|
46
|
-
2. Create a thoughtfully named topic branch to contain your change
|
47
|
-
3. Hack away
|
48
|
-
4. Add tests and make sure everything still passes by running rake
|
49
|
-
5. If you are adding new functionality, document it in the README
|
50
|
-
6. Do not change the version number, I will do that on my end
|
51
|
-
7. If necessary, rebase your commits into logical chunks, without errors
|
52
|
-
8. Push the branch up to GitHub
|
53
|
-
9. Send me (colincasey[http://github.com/colincasey]) a pull request for your branch
|
54
|
-
|
55
|
-
== Copyright
|
56
|
-
|
57
|
-
Copyright (c) 2010 Colin Casey. See LICENSE for details.
|
@@ -1,263 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module ArcServer
|
4
|
-
module SOAP
|
5
|
-
# Map services offer access to map and attribute content. Map services can either be cached
|
6
|
-
# or dynamic. A map service that fulfills requests with pre-created tiles from a cache instead
|
7
|
-
# of dynamically rendering part of the map is called a cached map service. A dynamic map
|
8
|
-
# service requires the server to render the map each time a request comes in. Map services
|
9
|
-
# using a tile cache can significantly improve performance while delivering maps, while dynamic
|
10
|
-
# map services offer more flexibility.
|
11
|
-
#
|
12
|
-
# Map services offer the following capabilities:
|
13
|
-
# * Generate map images for a specified geographic area
|
14
|
-
# * Change the description of the map
|
15
|
-
# * Control the output map image
|
16
|
-
# * Get map legend information
|
17
|
-
# * Query map features using attributes or spatial filters
|
18
|
-
# * Get information regarding the cache
|
19
|
-
# * Get a scale bar
|
20
|
-
#
|
21
|
-
# WSDL syntax:
|
22
|
-
# http://<Web Server Hostname>/<ArcGIS Instance>/services/<ServiceName>/MapServer?wsdl
|
23
|
-
#
|
24
|
-
# =Working with map services
|
25
|
-
#
|
26
|
-
# ==Get information about the map and its layers
|
27
|
-
#
|
28
|
-
# To access information about a map and its layers use GetServerInfo. GetServerInfo returns MapServerInfo
|
29
|
-
# and MapLayerInfo. MapServerInfo contains read-only information describing the default state of a map
|
30
|
-
# service, such as the name of the map, the background color or the spatial extent of the map. Read-only
|
31
|
-
# layer properties, such as the layer’s name, the layer’s attributes and whether or not the layer has
|
32
|
-
# labels associated with it, can be retrieved from MapLayerInfo.
|
33
|
-
#
|
34
|
-
# If you wish to make changes to the map or to map layers you will need to use MapDescription or
|
35
|
-
# LayerDescription. Use MapDescription to access map settings that can be changed such as geographic
|
36
|
-
# extent and spatial reference. MapDescription provides access to information on individual layers within
|
37
|
-
# the map. LayerDescription provides the ability to change the visibility of a layer, to toggle the visibility
|
38
|
-
# of existing labels belonging to the layer and to assign a expression in order to display a specified
|
39
|
-
# subset of features.
|
40
|
-
#
|
41
|
-
# == Exporting a map image
|
42
|
-
#
|
43
|
-
# To export a map image from a dynamic map service use ExportMapImage. An ImageDescription contains an ImageType
|
44
|
-
# and an ImageDisplay. Specifying the image format, such as JPG or PNG, is done using ImageType. Use ImageDisplay to
|
45
|
-
# specify the height and width of the image. You can also specify a transparent color using ImageDisplay. The server
|
46
|
-
# will restrict the maximum size an image can be. Use GetServiceConfigurationInfo to view the maximum height and width.
|
47
|
-
# GetServiceConfigurationInfo contains a set of name-value pairs for properties set for the MapServer Service
|
48
|
-
# Configuration Restrictions.
|
49
|
-
#
|
50
|
-
# ==Information about legend elements
|
51
|
-
#
|
52
|
-
# You can retrieve legend elements including the symbol image, labels, descriptions and headings. A common use would
|
53
|
-
# be to populate a table of contents. To retrieve legend information, use GetLegendInfo and MapServerLegendInfo
|
54
|
-
# to retrieve specific information for a particular layer.
|
55
|
-
#
|
56
|
-
# ==Querying the map
|
57
|
-
#
|
58
|
-
# Map services offer a number of methods to perform query operations on the map. These include:
|
59
|
-
# * Find
|
60
|
-
# * Identify
|
61
|
-
# * QueryHyperlinks
|
62
|
-
# * QueryFeatureCount
|
63
|
-
# * QueryFeatureData
|
64
|
-
# * QueryFeatureIDs
|
65
|
-
# * QueryFeatureCount2
|
66
|
-
# * QueryFeatureData2
|
67
|
-
# * QueryFeatureIDs2
|
68
|
-
#
|
69
|
-
# Find returns an array of MapServerFindResults based on a search string. Use MapServerFindResult to access properties
|
70
|
-
# of found features, such as the found value, the layer ID, the field name, the geometry of the found feature and a
|
71
|
-
# set of name-value pairs for the field names and values of the found features.
|
72
|
-
#
|
73
|
-
# Identify returns an array of MapServerIdentifyResults based on search shape. Use MapServerIdentifyResult to access
|
74
|
-
# properties of identified features. These include: layer ID, name, a set of name-value pairs for the field names and values
|
75
|
-
# of the identified object, and the geometry of the identified.
|
76
|
-
#
|
77
|
-
# QueryFeatureCount and QueryFeatureCount2 both return the number of features that match a query. The difference between
|
78
|
-
# the two operations is QueryFeatureCount requires a LayerID as one of the parameters, while QueryFeatureCount2 requires
|
79
|
-
# a LayerDescription instead. By passing in a LayerDescription you can query against a specific sub set of the layer by
|
80
|
-
# apply a definition expression.
|
81
|
-
#
|
82
|
-
# QueryFeatureID and QueryFeatureID2 both return an FIDSet. This is the set of feature IDs that match the query criteria.
|
83
|
-
# The difference between the two operations is QueryFeatureCount requires a LayerID as one of the parameters, while
|
84
|
-
# QueryFeatureCount2 requires a LayerDescription instead. By passing in a LayerDescription you can query against a specific
|
85
|
-
# subset of the layer by apply a definition expression.
|
86
|
-
#
|
87
|
-
# QueryFeatureData and QueryFeatureData2 differ not only in the required parameters, but also in what is returned.
|
88
|
-
# QueryFeatureData returns a RecordSet base on a specific query and includes a LayerID in the method parameters.
|
89
|
-
# QueryFeatureData2 returns a QueryResult. A QueryResult includes the URL of the generated query result in the requested
|
90
|
-
# format. The result format can be specified by using QueryResultOptions. The query result can be formatted into a RecordSet
|
91
|
-
# or KMZ format (either as a URL to the kmz file or a Mime object). Another property includes GeoTransformation. This is
|
92
|
-
# used to specify any needed geographic transformation on the results.
|
93
|
-
#
|
94
|
-
# The server will restrict the maximum number of records that can be sent. Use GetServiceConfigurationInfo the maximum records
|
95
|
-
# that can be returned in a query for this particular map service. GetServiceConfigurationInfo contains a set of name-value
|
96
|
-
# pairs for properties set for the MapServer Service Configuration Restrictions. This restriction does not affect
|
97
|
-
# QueryFeatureCount, QueryFeatureIds, QueryFeatureCount2 or QueryFeatureIds2.
|
98
|
-
#
|
99
|
-
# =Working with cached vs. dynamic map services
|
100
|
-
#
|
101
|
-
# ArcGIS Server map services provide access to two types of visible map content: dynamic and cached. Dynamic maps
|
102
|
-
# are generated on-the-fly per a user request. Layer visibility, graphics, and other variables can be modified before
|
103
|
-
# the dynamic map is generated. Unfortunately, as the amount of content and complexity in the map increases, so
|
104
|
-
# does the amount of time it takes to generate the map. Alternatively, cached maps consist of pre-generated map
|
105
|
-
# tiles available for immediate access. Since the cost of generating the maps has already been paid, the performance
|
106
|
-
# penalty associated with map generation is not a factor. Working with a map cache requires knowledge of cache
|
107
|
-
# properties, such a location and structure, so that you are able to retrieve the appropriate cached image. In
|
108
|
-
# general, a map cache is stored in a nested set of directories which contain image tiles for map extents at specific
|
109
|
-
# scale levels, or levels of detail. The author of the map service determines these levels. The cached tiles are
|
110
|
-
# usually accessible via a public virtual directory or an ArcGIS Server map service tile handler.
|
111
|
-
#
|
112
|
-
# ==Information about a map cache
|
113
|
-
#
|
114
|
-
# Use IsFixedScaleMap to determine if a map service is cached. The term fixed scale map service and cached map service are
|
115
|
-
# used synonymously. GetCacheDescriptionInfo returns information on a cached map service in one call including its
|
116
|
-
# cache type, its tiling scheme (TileCacheInfo), image information (TileImageInfo) and control information (TileControlInfo).
|
117
|
-
#
|
118
|
-
# TileCacheInfo contains information on the tiling scheme for the cache. The tiling scheme includes the tiling origin,
|
119
|
-
# spatial reference, tile size in pixels and information on the Levels of Detail (LOD) at which the service is cached.
|
120
|
-
# LODInfos enumerate a LODInfo object which describes a scale and resolution. Using the tiling scheme information in
|
121
|
-
# TileCacheInfo the client can calculate the tiles that cover any rectangular extent in map space and then retrieve
|
122
|
-
# tiles either directly from the virtual directory, or from the tile handler or by making GetMapTile or GetLayerTile
|
123
|
-
# requests against the map service.
|
124
|
-
#
|
125
|
-
# GetMapTile gets the specified tile from a map service that has a single fused cache. GetLayerTile gets the specified
|
126
|
-
# tile for a defined layer from a map service that has a multi-layer cache.
|
127
|
-
#
|
128
|
-
# GetTileImageInfo returns information describing the image format for the cached tiles. TileImageInfo has two main
|
129
|
-
# properties Format and Compression quality. Format can have values (PNG8, PNG24, PNG32 and JPEG). If the selected format
|
130
|
-
# is JPEG, then the compression quality can have a value from 0 to 100. The value of format must be used in constructing
|
131
|
-
# the URL to the tile.
|
132
|
-
#
|
133
|
-
# GetCacheControlInfo returns cache control information that allows clients to discover information such as if client
|
134
|
-
# caching is allowed.
|
135
|
-
#
|
136
|
-
# =Limitations
|
137
|
-
#
|
138
|
-
# When generating a map image, map services are not able to perform the following tasks:
|
139
|
-
# * Change feature render for an existing layer.
|
140
|
-
# * Add a dynamic layer
|
141
|
-
# * Change layer draw order
|
142
|
-
#
|
143
|
-
# Map services do not expose editing capabilities. They merely provide read-only access to feature and attribute content.
|
144
|
-
class MapServer < Handsoap::Service
|
145
|
-
protected
|
146
|
-
on_create_document do |doc|
|
147
|
-
doc.alias "env", "http://schemas.xmlsoap.org/soap/envelope/"
|
148
|
-
doc.alias "ns", "http://www.esri.com/schemas/ArcGIS/9.3"
|
149
|
-
end
|
150
|
-
|
151
|
-
def on_before_dispatch
|
152
|
-
self.class.endpoint(:uri => @soap_url, :version => 1)
|
153
|
-
end
|
154
|
-
|
155
|
-
public
|
156
|
-
def initialize(soap_url, protocol_version=2)
|
157
|
-
@soap_url = soap_url
|
158
|
-
end
|
159
|
-
|
160
|
-
# Get the name of the active map (data frame) in a map service.
|
161
|
-
# @return [String] A string representing name of the active map in the map service.
|
162
|
-
def get_default_map_name
|
163
|
-
response = invoke("ns:GetDefaultMapName")
|
164
|
-
node = response.document.xpath('//tns:GetDefaultMapNameResponse/Result', ns).first
|
165
|
-
parse_default_map_name_result(node)
|
166
|
-
end
|
167
|
-
|
168
|
-
# Returns legend information, such as layer name, group heading, classification labels and symbol swatches,
|
169
|
-
# for layers in a map.
|
170
|
-
#
|
171
|
-
# A map service does not have the ability to generate a single legend image will all legend content. Instead,
|
172
|
-
# the GetLegendInfo() method provides access to legend content which can be used to construct a single consolidated
|
173
|
-
# legend.
|
174
|
-
#
|
175
|
-
# Each MapServerLegendInfo object contains one or more MapServerLegendGroup objects. Each MapServerLegendGroup object
|
176
|
-
# contains one or more MapServerLegendClass objects. The relationship between value objects and legend content is
|
177
|
-
# illustrated in the following diagram. Note that each MapServerLegendClass contains a classification label and symbol
|
178
|
-
# swatch.
|
179
|
-
#
|
180
|
-
# @param [Hash] args the arguments to send in the SOAP request
|
181
|
-
#
|
182
|
-
# @option args [String] :map_name (get_default_map_name()) the name of the map (data frame) that will
|
183
|
-
# be used to generate legend info
|
184
|
-
#
|
185
|
-
# @option args [Array<Integer>] :layer_ids (nil) An array of layer ids for which legend information will
|
186
|
-
# be returned. If empty or null, all layers will be included.
|
187
|
-
#
|
188
|
-
# @option args [LegendPatch] :legend_patch (nil) A MapServerLegendPatch used to define symbol swatch properties
|
189
|
-
# for legend classifications. If empty or null, the default patch properties defined in the map will be used.
|
190
|
-
#
|
191
|
-
# @option args [String] :image_type ("esriImageReturnMimeData") An ImageType defines the image type and method for
|
192
|
-
# returning the image content for the symbol swatches. Supported image types are 'bmp', 'jpg', 'tif', 'png'/'png8',
|
193
|
-
# 'png24', 'emf', 'ps', 'pdf', 'ai', 'gif', and 'svg'/'svgz'. Image content can be returned as a URL or as a
|
194
|
-
# MIME data stream.
|
195
|
-
#
|
196
|
-
# @return [Hash] the SOAP response decoded into a Hash
|
197
|
-
def get_legend_info(args = {})
|
198
|
-
image_return_type = args[:image_return_url] ? "esriImageReturnURL" : "esriImageReturnMimeData"
|
199
|
-
response = invoke("ns:GetLegendInfo") do |message|
|
200
|
-
message.add "MapName", args[:map_name] || get_default_map_name
|
201
|
-
message.add "ImageType" do |image_type|
|
202
|
-
image_type.add "ImageReturnType", image_return_type
|
203
|
-
image_type.add "ImageFormat", "esriImagePNG24"
|
204
|
-
end
|
205
|
-
end
|
206
|
-
node = response.document.xpath('//tns:GetLegendInfoResponse/Result', ns).first
|
207
|
-
parse_legend_info_result(node)
|
208
|
-
end
|
209
|
-
|
210
|
-
private
|
211
|
-
def ns
|
212
|
-
{ 'tns' => 'http://www.esri.com/schemas/ArcGIS/9.3' }
|
213
|
-
end
|
214
|
-
|
215
|
-
# helpers
|
216
|
-
def parse_default_map_name_result(node)
|
217
|
-
xml_to_str(node, './text()')
|
218
|
-
end
|
219
|
-
|
220
|
-
def parse_legend_info_result(node)
|
221
|
-
node.xpath('./MapServerLegendInfo', ns).collect { |child| parse_map_server_legend_info(child) }
|
222
|
-
end
|
223
|
-
|
224
|
-
def parse_map_server_legend_info(node)
|
225
|
-
{
|
226
|
-
:layer_id => xml_to_int(node, "./LayerID/text()"),
|
227
|
-
:name => xml_to_str(node, "./Name/text()"),
|
228
|
-
:legend_groups => node.xpath('./LegendGroups/MapServerLegendGroup', ns).collect { |child| parse_map_server_legend_group(child) }
|
229
|
-
}
|
230
|
-
end
|
231
|
-
|
232
|
-
def parse_map_server_legend_group(node)
|
233
|
-
{
|
234
|
-
:heading => xml_to_str(node, "./Heading/text()"),
|
235
|
-
:legend_classes => node.xpath("./LegendClasses/MapServerLegendClass", ns).collect { |child| parse_map_server_legend_class(child) }
|
236
|
-
}
|
237
|
-
end
|
238
|
-
|
239
|
-
def parse_map_server_legend_class(node)
|
240
|
-
{
|
241
|
-
:label => xml_to_str(node, "./Label/text()"),
|
242
|
-
:descriptions => xml_to_str(node, "./Description/text()"),
|
243
|
-
:symbol_image => {
|
244
|
-
:image_data => xml_to_str(node, "./SymbolImage/ImageData/text()"),
|
245
|
-
:image_url => xml_to_str(node, "./SymbolImage/ImageURL/text()"),
|
246
|
-
:image_height => xml_to_int(node, "./SymbolImage/ImageHeight/text()"),
|
247
|
-
:image_width => xml_to_int(node, "./SymbolImage/ImageWidth/text()"),
|
248
|
-
:image_dpi => xml_to_int(node, "./SymbolImage/ImageDPI/text()")
|
249
|
-
},
|
250
|
-
:transparent_color => {
|
251
|
-
:use_windows_dithering => xml_to_bool(node, "./TransparentColor/UseWindowsDithering/text()"),
|
252
|
-
:alpha_value => xml_to_int(node, "./TransparentColor/AlphaValue/text()"),
|
253
|
-
:red => xml_to_int(node, "./TransparentColor/Red/text()"),
|
254
|
-
:green => xml_to_int(node, "./TransparentColor/Green/text()"),
|
255
|
-
:blue => xml_to_int(node, "./TransparentColor/Blue/text()")
|
256
|
-
}
|
257
|
-
}
|
258
|
-
end
|
259
|
-
|
260
|
-
|
261
|
-
end
|
262
|
-
end
|
263
|
-
end
|
@@ -1,193 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require File.expand_path("../../../test_helper", __FILE__)
|
3
|
-
require 'yaml'
|
4
|
-
|
5
|
-
#ArcServer::SOAP::MapServer.logger = $stdout
|
6
|
-
|
7
|
-
class ArcServer::SOAP::MapServerTest < Test::Unit::TestCase
|
8
|
-
should "be able to use map services at two different locations" do
|
9
|
-
service1 = ArcServer::SOAP::MapServer.new('http://sampleserver1.arcgisonline.com/ArcGIS/services/Portland/ESRI_LandBase_WebMercator/MapServer')
|
10
|
-
service2 = ArcServer::SOAP::MapServer.new('http://sampleserver1.arcgisonline.com/ArcGIS/services/Demographics/ESRI_Census_USA/MapServer')
|
11
|
-
|
12
|
-
name1 = service1.get_default_map_name
|
13
|
-
name2 = service2.get_default_map_name
|
14
|
-
|
15
|
-
assert_equal "Portland", name1
|
16
|
-
assert_equal "Layers", name2
|
17
|
-
end
|
18
|
-
|
19
|
-
context "using ESRI's sample Portland Landbase service" do
|
20
|
-
setup do
|
21
|
-
@service = ArcServer::SOAP::MapServer.new('http://sampleserver1.arcgisonline.com/ArcGIS/services/Portland/ESRI_LandBase_WebMercator/MapServer')
|
22
|
-
end
|
23
|
-
|
24
|
-
should "get the default map name" do
|
25
|
-
assert_equal "Portland", @service.get_default_map_name
|
26
|
-
end
|
27
|
-
|
28
|
-
should "get the legend info (returning image data)" do
|
29
|
-
legend_info = @service.get_legend_info(:map_name => 'Portland')
|
30
|
-
legend_info.each do |item|
|
31
|
-
layer_assertion = "assert_legend_info_result_layer_#{item[:layer_id]}".to_sym
|
32
|
-
if respond_to?(layer_assertion)
|
33
|
-
send(layer_assertion, item, :image_data)
|
34
|
-
else
|
35
|
-
raise "no assertions set for legend info with layer_id=#{item[:layer_id]}"
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
should "get the legend info (returning image urls)" do
|
41
|
-
legend_info = @service.get_legend_info(:map_name => 'Portland', :image_return_url => true)
|
42
|
-
legend_info.each do |item|
|
43
|
-
layer_assertion = "assert_legend_info_result_layer_#{item[:layer_id]}".to_sym
|
44
|
-
if respond_to?(layer_assertion)
|
45
|
-
send(layer_assertion, item, :image_url)
|
46
|
-
else
|
47
|
-
raise "no assertions set for legend info with layer_id=#{item[:layer_id]}"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
should "use the default map name when getting the legend info" do
|
53
|
-
legend_info = @service.get_legend_info
|
54
|
-
legend_info.each do |item|
|
55
|
-
layer_assertion = "assert_legend_info_result_layer_#{item[:layer_id]}".to_sym
|
56
|
-
if respond_to?(layer_assertion)
|
57
|
-
send(layer_assertion, item)
|
58
|
-
else
|
59
|
-
raise "no assertions set for legend info with layer_id=#{item[:layer_id]}"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
# legend info assertion helpers
|
66
|
-
def assert_legend_info_result_layer_1(item, image_return_type = :image_data)
|
67
|
-
expected = {
|
68
|
-
:layer_id => 1,
|
69
|
-
:name => 'Zoomed in',
|
70
|
-
:legend_groups => [{
|
71
|
-
:legend_classes => [{
|
72
|
-
:symbol_image => {
|
73
|
-
:image_return_type => image_return_type
|
74
|
-
}
|
75
|
-
}]
|
76
|
-
}]
|
77
|
-
}
|
78
|
-
|
79
|
-
assert_legend_info_result_layer(expected, item)
|
80
|
-
end
|
81
|
-
|
82
|
-
def assert_legend_info_result_layer_2(item, image_return_type = :image_data)
|
83
|
-
expected = {
|
84
|
-
:layer_id => 2,
|
85
|
-
:name => 'Zoomed out',
|
86
|
-
:legend_groups => [{
|
87
|
-
:legend_classes => [{
|
88
|
-
:symbol_image => {
|
89
|
-
:image_return_type => image_return_type
|
90
|
-
}
|
91
|
-
}]
|
92
|
-
}]
|
93
|
-
}
|
94
|
-
assert_legend_info_result_layer(expected, item)
|
95
|
-
end
|
96
|
-
|
97
|
-
def assert_legend_info_result_layer_3(item, image_return_type = :image_data)
|
98
|
-
expected = {
|
99
|
-
:layer_id => 3,
|
100
|
-
:name => 'Buildings',
|
101
|
-
:legend_groups => [{
|
102
|
-
:legend_classes => [{
|
103
|
-
:symbol_image => {
|
104
|
-
:image_return_type => image_return_type
|
105
|
-
}
|
106
|
-
}]
|
107
|
-
}]
|
108
|
-
}
|
109
|
-
assert_legend_info_result_layer(expected, item)
|
110
|
-
end
|
111
|
-
|
112
|
-
def assert_legend_info_result_layer_4(item, image_return_type = :image_data)
|
113
|
-
expected = {
|
114
|
-
:layer_id => 4,
|
115
|
-
:name => 'Zoning',
|
116
|
-
:legend_groups => [{
|
117
|
-
:legend_classes => [{
|
118
|
-
:label => 'Commercial',
|
119
|
-
:symbol_image => {
|
120
|
-
:image_return_type => image_return_type
|
121
|
-
}
|
122
|
-
}, {
|
123
|
-
:label => 'Industrial',
|
124
|
-
:symbol_image => {
|
125
|
-
:image_return_type => image_return_type
|
126
|
-
}
|
127
|
-
}, {
|
128
|
-
:label => 'Residential',
|
129
|
-
:symbol_image => {
|
130
|
-
:image_return_type => image_return_type
|
131
|
-
}
|
132
|
-
}, {
|
133
|
-
:label => 'Mixed use',
|
134
|
-
:symbol_image => {
|
135
|
-
:image_return_type => image_return_type
|
136
|
-
}
|
137
|
-
}, {
|
138
|
-
:label => 'Parks and open space',
|
139
|
-
:symbol_image => {
|
140
|
-
:image_return_type => image_return_type
|
141
|
-
}
|
142
|
-
}, {
|
143
|
-
:label => 'Rural',
|
144
|
-
:symbol_image => {
|
145
|
-
:image_return_type => image_return_type
|
146
|
-
}
|
147
|
-
}]
|
148
|
-
}]
|
149
|
-
}
|
150
|
-
assert_legend_info_result_layer(expected, item)
|
151
|
-
end
|
152
|
-
|
153
|
-
def assert_legend_info_result_layer(expected, actual)
|
154
|
-
assert_equal expected[:layer_id], actual[:layer_id]
|
155
|
-
assert_equal expected[:name], actual[:name]
|
156
|
-
# check the legend groups
|
157
|
-
assert_equal expected[:legend_groups].length, actual[:legend_groups].length
|
158
|
-
actual[:legend_groups].each do |legend_group|
|
159
|
-
assert_legend_group expected[:legend_groups].shift, legend_group
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
def assert_legend_group(expected, actual)
|
164
|
-
assert_equal expected[:heading], actual[:heading]
|
165
|
-
# check the legend classes
|
166
|
-
assert_equal expected[:legend_classes].length, actual[:legend_classes].length
|
167
|
-
actual[:legend_classes].each do |legend_class|
|
168
|
-
assert_legend_class expected[:legend_classes].shift, legend_class
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
def assert_legend_class(expected, actual)
|
173
|
-
assert_equal expected[:label], actual[:label]
|
174
|
-
assert_equal expected[:description], actual[:description]
|
175
|
-
assert_symbol_image(expected[:symbol_image] || {}, actual[:symbol_image])
|
176
|
-
assert_transparent_color(expected[:transparent_color] || {}, actual[:transparent_color])
|
177
|
-
end
|
178
|
-
|
179
|
-
def assert_symbol_image(expected, actual)
|
180
|
-
assert_not_nil actual[expected[:image_return_type]]
|
181
|
-
assert_equal expected[:image_height] || 16, actual[:image_height]
|
182
|
-
assert_equal expected[:image_width] || 20, actual[:image_width]
|
183
|
-
assert_equal expected[:image_dpi] || 96, actual[:image_dpi]
|
184
|
-
end
|
185
|
-
|
186
|
-
def assert_transparent_color(expected, actual)
|
187
|
-
assert_equal expected[:use_windows_dithering] || true, actual[:use_windows_dithering]
|
188
|
-
assert_equal expected[:alpha_value] || 255, actual[:alpha_value]
|
189
|
-
assert_equal expected[:red] || 254, actual[:red]
|
190
|
-
assert_equal expected[:green] || 255, actual[:green]
|
191
|
-
assert_equal expected[:blue] || 255, actual[:blue]
|
192
|
-
end
|
193
|
-
end
|