Free OSM Geocoding Services

Hôm qua lúc sửa luận văn, có yêu cầu thêm chức năng tìm kiếm vị trí, địa điểm bất kỳ trong cái app khí tượng của mình. Lý do là:

vì nhiều khi người ta cần xem thông tin một địa điểm mà người ta không biết nó nằm ở đâu.

@@. Ok! fine :v

Giao diện WebGIS khí tượng
Giao diện WebGIS khí tượng

Để từ một chuỗi địa danh mà trả về một vị trí (location – tọa độ) thì bên GIS có khái niệm là GeoCoding. Còn từ tọa độ x,y mà ra tên địa danh thì gọi là Reverse geocoding

Ok, Xác định là chúng ta không thể xây dựng database các poins, đường xá, hành chính cho cả nước rồi tính geocode rồi. Vậy sẽ tìm một service nào đó cung cấp dịch vụ geocoding thôi.

Mặc định nghĩ đến vụ dữ liệu GIS khổng lồ đó ta liên tưởng ngay đến Google MapOpenStreet Map (OSM)

Google Map Geocoding API

Đây là gã khổng lồ rồi. Cơ mà dùng Google Map API không miễn phí. Nó có giới hạn về lượng resquest và kể từ tháng 7/2018. Người dùng phải khai báo phương thức thanh toán với Google để có thể đăng ký API

Add billing to Google Maps API (API Key Google)

Thấy hơi gò bó rồi đấy =)), thế thì next!

OpenStreetMap (OSM) Geocoding

Ồ, thằng OSM thì xưa giờ được biết đến là dữ liệu free được đóng góp, chia sẻ bởi cộng đồng.

Tình cờ tìm được trang Nominatim

https://nominatim.openstreetmap.org/

Đây có thể là một app của OSM cung cấp Geocoding cho người dùng. Và mình chưa thấy hạn chế gì cả

Nominatim is a search engine for OpenStreetMap data. This is the debugging interface. You may search for a name or address (forward search) or look up data by its geographic coordinate (reverse search). Each result comes with a link to a details page where you can inspect what data about the object is saved in the database and investigate how the address of the object has been computed.

How to use OSM Geocoding

Bạn có thể xem trên Wiki của ứng dụng

https://wiki.openstreetmap.org/wiki/Nominatim

Hoặc dùng thử trên trang chủ của Nominatim

Kết quả trả về Geocode của Nominatim
Kết quả trả về Geocode của Nominatim
Xem chi tiết địa danh Nominatim
Xem chi tiết địa danh Nominatim

Ngoài giao diện dùng cuối như hình trên, Nominatim cũng cung cấp services có thể trả về Json, XML hay HTML.

Parameters

format=[html|xml|json|jsonv2]

Output format

json_callback=<string>

Wrap json output in a callback function (JSONP) i.e. <string>(<json>)

accept-language=<browser language string>

Preferred language order for showing search results, overrides the value specified in the “Accept-Language” HTTP header.
Either uses standard rfc2616 accept-language string or a simple comma separated list of language codes.

q=<query>

Query string to search for. Alternatively can be entered as:

street=<housenumber> <streetname>
city=<city>
county=<county>
state=<state>
country=<country>
postalcode=<postalcode>

(experimental) Alternative query string format for structured requests.
Structured requests are faster and require fewer server resources.
For North American addresses, use the full name for state to improve the results.
DO NOT COMBINE WITH q=<query> PARAMETER.

countrycodes=<countrycode>[,<countrycode>][,<countrycode>]...

Limit search results to a specific country (or a list of countries).
<countrycode> should be the ISO 3166-1alpha2 code, e.g. gb for the United Kingdom, de for Germany, etc.

viewbox=<x1>,<y1>,<x2>,<y2>

The preferred area to find search results. Any two corner points of the box are accepted in any order as long as they span a real box.

bounded=[0|1]

Restrict the results to only items contained with the viewbox (see above).
Restricting the results to the bounding box also enables searching by amenity only.
For example a search query of just “[pub]” would normally be rejected but with bounded=1 will result in a list of items matching within the bounding box.

polygon=[0|1]

Output polygon outlines for items found
(deprecated, use one of the polygon_* parameters instead)

addressdetails=[0|1]

Include a breakdown of the address into elements

email=<valid email address>

If you are making large numbers of request please include a valid email address or alternatively include your email address as part of the User-Agent string.
This information will be kept confidential and only used to contact you in the event of a problem, see Usage Policy for more details.

exclude_place_ids=<place_id,[place_id],[place_id]>

If you do not want certain openstreetmap objects to appear in the search result, give a comma separated list of the place_id’s you want to skip. This can be used to broaden search results. For example, if a previous query only returned a few results, then including those here would cause the search to return other, less accurate, matches (if possible)

limit=<integer>

Limit the number of returned results. Default is 10.

dedupe=[0|1]

Sometimes you have several objects in OSM identifying the same place or object in reality. The simplest case is a street being split in many different OSM ways due to different characteristics.
Nominatim will attempt to detect such duplicates and only return one match; this is controlled by the dedupe parameter which defaults to 1. Since the limit is, for reasons of efficiency, enforced before and not after de-duplicating, it is possible that de-duplicating leaves you with less results than requested.

debug=[0|1]

Output assorted developer debug information. Data on internals of nominatim “Search Loop” logic, and SQL queries. The output is (rough) HTML format. This overrides the specified machine readable format.

polygon_geojson=1

Output geometry of results in geojson format.

polygon_kml=1

Output geometry of results in kml format.

polygon_svg=1

Output geometry of results in svg format.

polygon_text=1

Output geometry of results as a WKT.

extratags=1

Include additional information in the result if available, e.g. wikipedia link, opening hours.

namedetails=1

Include a list of alternative names in the results.
These may include language variants, references, operator and brand.

Ví dụ:

https://nominatim.openstreetmap.org/search?q=nghệ an&format=json&polygon=1&addressdetails=1

Kết quả trả về dạng Json

kết quả geocoding trả về dạng json
kết quả geocoding trả về dạng json

Kết quả này bao gồm rất nhiều thông số, trong đó quan trọng nhất là display_name

Ngoài ra, nếu ta chọn polygon=1 thì chúng ta sẽ nhận được Geometry của đối tượng dạng WKT (Well Known Text).

Từ các thông số trên, chúng ta có thể dễ dàng dùng các Map libs như Openlayers, Leaflet, GeoExt,.. để hiển thị, zoom đến đối tượng.

Reverse Geocoding

Ngoài ra, khi xem Wiki thì mình còn thấy Nominatim cung cấp cả Reverse Geocoding

Reverse geocoding generates an address from a latitude and longitude. The optional zoom parameter specifies the level of detail required in terms of something suitable for a Leaflet.js/OpenLayers/etc. zoom level.

Parameters

format=[xml|html|json|jsonv2]

Output format, default = xml.
jsonv2 adds the next fields to response:

  • place_rank
The place_rank is based on a rather complex algorithm taking the place type and various other attributes into account. For example it seems checks whether this object is a village, a city, a country, a continent, a highway, a lake and similar other properties. [1]
  • category
  • type
  • importance
The importance is used for ordering search results according to their relevance. The importance value is calculated/estimated using various attributes including the place’s popularity on Wikipedia and its place_rank.[2]
  • addresstype

json_callback=<string>

Wrap json output in a callback function (JSONP) i.e. <string>(<json>)

accept-language=<browser language string>

Preferred language order for showing search results, overrides the value specified in the “Accept-Language” HTTP header.
Either uses standard rfc2616 accept-language string or a simple comma separated list of language codes.

osm_type=[N|W|R]
osm_id=<value>

A specific osm node / way / relation to return an address for
Please use this in preference to lat/lon where possible

lat=<value> lon=<value>

The location to generate an address for

zoom=[0-18]

Level of detail required where 0 is country and 18 is house/building

addressdetails=[0|1]

Include a breakdown of the address into elements

email=<valid email address>

If you are making large numbers of request please include a valid email address
or alternatively include your email address as part of the User-Agent string.
This information will be kept confidential and only used to contact you in the
event of a problem, see Usage Policy for more details.

polygon_geojson=1

Output geometry of result in geojson format.

polygon_kml=1

Output geometry of result in kml format.

polygon_svg=1

Output geometry of result in svg format.

polygon_text=1

Output geometry of result as a WKT.

extratags=1

Include additional information in the result if available, e.g. wikipedia link, opening hours.

namedetails=1

Include a list of alternative names in the results.
These may include language variants, references, operator and brand.

Ví dụ

https://nominatim.openstreetmap.org/reverse?format=xml&lat=52.5487429714954&lon=-1.81602098644987&zoom=18&addressdetails=1

Kết quả trả về dạng XML

Kết quả Reverse Geocoding trả về dạng XML
Kết quả Reverse Geocoding trả về dạng XML

Demo ứng dụng đơn giản dùng Geocoding của Nominatim



Kết quả sau khi thêm tìm địa điểm với service của Nominatim vào app khí tượng của mình

Nhập địa chỉ muốn tìm kiếm
Nhập địa chỉ muốn tìm kiếm
Kết quả Geocoding trả về
Kết quả Geocoding trả về

Vậy là xong, hi vọng mở ra một hướng sử dụng dịch vụ Geocoding cho các bạn^^

-Soiqualant_Chentreu-