diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..73f69e095 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/geocoder.iml b/.idea/geocoder.iml new file mode 100644 index 000000000..dccff1c66 --- /dev/null +++ b/.idea/geocoder.iml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..8a4f1abbb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..e589fae76 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README_API_GUIDE.md b/README_API_GUIDE.md index 6499280bd..b30a340d9 100644 --- a/README_API_GUIDE.md +++ b/README_API_GUIDE.md @@ -268,6 +268,27 @@ The [Google Places Search API](https://developers.google.com/maps/documentation/ * **Terms of Service**: https://www.melissa.com/terms * **Limitations**: ? +### NetToolKit (`:net_tool_kit`) + +* **API key**: required, but added to HTTP Headers (See below) +* **Key signup**: https://www.nettoolkit.com/pricing +* **Quota**: ? +* **HTTP Headers**: you can specify the API key and a referer like so: + ``` + Geocoder.configure( + http_headers: { + "X-NTK-KEY" => ENV["NET_TOOL_KIT_API_KEY"], + "Referer" => "http://foo.com" + } + ) + ``` +* **Region**: world +* **SSL support**: yes +* **Languages**: English +* **Documentation**: https://www.nettoolkit.com/docs/overview +* **Terms of Service**: https://www.nettoolkit.com/terms +* **Limitations**: ? + ### Nominatim (`:nominatim`) * **API key**: none diff --git a/lib/geocoder/lookup.rb b/lib/geocoder/lookup.rb index 7c23dabd2..7c17560c2 100644 --- a/lib/geocoder/lookup.rb +++ b/lib/geocoder/lookup.rb @@ -42,6 +42,7 @@ def street_services :geocoder_ca, :yandex, :nationaal_georegister_nl, + :net_tool_kit, :nominatim, :mapbox, :mapquest, diff --git a/lib/geocoder/lookups/net_tool_kit.rb b/lib/geocoder/lookups/net_tool_kit.rb new file mode 100644 index 000000000..3af50012a --- /dev/null +++ b/lib/geocoder/lookups/net_tool_kit.rb @@ -0,0 +1,65 @@ +require 'geocoder/lookups/base' +require 'geocoder/results/net_tool_kit' + +module Geocoder::Lookup + class NetToolKit < Base + + def name + 'NetToolKit' + end + + def supported_protocols + [:https] + end + + private # --------------------------------------------------------------- + + def base_query_url(query) + "#{protocol}://api.nettoolkit.com/v1/geo/#{search_type(query)}?version=2&" + end + + def search_type(query) + query.reverse_geocode? ? 'reverse-geocodes' : 'geocodes' + end + + def query_url_params(query) + params = { address: query.sanitized_text } + + [:provider].each do |option| + unless (option_value = query.options[option]).nil? + params[option] = option_value + end + end + + params.merge(super) + end + + def results(query) + return [] unless doc = fetch_data(query) + return doc['results'] if doc['code'] == 1000 || doc['code'] == 1001 + + messages = doc['message'] + case doc['code'] + when 2002, 2003, 2004, 2005 + raise_error(Geocoder::ServiceUnavailable, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + when 3000 + raise_error(Geocoder::RequestDenied, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + when 3001, 3003 + raise_error(Geocoder::OverQueryLimitError, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + when 3002 + raise_error(Geocoder::InvalidApiKey, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + when 4000, 4001, 4002 + raise_error(Geocoder::InvalidRequest, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + else + raise_error(Geocoder::Error, messages) || + Geocoder.log(:warn, "NetToolKit Geocoding API error: #{messages}") + end + end + + end +end diff --git a/lib/geocoder/results/net_tool_kit.rb b/lib/geocoder/results/net_tool_kit.rb new file mode 100644 index 000000000..026c35cfc --- /dev/null +++ b/lib/geocoder/results/net_tool_kit.rb @@ -0,0 +1,62 @@ +require 'geocoder/results/base' + +module Geocoder::Result + class NetToolKit < Base + + def address + @data['address'] + end + + def coordinates + %w[latitude longitude].map{ |l| @data[l] } + end + + def house_number + @data['house_number'] + end + + def street + @data['street'] + end + + def street_name + @data['street_name'] + end + + def street_type + @data['street_type'] + end + + def city + @data['city'] + end + + def county + @data['county'] + end + + def state + @data['state'] + end + + def state_code + @data['state_code'] + end + + def postal_code + @data['postcode'] + end + + def precision + @data['precision'] + end + + def provider + @data['provider'] + end + + def ntk_geocode_time + @data['ntk_geocode_time'] + end + end +end