Skip to content
Snippets Groups Projects
Commit a951f7b7 authored by Thu Trang Pham's avatar Thu Trang Pham
Browse files

Merge pull request #975 from mdebo/feature/add_adapter_for_geoportail_lu

Add adapter for geoportail.lu (Luxembourg)
parents 54ed4634 96ae760e
No related branches found
No related tags found
No related merge requests found
......@@ -637,6 +637,16 @@ Data Science Toolkit provides an API whose reponse format is like Google's but w
* **Terms of Service**: http://www.itella.fi/liitteet/palvelutjatuotteet/yhteystietopalvelut/Postinumeropalvelut-Palvelukuvausjakayttoehdot.pdf
* **Limitations**: ?
#### Geoportail.lu (`:geoportail_lu`)
* **API key**: none
* **Quota**: none
* **Region**: LU
* **SSL support**: yes
* **Languages**: en
* **Documentation**: http://wiki.geoportail.lu/doku.php?id=en:api
* **Terms of Service**: http://wiki.geoportail.lu/doku.php?id=en:mcg_1
* **Limitations**: ?
#### PostcodeAnywhere Uk (`:postcode_anywhere_uk`)
......@@ -923,8 +933,8 @@ Now, any time Geocoder looks up "New York, NY" its results array will contain on
}
]
)
Note:
Note:
Keys must be strings not symbols when calling `add_stub` or `set_default_stub`. For example `'latitude' =>` not `:latitude =>`.
......
......@@ -44,6 +44,7 @@ module Geocoder
:smarty_streets,
:okf,
:postcode_anywhere_uk,
:geoportail_lu,
:test
]
end
......
require 'geocoder/lookups/base'
require "geocoder/results/geoportail_lu"
module Geocoder
module Lookup
class GeoportailLu < Base
def name
"Geoportail.lu"
end
def query_url(query)
url_base_path(query) + url_query_string(query)
end
private
def url_base_path(query)
query.reverse_geocode? ? reverse_geocode_url_base_path : search_url_base_path
end
def search_url_base_path
"#{protocol}://api.geoportail.lu/geocoder/search?"
end
def reverse_geocode_url_base_path
"#{protocol}://api.geoportail.lu/geocoder/reverseGeocode?"
end
def query_url_geoportail_lu_params(query)
query.reverse_geocode? ? reverse_geocode_params(query) : search_params(query)
end
def search_params(query)
{
queryString: query.sanitized_text
}
end
def reverse_geocode_params(query)
lat_lon = query.coordinates
{
lat: lat_lon.first,
lon: lat_lon.last
}
end
def query_url_params(query)
query_url_geoportail_lu_params(query).merge(super)
end
def results(query)
return [] unless doc = fetch_data(query)
if doc['success'] == true
result = doc['results']
else
result = []
raise_error(Geocoder::Error) ||
warn("Geportail.lu Geocoding API error")
end
result
end
end
end
end
require 'geocoder/results/base'
module Geocoder::Result
class GeoportailLu < Base
def coordinates
geomlonlat['coordinates'].reverse if geolocalized?
end
def address
full_address
end
def city
try_to_extract 'locality', detailled_address
end
def state
'Luxembourg'
end
def state_code
'LU'
end
def postal_code
try_to_extract 'zip', detailled_address
end
def street_address
[street_number, street].compact.join(' ')
end
def street_number
try_to_extract 'postnumber', detailled_address
end
def street
try_to_extract 'street', detailled_address
end
def full_address
data['address']
end
def geomlonlat
data['geomlonlat']
end
def detailled_address
data['AddressDetails']
end
alias_method :country, :state
alias_method :province, :state
alias_method :country_code, :state_code
alias_method :province_code, :state_code
private
def geolocalized?
try_to_extract('coordinates', geomlonlat).present?
end
def try_to_extract(key, nullable_hash)
nullable_hash.try(:[], key)
end
end
end
{
"count": 1,
"request": "2 boulevard Royal luxembourg",
"results": [
{
"ratio": 1,
"name": "2,Boulevard Royal 2449 Luxembourg",
"easting": 77201.38771169016,
"address": "2 Boulevard Royal,2449 Luxembourg",
"geomlonlat": {
"type": "Point",
"coordinates": [
6.12939750216249,
49.6146720749933
]
},
"geom": {
"type": "Point",
"coordinates": [
77201.38771169016,
75561.5290000001
]
},
"northing": 75561.5290000001,
"AddressDetails": {
"zip": "2449",
"locality": "Luxembourg",
"id_caclr_street": "55",
"street": "Boulevard Royal",
"postnumber": "2",
"id_caclr_building": "3186"
},
"matching street": "Boulevard Royal",
"accuracy": 8
}
],
"success": true
}
{
"count": 1,
"request": "no results",
"results": [
{
"geom": null,
"ratio": 0,
"name": ", ",
"address": null,
"country": null,
"AddressDetails": {
"street": null,
"locality": null,
"zip": null,
"postnumber": null
},
"matching street": null,
"accuracy": 1
}
],
"success": false
}
{
"count": 1,
"results": [
{
"distance": 55.8617929519411,
"geom": {
"type": "Point",
"coordinates": [
76866.57071788973,
75026.12585000045
]
},
"name": "39,Boulevard Prince Henri 1724 Luxembourg",
"easting": 76866.57071788973,
"address": "39 Boulevard Prince Henri,1724 Luxembourg",
"geomlonlat": {
"type": "Point",
"coordinates": [
6.12476867352074,
49.6098566608772
]
},
"AddressDetails": {
"zip": "1724",
"locality": "Luxembourg",
"id_caclr_street": "40",
"street": "Boulevard Prince Henri",
"postnumber": "39",
"id_caclr_building": "2459"
},
"matching street": "Boulevard Prince Henri",
"northing": 75026.12585000045
}
],
"success": true
}
......@@ -300,6 +300,18 @@ module Geocoder
"#{fixture_prefix}_romsey"
end
end
require 'geocoder/lookups/geoportail_lu'
class GeoportailLu
private
def fixture_prefix
"geoportail_lu"
end
def default_fixture_filename
"#{fixture_prefix}_boulevard_royal"
end
end
end
end
......
# encoding: utf-8
require 'test_helper'
class GeoportailLuTest < GeocoderTestCase
def setup
Geocoder.configure(lookup: :geoportail_lu)
end
def test_query_for_geocode
query = Geocoder::Query.new('55 route de luxembourg, pontpierre')
lookup = Geocoder::Lookup.get(:geoportail_lu)
res = lookup.query_url(query)
assert_equal 'http://api.geoportail.lu/geocoder/search?queryString=55+route+de+luxembourg%2C+pontpierre', res
end
def test_query_for_reverse_geocode
query = Geocoder::Query.new([45.423733, -75.676333])
lookup = Geocoder::Lookup.get(:geoportail_lu)
res = lookup.query_url(query)
assert_equal 'http://api.geoportail.lu/geocoder/reverseGeocode?lat=45.423733&lon=-75.676333', res
end
def test_results_component
result = Geocoder.search('2 boulevard Royal, luxembourg').first
assert_equal '2449', result.postal_code
assert_equal 'Luxembourg', result.country
assert_equal '2 Boulevard Royal,2449 Luxembourg', result.address
assert_equal '2', result.street_number
assert_equal 'Boulevard Royal', result.street
assert_equal '2 Boulevard Royal', result.street_address
assert_equal 'Luxembourg', result.city
assert_equal 'Luxembourg', result.state
assert_country_code result
assert_equal(49.6146720749933, result.coordinates[0])
assert_equal(6.12939750216249, result.coordinates[1])
end
def test_results_component_when_reverse_geocoding
result = Geocoder.search([6.12476867352074, 49.6098566608772]).first
assert_equal '1724', result.postal_code
assert_equal 'Luxembourg', result.country
assert_equal '39 Boulevard Prince Henri,1724 Luxembourg', result.address
assert_equal '39', result.street_number
assert_equal 'Boulevard Prince Henri', result.street
assert_equal '39 Boulevard Prince Henri', result.street_address
assert_equal 'Luxembourg', result.city
assert_equal 'Luxembourg', result.state
assert_country_code result
assert_equal(49.6098566608772, result.coordinates[0])
assert_equal(6.12476867352074, result.coordinates[1])
end
def test_no_results
results = Geocoder.search('no results')
assert_equal 0, results.length
end
private
def assert_country_code(result)
[:state_code, :country_code, :province_code].each do |method|
assert_equal 'LU', result.send(method)
end
end
end
......@@ -26,7 +26,7 @@ class ResultTest < GeocoderTestCase
def test_result_accepts_reverse_coords_in_reasonable_range_for_madison_square_garden
Geocoder::Lookup.street_services.each do |l|
next unless File.exist?(File.join("test", "fixtures", "#{l.to_s}_madison_square_garden"))
next if [:bing, :esri, :geocoder_ca, :geocoder_us].include? l # Reverse fixture does not match forward
next if [:bing, :esri, :geocoder_ca, :geocoder_us, :geoportail_lu].include? l # Reverse fixture does not match forward
Geocoder.configure(:lookup => l)
set_api_key!(l)
result = Geocoder.search([40.750354, -73.993371]).first
......
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