Skip to content
Snippets Groups Projects
Commit 9c313da0 authored by Alex Reisner's avatar Alex Reisner
Browse files

Merge pull request #315 from modeset/master

Implement actual Mapquest API, not just as a proxy for Nominatim.
Add support for the premium (paid) service.
parents 8a403373 50c1ac7d
No related branches found
No related tags found
No related merge requests found
......@@ -363,8 +363,11 @@ The following is a comparison of the supported geocoding APIs. The "Limitations"
#### Mapquest (`:mapquest`)
* **API key**: none
* **API key**: required for the licensed API, do not use for open tier
* **Quota**: ?
* **HTTP Headers**: in order to use the licensed API you can configure the http_headers to include a referer as so:
`Geocoder::Configuration.http_headers = { "Referer" => "http://foo.com" }`
You can also allow a blank referer from the API management console via mapquest but it is potentially a security risk that someone else could use your API key from another domain.
* **Region**: world
* **SSL support**: no
* **Languages**: English
......
require 'cgi'
require 'geocoder/lookups/base'
require "geocoder/lookups/nominatim"
require "geocoder/results/mapquest"
module Geocoder::Lookup
class Mapquest < Nominatim
class Mapquest < Base
private # ---------------------------------------------------------------
def query_url(query)
method = query.reverse_geocode? ? "reverse" : "search"
"http://open.mapquestapi.com/#{method}?" + url_query_string(query)
key = Geocoder::Configuration.api_key
domain = key ? "www" : "open"
url = "http://#{domain}.mapquestapi.com/geocoding/v1/#{search_type(query)}?"
url + url_query_string(query)
end
def search_type(query)
query.reverse_geocode? ? "reverse" : "address"
end
def query_url_params(query)
key = Geocoder::Configuration.api_key
params = { :location => query.sanitized_text }
if key
params[:key] = CGI.unescape(key)
end
super.merge(params)
end
def results(query)
return [] unless doc = fetch_data(query)
doc["results"][0]['locations']
end
end
end
require 'geocoder/results/base'
require 'geocoder/results/nominatim'
module Geocoder::Result
class Mapquest < Nominatim
class Mapquest < Base
def latitude
@data["latLng"]["lat"]
end
def longitude
@data["latLng"]["lng"]
end
def coordinates
[latitude, longitude]
end
def city
@data['adminArea5']
end
def street
@data['street']
end
def state
@data['adminArea3']
end
alias_method :state_code, :state
#FIXME: these might not be right, unclear with MQ documentation
alias_method :provinice, :state
alias_method :province_code, :state
def postal_code
@data['postalCode'].to_s
end
def country
@data['adminArea1']
end
def country_code
country
end
def address
[street, city, state, postal_code, country].reject{|s| s.length == 0 }.join(", ")
end
end
end
[
{
"place_id":"2177656031",
"licence":"Data Copyright OpenStreetMap Contributors, Some Rights Reserved. CC-BY-SA 2.0.",
"osm_type":"way",
"osm_id":"138141251",
"boundingbox":["40.7498588562012","40.751163482666","-73.9944381713867","-73.9925842285156"],
"polygonpoints":[["-73.9944367","40.7505417"],["-73.9940278","40.7511034"],["-73.9939442","40.7510658"],["-73.9938776","40.7510941"],["-73.9937734","40.7511298"],["-73.9936562","40.7511561"],["-73.993619","40.7511624"],["-73.9935537","40.7510862"],["-73.9935336","40.7510885"],["-73.9934248","40.7510898"],["-73.9933248","40.7510806"],["-73.9932268","40.7510614"],["-73.9931334","40.7510327"],["-73.9930378","40.7509909"],["-73.9929554","40.7509421"],["-73.9928865","40.7508886"],["-73.992821","40.7508216"],["-73.9927742","40.7507572"],["-73.9926591","40.7507581"],["-73.9926036","40.750603"],["-73.992704","40.7505536"],["-73.9927029","40.7505065"],["-73.9925855","40.7505009"],["-73.9925989","40.7503952"],["-73.9926442","40.7504003"],["-73.9926722","40.7503155"],["-73.9927117","40.7502402"],["-73.9927617","40.7501715"],["-73.992824","40.7501067"],["-73.9928991","40.7500484"],["-73.992869","40.7500159"],["-73.9929742","40.749956"],["-73.9930375","40.7500318"],["-73.9931229","40.7499938"],["-73.9931273","40.7499005"],["-73.9933201","40.7498624"],["-73.9933853","40.7499355"],["-73.993402","40.7499336"],["-73.9935038","40.749932"],["-73.9936041","40.7499407"],["-73.9936962","40.7499579"],["-73.9937875","40.7499846"],["-73.9938783","40.7500221"],["-73.9939639","40.7500701"],["-73.9940328","40.7501206"],["-73.9940991","40.7501842"],["-73.9941506","40.7502504"],["-73.9941562","40.7502603"],["-73.9942791","40.7502628"],["-73.9942969","40.7503035"],["-73.9943271","40.7503844"],["-73.9943435","40.7504689"],["-73.9943454","40.7505049"],["-73.9944367","40.7505417"]],
"lat":"40.7505206016777",
"lon":"-73.993490694181",
"display_name":"Madison Square Garden, 46, West 31st Street, Chelsea, New York City, New York, United States of America",
"class":"leisure",
"type":"stadium",
"address":{
"stadium":"Madison Square Garden",
"house_number":"46",
"road":"West 31st Street",
"suburb":"Chelsea",
"city":"New York City",
"county":"New York",
"state":"New York",
"postcode":"10119",
"country":"United States of America",
"country_code":"us"
{
"results": [
{
"locations": [
{
"latLng": {
"lng": -73.994637,
"lat": 40.720409
},
"adminArea4": "New York County",
"adminArea5Type": "City",
"adminArea4Type": "County",
"adminArea5": "New York",
"street": "46 West 31st Street",
"adminArea1": "US",
"adminArea3": "NY",
"type": "s",
"displayLatLng": {
"lng": -73.994637,
"lat": 40.720409
},
"linkId": 0,
"postalCode": "10001",
"sideOfStreet": "N",
"dragPoint": false,
"adminArea1Type": "Country",
"geocodeQuality": "CITY",
"geocodeQualityCode": "A5XAX",
"mapUrl": "http://www.mapquestapi.com/staticmap/v3/getmap?type=map&size=225,160&pois=purple-1,40.720409,-73.994637,0,0|&center=40.720409,-73.994637&zoom=9&key=Gmjtd|luua2hu2nd,7x=o5-lz8lg&rand=604519389",
"adminArea3Type": "State"
}
],
"providedLocation": {
"location": "Madison Square Garden, New York, NY"
}
}
],
"options": {
"ignoreLatLngInput": false,
"maxResults": -1,
"thumbMaps": true
},
"info": {
"copyright": {
"text": "© 2012 MapQuest, Inc.",
"imageUrl": "http://api.mqcdn.com/res/mqlogo.gif",
"imageAltText": "© 2012 MapQuest, Inc."
},
"statuscode": 0,
"messages": []
}
]
}
[]
{
"results": [
{
"locations": []
}
]
}
......@@ -154,7 +154,7 @@ class ServicesTest < Test::Unit::TestCase
# --- Nominatim ---
def test_nominatim_result_components
def test_nominatim_result_components
Geocoder::Configuration.lookup = :nominatim
result = Geocoder.search("Madison Square Garden, New York, NY").first
assert_equal "10001", result.postal_code
......@@ -166,4 +166,29 @@ class ServicesTest < Test::Unit::TestCase
assert_equal "Madison Square Garden, West 31st Street, Long Island City, New York City, New York, 10001, United States of America",
result.address
end
# --- MapQuest ---
def test_api_route
Geocoder::Configuration.lookup = :mapquest
Geocoder::Configuration.api_key = "abc123"
lookup = Geocoder::Lookup::Mapquest.new
query = Geocoder::Query.new("Bluffton, SC")
res = lookup.send(:query_url, query)
assert_equal "http://www.mapquestapi.com/geocoding/v1/address?key=abc123&location=Bluffton%2C+SC",
res
end
def test_mapquest_result_components
Geocoder::Configuration.lookup = :mapquest
result = Geocoder.search("Madison Square Garden, New York, NY").first
assert_equal "10001", result.postal_code
end
def test_mapquest_address_formatting
Geocoder::Configuration.lookup = :mapquest
result = Geocoder.search("Madison Square Garden, New York, NY").first
assert_equal "46 West 31st Street, New York, NY, 10001, US",
result.address
end
end
......@@ -176,7 +176,7 @@ module Geocoder
end
end
class Mapquest < Nominatim
class Mapquest < Base
private #-----------------------------------------------------------------
def fetch_raw_data(query)
raise TimeoutError if query.text == "timeout"
......
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