Để 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 Map và OpenStreet 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
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
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
https://nominatim.openstreetmap.org/search?<params> https://nominatim.openstreetmap.org/search/<query>?<params>
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ả 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
https://nominatim.openstreetmap.org/reverse?<query>
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
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
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-