Skip to content
Snippets Groups Projects
Commit 004cd6af authored by Christoph Bünte's avatar Christoph Bünte Committed by Christoph Bünte
Browse files

Add support for Nokia's here.com geocoder.

parent 8fa9b3ea
No related branches found
No related tags found
No related merge requests found
...@@ -478,6 +478,17 @@ Yahoo BOSS is **not a free service**. As of November 17, 2012 Yahoo no longer of ...@@ -478,6 +478,17 @@ Yahoo BOSS is **not a free service**. As of November 17, 2012 Yahoo no longer of
* **Terms of Service**: http://www.developer.nokia.com/Develop/Maps/TC.html * **Terms of Service**: http://www.developer.nokia.com/Develop/Maps/TC.html
* **Limitations**: ? * **Limitations**: ?
#### Here/Nokia (`:here`)
* **API key**: required
* **Quota**: Depending on the API key
* **Region**: world
* **SSL support**: yes
* **Languages**: The preferred language of address elements in the result. Language code must be provided according to RFC 4647 standard.
* **Documentation**: http://developer.here.com/rest-apis/documentation/geocoder
* **Terms of Service**: http://developer.here.com/faqs#l&t
* **Limitations**: ?
#### ESRI (`:esri`) #### ESRI (`:esri`)
* **API key**: none * **API key**: none
......
...@@ -33,6 +33,7 @@ module Geocoder ...@@ -33,6 +33,7 @@ module Geocoder
:nominatim, :nominatim,
:mapquest, :mapquest,
:ovi, :ovi,
:here,
:baidu, :baidu,
:cloudmade, :cloudmade,
:geocodio, :geocodio,
......
require 'geocoder/lookups/base'
require 'geocoder/results/here'
module Geocoder::Lookup
class Here < Base
def name
"Here"
end
def required_api_key_parts
[]
end
def query_url(query)
"#{protocol}://#{if query.reverse_geocode? then 'reverse.' end}geocoder.api.here.com/6.2/#{if query.reverse_geocode? then 'reverse' end}geocode.json?" + url_query_string(query)
end
private # ---------------------------------------------------------------
def results(query)
return [] unless doc = fetch_data(query)
return [] unless doc['Response'] && doc['Response']['View']
if r=doc['Response']['View']
return [] if r.nil? || !r.is_a?(Array) || r.empty?
return r.first['Result']
end
[]
end
def query_url_params(query)
options = {
:gen=>4,
:app_id=>api_key,
:app_code=>api_code
}
if query.reverse_geocode?
super.merge(options).merge(
:prox=>query.sanitized_text,
:mode=>:retrieveAddresses
)
else
super.merge(options).merge(
:searchtext=>query.sanitized_text
)
end
end
def api_key
if a=configuration.api_key
return a.first if a.is_a?(Array)
end
end
def api_code
if a=configuration.api_key
return a.last if a.is_a?(Array)
end
end
end
end
require 'geocoder/results/base'
module Geocoder::Result
class Here < Base
##
# A string in the given format.
#
def address(format = :full)
address_data['Label']
end
##
# A two-element array: [lat, lon].
#
def coordinates
fail unless d = @data['Location']['DisplayPosition']
[d['Latitude'].to_f, d['Longitude'].to_f]
end
def state
address_data['County']
end
def province
address_data['County']
end
def postal_code
address_data['PostalCode']
end
def city
address_data['City']
end
def state_code
address_data['State']
end
def province_code
address_data['State']
end
def country
fail unless d = address_data['AdditionalData']
if v = d.find{|ad| ad['key']=='CountryName'}
return v['value']
end
end
def country_code
address_data['Country']
end
private # ----------------------------------------------------------------
def address_data
@data['Location']['Address'] || fail
end
end
end
{
"Response": {
"MetaInfo": {
"Timestamp": "2013-02-08T16:26:39.382+0000"
},
"View": [
{
"_type": "SearchResultsViewType",
"ViewId": 0,
"Result": [
{
"Relevance": 1.0,
"MatchLevel": "houseNumber",
"MatchQuality": {
"State": 1.0,
"City": 1.0,
"Street": [
1.0
],
"HouseNumber": 1.0
},
"MatchType": "pointAddress",
"Location": {
"LocationId": "NT_ArsGdYbpo6dqjPQel9gTID_4",
"LocationType": "point",
"DisplayPosition": {
"Latitude": 40.7504692,
"Longitude": -73.9933777
},
"NavigationPosition": [
{
"Latitude": 40.7500305,
"Longitude": -73.9942398
}
],
"MapView": {
"TopLeft": {
"Latitude": 40.7515934,
"Longitude": -73.9948616
},
"BottomRight": {
"Latitude": 40.7493451,
"Longitude": -73.9918938
}
},
"Address": {
"Label": "4 Penn Plz, New York, NY 10001, United States",
"Country": "USA",
"State": "NY",
"County": "New York",
"City": "New York",
"Street": "Penn Plz",
"HouseNumber": "4",
"PostalCode": "10001",
"AdditionalData": [
{
"value": "United States",
"key": "CountryName"
},
{
"value": "New York",
"key": "StateName"
}
]
}
}
}
]
}
]
}
}
{
"Response": {
"MetaInfo": {
"Timestamp": "2013-02-08T16:41:16.723+0000"
},
"View": []
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment