miami_dade_geo 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 210a82e58eb4f992fa654034a01607526b98802a
4
- data.tar.gz: 10d42cedd1ca2c88dd62fe9d6d5ba8842a487519
3
+ metadata.gz: a277a7b75e101dc40eb9f482a18e1707ddcbe0a9
4
+ data.tar.gz: bcc7ed55b71bf645472550ef5da262df6290a0df
5
5
  SHA512:
6
- metadata.gz: 389e3de1c57bab9936f87708e8c40b96cce18d71620d492f01b1df1b87907a96645f5e32550e528a6e6f9984dcbcb2a54db2c630ced36cdb50d36047696ad1c7
7
- data.tar.gz: 829b850d956e8a7b3dac2ca62bf71f63470a3b48842a4a2bb0cfd4a39147d062bed4e5acc1f1303e51f3c133df9e8164ac5849d3deb58492cc0fe7bff3697cd8
6
+ metadata.gz: 7d9d4718cac3630a5ac9f54caa40e4a977fc07b64924f6a15810eef7722846f079ad06e85edca2dfa36928e1f0dbb739d10fa6753745e7a983e960f039aeace7
7
+ data.tar.gz: d07dfb923f7f5122dbc3260fd1c3e04969590762c08f029de60d989b7200999243f8cdc0dc165c825f165284e402d743a887802271a4c195664579cba2cce1b4
@@ -3,3 +3,5 @@ language: ruby
3
3
  rvm:
4
4
  - 2.3.1
5
5
  before_install: gem install bundler -v 1.12.3
6
+ notifications:
7
+ email: false
data/README.md CHANGED
@@ -5,13 +5,13 @@ This library wraps some of the Miami-Dade County geospatial services, including:
5
5
  * Address to NAD 83 State Plane X and Y coordinate
6
6
  * NAD 83 State Plane X and Y coordinate to latitude and longitude
7
7
 
8
- ## Installation
8
+ # Installation #
9
9
 
10
10
  Add this line to your application's Gemfile:
11
11
 
12
- ```ruby
12
+ ~~~ruby
13
13
  gem 'miami_dade_geo'
14
- ```
14
+ ~~~
15
15
 
16
16
  And then execute:
17
17
 
@@ -23,7 +23,47 @@ Or install it yourself as:
23
23
 
24
24
  ## Usage
25
25
 
26
- TODO: Write usage instructions here
26
+ ### Coordinate to Address
27
+
28
+ ~~~ruby
29
+ coordinate = MiamiDadeGeo::Coordinate.new(long: -80.199245566240819,
30
+ lat: 25.7999410593211)
31
+ addr = coordinate.address
32
+ addr.address #=> "2390 NW 2ND AVE"
33
+ addr.zip #=> 33127
34
+ ~~~
35
+
36
+ ### Address to Coordinate
37
+
38
+ ~~~ruby
39
+ addr = MiamiDadeGeo::Address.new '2390 NW 2nd Ave'
40
+ addr.zip #=> 33127
41
+ addr.lat #=> 25.7999410593211
42
+ addr.long #=> -80.199245566240819
43
+ addr.municipality.name #=> "MIAMI"
44
+ ~~~
45
+
46
+ ### Coordinate to Municipality
47
+
48
+ ~~~ruby
49
+ muni = MiamiDadeGeo::Municipality.new_with_latlong(
50
+ long: -80.199245566240819,
51
+ lat: 25.7999410593211)
52
+
53
+ muni.name #=> "MIAMI"
54
+ ~~~
55
+
56
+ ## Links
57
+
58
+ * <https://rubygems.org/gems/miami_dade_geo>
59
+
60
+ * <https://github.com/jdiago/miami_dade_geo_api>
61
+
62
+ * <https://github.com/bkerley/what_municipality>
63
+
64
+ * <https://radiant-taiga-73968.herokuapp.com/address-meta?address=2390%20NW%202nd%20Ave>
65
+
66
+ * <https://what-mdc-muni.herokuapp.com>
27
67
 
28
68
  ## Development
29
69
 
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require 'yard'
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
6
+ YARD::Rake::YardocTask.new(:doc)
5
7
 
6
8
  task :default => :spec
@@ -2,6 +2,6 @@
2
2
  require "miami_dade_geo/#{f}"
3
3
  end
4
4
 
5
+ # `MiamiDadeGeo` provides geospatial data access for Miami-Dade County.
5
6
  module MiamiDadeGeo
6
- # Your code goes here...
7
7
  end
@@ -2,11 +2,31 @@ require 'singleton'
2
2
  require 'savon'
3
3
 
4
4
  module MiamiDadeGeo
5
+ # Singleton SOAP client for converting an address to NAD 83 x-y coordinates.
6
+ # Makes one SOAP request for WSDL on first instantiation.
7
+ #
8
+ # @api private
5
9
  class AddrXyClient
6
10
  include Singleton
7
11
 
12
+ # URL to AddrXy service WSDL
8
13
  WSDL_URL = "http://gisws.miamidade.gov/gisaddress/addrxy.asmx?wsdl"
9
-
14
+
15
+ def xy_for_address(address)
16
+ body = savon.
17
+ call(:xy_address, message: { myAddress: address}).
18
+ body
19
+
20
+ if body[:xy_address_response][:xy_address_result][:count] == '0'
21
+ raise MiamiDadeGeo::InvalidAddressError
22
+ end
23
+
24
+ body[:xy_address_response][:xy_address_result][:xy][:arr_xy]
25
+ end
26
+
27
+ # Returns a Savon SOAP client instance
28
+ #
29
+ # @return [Savon::Client]
10
30
  def savon
11
31
  @savon ||= Savon.client(wsdl: WSDL_URL)
12
32
  end
@@ -1,83 +1,101 @@
1
1
  require 'miami_dade_geo/addr_xy_client'
2
- require 'miami_dade_geo/latlong_client'
2
+ require 'miami_dade_geo/coordinate'
3
3
  require 'miami_dade_geo/municipality'
4
4
  require 'miami_dade_geo/errors/invalid_address_error'
5
5
 
6
6
  module MiamiDadeGeo
7
+ # A street address in Miami-Dade County.
8
+ # Lazily makes up to two SOAP requests:
9
+ # one to get the X and Y coordinates, and one to convert them to standard
10
+ # latitude and longitude.
11
+ #
12
+ # Can raise an [InvalidAddressError] when lazily making the initial SOAP
13
+ # request if the given address does not exist.
14
+ #
15
+ # @raise [InvalidAddressError]
7
16
  class Address
17
+ attr_reader :feature
18
+
19
+ # @!attribute [r] address
20
+ # @return [String] the street address
8
21
  attr_reader :address
9
22
 
10
- def initialize(address)
11
- @address = address
23
+ # @!attribute [rw] zip
24
+ # @return [String] the ZIP code
25
+ attr_accessor :zip
26
+
27
+ # Construct the address object
28
+ # @param address [String] the street address
29
+ def self.new_from_address(address)
30
+ xy = AddrXyClient.instance.xy_for_address(address)
31
+
32
+ Coordinate.new(xy).address
33
+ end
34
+
35
+ def self.new_from_feature(feature)
36
+ new feature
37
+ end
38
+
39
+ # @return [Coordinate] a coordinate object representing where this address
40
+ # even is
41
+ def coordinate
42
+ @coordinate ||= Coordinate.new xy_addr
12
43
  end
13
44
 
45
+ # @return [Float] the x-coordinate of the address
14
46
  def x
15
- @x ||= xy_addr[:x].to_f
47
+ coordinate.x
16
48
  end
17
49
 
50
+ # @return [Float] the y-coordinate of the address
18
51
  def y
19
- @y ||= xy_addr[:y].to_f
52
+ coordinate.y
20
53
  end
21
54
 
55
+ # @return [Integer] the ZIP code of the address
22
56
  def zip
23
57
  @zip ||= xy_addr[:zip_code].to_i
24
58
  end
25
59
 
60
+ # @return [Integer] the municipality code of the address
26
61
  def munic_code
27
62
  @munic_code ||= xy_addr[:munic_code].to_i
28
63
  end
29
64
 
65
+ # @return [Float] the latitude of the address
30
66
  def lat
31
- @lat ||= latlong[:lat]
67
+ coordinate.lat
32
68
  end
33
69
 
70
+ # @return [Float] the longitude of the address
34
71
  def long
35
- @long ||= latlong[:long]
72
+ coordinate.long
36
73
  end
37
74
 
75
+ # Constructs and returns a {Municipality} object. Makes one SOAP request.
76
+ # @return [Municipality]
38
77
  def municipality
39
78
  @municipality ||= Municipality.new_with_code(munic_code)
40
79
  end
41
80
 
81
+ def address
82
+ @address ||= [feature[:hse_num], feature[:sname]].join ' '
83
+ end
84
+
42
85
  private
43
86
 
44
- def latlong
45
- return @latlong if defined? @latlong
46
- body = latlong_client.
47
- call(:get_lat_long_dec_from_xy,
48
- message: { 'X' => x.to_s, 'Y' => y.to_s} ).
49
- body
50
-
51
- resp = body[:get_lat_long_dec_from_xy_response]
52
- result = resp[:get_lat_long_dec_from_xy_result]
53
- double = result[:double]
54
-
55
- @latlong = {
56
- long: double[0].to_f,
57
- lat: double[1].to_f
58
- }
87
+ def initialize(feature)
88
+ @feature = feature
59
89
  end
60
90
 
61
91
  def xy_addr
62
92
  return @xy_addr if defined? @xy_addr
63
93
 
64
- body = addr_xy_client.
65
- call(:xy_address, message: { myAddress: address}).
66
- body
67
-
68
- if body[:xy_address_response][:xy_address_result][:count] == '0'
69
- raise MiamiDadeGeo::InvalidAddressError
70
- end
71
-
72
- @xy_addr = body[:xy_address_response][:xy_address_result][:xy][:arr_xy]
94
+ @xy_addr = addr_xy_client.xy_for_address(address)
73
95
  end
74
96
 
75
97
  def addr_xy_client
76
- AddrXyClient.instance.savon
77
- end
78
-
79
- def latlong_client
80
- LatlongClient.instance.savon
98
+ AddrXyClient.instance
81
99
  end
82
100
  end
83
101
  end
@@ -0,0 +1,101 @@
1
+ require 'miami_dade_geo/latlong_client'
2
+ require 'miami_dade_geo/get_closest_feature_client'
3
+
4
+ module MiamiDadeGeo
5
+ class Coordinate
6
+ def initialize(opts)
7
+ if opts[:x] && opts[:y]
8
+ initialize_from_xy opts
9
+ elsif
10
+ opts[:lat] && opts[:long]
11
+ initialize_from_latlong opts
12
+ else
13
+ fail ArgumentError "Can't initialize without x & y or lat & long"
14
+ end
15
+ end
16
+
17
+ def initialize_from_xy(opts)
18
+ @x = opts[:x].to_f
19
+ @y = opts[:y].to_f
20
+ end
21
+
22
+ def initialize_from_latlong(opts)
23
+ @lat = opts[:lat].to_f
24
+ @long = opts[:long].to_f
25
+ end
26
+
27
+ def x
28
+ return @x if @x
29
+ load_xy_from_latlong
30
+ @x
31
+ end
32
+
33
+ def y
34
+ return @y if @y
35
+ load_xy_from_latlong
36
+ @y
37
+ end
38
+
39
+ def lat
40
+ return @lat if @lat
41
+ load_latlong_from_xy
42
+ @lat
43
+ end
44
+
45
+ def long
46
+ return @long if @long
47
+ load_latlong_from_xy
48
+ @long
49
+ end
50
+
51
+ def xy
52
+ { x: x, y: y }
53
+ end
54
+
55
+ def latlong
56
+ { lat: lat, long: long }
57
+ end
58
+
59
+ def address
60
+ return @address if defined? @address
61
+ feature = get_closest_feature_client.find_feature(xy, 'GeoAddress')
62
+
63
+ @address = Address.new_from_feature feature
64
+ end
65
+
66
+ private
67
+ def load_xy_from_latlong
68
+ body = latlong_client.
69
+ call(:get_x_yfrom_lat_long_dec,
70
+ message: { 'LNG' => long.to_s, 'LAT' => lat.to_s}).
71
+ body
72
+
73
+ resp = body[:get_x_yfrom_lat_long_dec_response]
74
+ result = resp[:get_x_yfrom_lat_long_dec_result]
75
+
76
+ @x = result[:double][0].to_f
77
+ @y = result[:double][1].to_f
78
+ end
79
+
80
+ def load_latlong_from_xy
81
+ body = latlong_client.
82
+ call(:get_lat_long_dec_from_xy,
83
+ message: { 'X' => x.to_s, 'Y' => y.to_s} ).
84
+ body
85
+
86
+ resp = body[:get_lat_long_dec_from_xy_response]
87
+ result = resp[:get_lat_long_dec_from_xy_result]
88
+
89
+ @lat = result[:double][1].to_f
90
+ @long = result[:double][0].to_f
91
+ end
92
+
93
+ def get_closest_feature_client
94
+ GetClosestFeatureClient.instance
95
+ end
96
+
97
+ def latlong_client
98
+ LatlongClient.instance.savon
99
+ end
100
+ end
101
+ end
@@ -1,4 +1,5 @@
1
1
  module MiamiDadeGeo
2
+ # Parent class for all errors this gem will raise.
2
3
  class Error < StandardError
3
4
  end
4
5
  end
@@ -1,6 +1,7 @@
1
1
  require 'miami_dade_geo/errors/base'
2
2
 
3
3
  module MiamiDadeGeo
4
+ # Error raised when an address cannot be found.
4
5
  class InvalidAddressError < Error
5
6
  end
6
7
  end
@@ -2,11 +2,23 @@ require 'singleton'
2
2
  require 'savon'
3
3
 
4
4
  module MiamiDadeGeo
5
+ # Singleton SOAP client for searching geographic attributes. Used to search
6
+ # for municipalities by name or `munic_code`. Makes one SOAP request for WSDL
7
+ # on first instantiation.
8
+ #
9
+ # @api private
5
10
  class GeoAttributeClient
6
11
  include Singleton
7
12
 
13
+ # URL to GeoAttribute service WSDL
8
14
  WSDL_URL = "http://gisws.miamidade.gov/gisdata/GeoAttribute.asmx?wsdl"
9
15
 
16
+ # Performs a search for geo-attributes.
17
+ #
18
+ # @param [String] table the table to search
19
+ # @param [String] field_name the field/column to search in the given table
20
+ # @param [String] value string value to search in the given field and table
21
+ # @return [Hash] search results
10
22
  def all_fields(table, field_name, value)
11
23
  body = savon.
12
24
  call(:get_all_fields_records_given_a_field_name_and_value,
@@ -29,7 +41,10 @@ module MiamiDadeGeo
29
41
  fail "Unexpected polys #{polys.class.name}, wanted Array or Hash"
30
42
  end
31
43
  end
32
-
44
+
45
+ # Returns a Savon SOAP client instance
46
+ #
47
+ # @return [Savon::Client]
33
48
  def savon
34
49
  @savon ||= Savon.client(wsdl: WSDL_URL)
35
50
  end
@@ -2,11 +2,55 @@ require 'singleton'
2
2
  require 'savon'
3
3
 
4
4
  module MiamiDadeGeo
5
+ # Singleton SOAP client for finding features close to a given point.
6
+ # Makes one SOAP request for WSDL on first instantiation.
7
+ #
8
+ # @api private
5
9
  class GetClosestFeatureClient
6
10
  include Singleton
7
11
 
8
- WSDL_URL = "http://gisws.miamidade.gov/gisxyservices/GetClosestFeature.asmx?wsdl"
12
+ # URL to GetClosestFeature service WSDL
13
+ WSDL_URL =
14
+ "http://gisws.miamidade.gov/gisxyservices/GetClosestFeature.asmx?wsdl"
9
15
 
16
+ FIND_RADIUSES = [0, 10, 100, 1000, 5280, (20 * 5280)]
17
+
18
+ def find_feature(xy_hash, feature_class)
19
+ FIND_RADIUSES.each do |radius|
20
+ result = get_closest_feature(feature_class,
21
+ xy_hash[:x].to_s,
22
+ xy_hash[:y].to_s,
23
+ radius.to_s)
24
+
25
+ return result unless result.nil?
26
+ end
27
+
28
+ nil
29
+ end
30
+
31
+ def get_closest_feature(feature_class, x, y, buffer)
32
+ body = savon.
33
+ call(:get_closest_feature_from_xy_all_atrbts,
34
+ message: {
35
+ 'X' => x,
36
+ 'Y' => y,
37
+ 'Buffer' => buffer,
38
+ 'NameOfFeatureClass' => feature_class
39
+ }).
40
+ body
41
+
42
+ begin
43
+ resp = body[:get_closest_feature_from_xy_all_atrbts_response]
44
+ rslt = resp[:get_closest_feature_from_xy_all_atrbts_result]
45
+ poly = rslt[:diffgram][:document_element][:results]
46
+ rescue
47
+ nil
48
+ end
49
+ end
50
+
51
+ # Returns a Savon SOAP client instance
52
+ #
53
+ # @return [Savon::Client]
10
54
  def savon
11
55
  @savon ||= Savon.client(wsdl: WSDL_URL)
12
56
  end
@@ -2,12 +2,21 @@ require 'singleton'
2
2
  require 'savon'
3
3
 
4
4
  module MiamiDadeGeo
5
+ # Singleton SOAP client for converting NAD 83 x-y coordinates to latitude and
6
+ # longitude, and back again. Makes one SOAP request for WSDL on first
7
+ # instantiation.
8
+ #
9
+ # @api private
5
10
  class LatlongClient
6
11
  include Singleton
7
12
 
13
+ # URL to XyLatLongConversions SOAP service WSDL
8
14
  WSDL_URL =
9
15
  "http://gisws.miamidade.gov/gisxyservices/XYLatLongConversions.asmx?wsdl"
10
-
16
+
17
+ # Returns a Savon SOAP client instance
18
+ #
19
+ # @return [Savon::Client]
11
20
  def savon
12
21
  @savon ||= Savon.client(wsdl: WSDL_URL)
13
22
  end
@@ -3,9 +3,30 @@ require 'miami_dade_geo/get_closest_feature_client'
3
3
  require 'miami_dade_geo/latlong_client'
4
4
 
5
5
  module MiamiDadeGeo
6
+ # Represents one of the municipalities in Miami-Dade County, and
7
+ # unincorporated Miami-Dade County as well.
8
+ #
9
+ # Makes one or two SOAP requests on construction.
10
+ #
11
+ # Doesn't have a `new` method for construction, since there are a few
12
+ # different ways to construct it.
6
13
  class Municipality
7
- attr_reader :name, :munic_code
14
+ # @!attribute [r] name
15
+ # @return [String] the name of the municipality, or
16
+ # unincorporated MDC.
17
+ attr_reader :name
8
18
 
19
+ # @!attribute [r] munic_code
20
+ # @return [Integer] the numeric code of the municipality
21
+ attr_reader :munic_code
22
+
23
+ # Constructs a {Municipality} object for a given municipality name. The
24
+ # SOAP method called is case-sensitive, and we believe all municipalities
25
+ # to be ALL-CAPS, so this constructor capitalizes the name before searching.
26
+ #
27
+ # Useful to get the `munic_code` for a given municipality name.
28
+ #
29
+ # @param [String] name case-insensitive name of the municipality
9
30
  def self.new_with_name(name)
10
31
  canonicalized_name = name.upcase
11
32
 
@@ -17,6 +38,13 @@ module MiamiDadeGeo
17
38
  new poly
18
39
  end
19
40
 
41
+ # Constructs a {Municipality} object for a given `munic_code`. The SOAP
42
+ # method called zero-pads single-digit municipality codes, so this
43
+ # constructor converts the code to an `Integer` and formats it.
44
+ #
45
+ # Used by the {Address#municipality} method.
46
+ #
47
+ # @param [Integer] munic_code numeric code for the municipality
20
48
  def self.new_with_code(munic_code)
21
49
  canonicalized_munic_code = "%02d" % [munic_code.to_i]
22
50
 
@@ -28,23 +56,29 @@ module MiamiDadeGeo
28
56
  new poly
29
57
  end
30
58
 
59
+ # Constructs a {Municipality} object for a given x-y coordinate in
60
+ # the NAD 83 Florida state coordinate system. Calls one SOAP method.
61
+ #
62
+ # @param [Hash] xy_hash NAD 83 coordinates of a location inside a
63
+ # municipality
64
+ # @option xy_hash [Float] :x x-coordinate
65
+ # @option xy_hash [Float] :y y-coordinate
31
66
  def self.new_with_xy(xy_hash)
32
- body = GetClosestFeatureClient.instance.savon.
33
- call(:get_closest_feature_from_xy_all_atrbts,
34
- message: {
35
- 'X' => xy_hash[:x],
36
- 'Y' => xy_hash[:y],
37
- 'Buffer' => 0,
38
- 'NameOfFeatureClass' => 'municipality_poly'
39
- }).
40
- body
41
- resp = body[:get_closest_feature_from_xy_all_atrbts_response]
42
- rslt = resp[:get_closest_feature_from_xy_all_atrbts_result]
43
- poly = rslt[:diffgram][:document_element][:results]
44
-
45
- new poly
67
+ new GetClosestFeatureClient.instance.
68
+ get_closest_feature('municipality_poly',
69
+ xy_hash[:x],
70
+ xy_hash[:y],
71
+ 0)
46
72
  end
47
73
 
74
+ # Constructs a {Municipality} object for a given latitude and longitude.
75
+ # Makes two SOAP requests: one to convert from lat-long to x-y in NAD 83,
76
+ # and one to load the municipality for the NAD 83 coordinate.
77
+ #
78
+ # @param [Hash] latlong_hash latitude and longitude hash of a locatio inside
79
+ # a municipality
80
+ # @option latlong_hash [Float] :lat latitude coordinate
81
+ # @option latlong_hash [Float] :long longitude coordinate
48
82
  def self.new_with_latlong(latlong_hash)
49
83
  body = LatlongClient.instance.savon.
50
84
  call(:get_x_yfrom_lat_long_dec,
@@ -1,3 +1,4 @@
1
1
  module MiamiDadeGeo
2
- VERSION = "0.2.0"
2
+ # Current gem version
3
+ VERSION = "0.3.0"
3
4
  end
@@ -25,6 +25,8 @@ Gem::Specification.new do |spec|
25
25
  spec.add_development_dependency "vcr", "~> 3.0"
26
26
  spec.add_development_dependency 'webmock', "~> 2.1"
27
27
  spec.add_development_dependency 'guard-rspec', "~> 4.7"
28
+ spec.add_development_dependency 'yard', "~> 0.8"
29
+ spec.add_development_dependency 'kramdown', "~> 1.11"
28
30
 
29
31
  spec.add_dependency 'savon', '~> 2.11.1'
30
32
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: miami_dade_geo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bryce Kerley
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-06-04 00:00:00.000000000 Z
12
+ date: 2016-09-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -95,6 +95,34 @@ dependencies:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
97
  version: '4.7'
98
+ - !ruby/object:Gem::Dependency
99
+ name: yard
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '0.8'
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: '0.8'
112
+ - !ruby/object:Gem::Dependency
113
+ name: kramdown
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '1.11'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '1.11'
98
126
  - !ruby/object:Gem::Dependency
99
127
  name: savon
100
128
  requirement: !ruby/object:Gem::Requirement
@@ -131,6 +159,7 @@ files:
131
159
  - lib/miami_dade_geo.rb
132
160
  - lib/miami_dade_geo/addr_xy_client.rb
133
161
  - lib/miami_dade_geo/address.rb
162
+ - lib/miami_dade_geo/coordinate.rb
134
163
  - lib/miami_dade_geo/errors/base.rb
135
164
  - lib/miami_dade_geo/errors/invalid_address_error.rb
136
165
  - lib/miami_dade_geo/geo_attribute_client.rb