• 地理坐标点
    • 经纬度坐标格式

    地理坐标点

    地理坐标点(geo-point) 是指地球表面可以用经纬度描述的一个点。地理坐标点可以用来计算两个坐标位置间的距离,或者判断一个点是否在一个区域中。

    地理坐标点不能被动态映射(dynamic mapping)自动检测,而是需要显式声明对应字段类型为 geo_point

    1. PUT /attractions
    2. {
    3. "mappings": {
    4. "restaurant": {
    5. "properties": {
    6. "name": {
    7. "type": "string"
    8. },
    9. "location": {
    10. "type": "geo_point"
    11. }
    12. }
    13. }
    14. }
    15. }

    经纬度坐标格式

    如上例,location 被声明为 geo_point 后,我们就可以索引包含了经纬度信息的文档了。经纬度信息的形式可以是字符串,数组或者对象。

    1. PUT /attractions/restaurant/1
    2. {
    3. "name": "Chipotle Mexican Grill",
    4. "location": "40.715, -74.011" <1>
    5. }
    6. PUT /attractions/restaurant/2
    7. {
    8. "name": "Pala Pizza",
    9. "location": { <2>
    10. "lat": 40.722,
    11. "lon": -73.989
    12. }
    13. }
    14. PUT /attractions/restaurant/3
    15. {
    16. "name": "Mini Munchies Pizza",
    17. "location": [ -73.983, 40.719 ] <3>
    18. }
    • <1> 以半角逗号分割的字符串形式 "lat,lon"
    • <2> 明确以 latlon 作为属性的对象;
    • <3> 数组形式表示 [lon,lat]

    注意

    可能所有人都至少踩过一次这个坑:地理坐标点用字符串形式表示时是纬度在前,经度在后("latitude,longitude"),而数组形式表示时刚好相反,是经度在前,纬度在后([longitude,latitude])。

    其实,在 Elasticesearch 内部,不管字符串形式还是数组形式,都是纬度在前,经度在后。不过早期为了适配 GeoJSON 的格式规范,调整了数组形式的表示方式。

    因此,在使用地理位置(geolocation)的路上就出现了这么一个“捕熊器”,专坑那些不了解这个陷阱的使用者。