精华内容
下载资源
问答
  • 所以,就用到了根据IP查询地理位置信息一些东西,现在将这方面积累一点东西共享出来。 根据IP查询所在地、运营商等信息一些API如下(根据有限一点经验):1. 淘宝API(推荐):...
  • Elasticsearch 地理位置查询

    千次阅读 2019-06-26 19:44:18
    本文参考自Elacticsearch中文版翻译:https://es.xiaoleilu.com/ 并对基于Es 6.6.0版本进行...想知道从当前位置步行 5 分钟内可到那些餐馆,对伦敦更大范围内其他餐馆并不感兴趣。 但地理位置功能仅仅是 E...

    本文参考自Elacticsearch的中文版翻译:https://es.xiaoleilu.com/
    并对基于Es 6.6.0版本进行API的更正。

    地理位置

    我们拿着纸质地图漫步城市的日子一去不返了。得益于智能手机,我们现在总是可以知道自己所处的准确位置,也预料到网站会使用这些信息。我想知道从当前位置步行 5 分钟内可到的那些餐馆,对伦敦更大范围内的其他餐馆并不感兴趣。

    但地理位置功能仅仅是 Elasticsearch 的冰山一角,Elasticsearch 的妙处在于,它让你可以把地理位置、全文搜索、结构化搜索和分析结合到一起。

    例如:告诉我提到 vitello tonnato 这种食物、步行 5 分钟内可到、且晚上 11 点还营业的餐厅,然后结合用户评价、距离、价格排序。另一个例子:给我展示一幅整个城市8月份可用假期出租物业的地图,并计算出每个区域的平均价格。

    Elasticsearch 提供了两种表示地理位置的方式:用纬度-经度表示的坐标点使用 geo_point 字段类型, 以 GeoJSON 格式定义的复杂地理形状,使用 geo_shape 字段类型。

    Geo-points 允许你找到距离另一个坐标点一定范围内的坐标点、计算出两点之间的距离来排序或进行相关性打分、或者聚合到显示在地图上的一个网格。另一方面,Geo-shapes 纯粹是用来过滤的。它们可以用来判断两个地理形状是否有重合或者某个地理形状是否完全包含了其他地理形状。

    地理坐标点

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

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

    PUT /attractions
    {
      "mappings": {
        "restaurant": {
          "properties": {
            "name": {
              "type": "keyword"
            },
            "location": {
              "type": "geo_point"
            }
          }
        }
      }
    }
    

    经纬度坐标格式

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

    PUT /attractions/restaurant/1
    {
      "name":     "Chipotle Mexican Grill",
      "location": "40.715, -74.011" <1>
    }
    
    PUT /attractions/restaurant/2
    {
      "name":     "Pala Pizza",
      "location": { <2>
        "lat":     40.722,
        "lon":    -73.989
      }
    }
    
    PUT /attractions/restaurant/3
    {
      "name":     "Mini Munchies Pizza",
      "location": [ -73.983, 40.719 ] <3>
    }
    

    <1> 以半角逗号分割的字符串形式 “lat,lon”;
    <2> 明确以 lat 和 lon 作为属性的对象;
    <3> 数组形式表示 [lon,lat]。

    注意:
    可能所有人都至少踩过一次这个坑:地理坐标点用字符串形式表示时是纬度在前,经度在后(“latitude,longitude”),而数组形式表示时刚好相反,是经度在前,纬度在后([longitude,latitude])。
    其实,在 Elasticesearch 内部,不管字符串形式还是数组形式,都是纬度在前,经度在后。不过早期为了适配 GeoJSON 的格式规范,调整了数组形式的表示方式。
    因此,在使用地理位置(geolocation)的路上就出现了这么一个“捕熊器”,专坑那些不了解这个陷阱的使用者。

    通过地理坐标点过滤

    有四种地理坐标点相关的过滤方式可以用来选中或者排除文档:

    • geo_bounding_box::
      找出落在指定矩形框中的坐标点

    • geo_distance::
      找出与指定位置在给定距离内的点

    • geo_distance_range::
      找出与指定点距离在给定最小距离和最大距离之间的点

    • geo_polygon::
      找出落在多边形中的点。这个过滤器使用代价很大。

    所有这些过滤器的工作方式都相似: 把索引中所有文档(而不仅仅是查询中匹配到的部分文档)的经纬度信息都载入内存,然后每个过滤器执行一个轻量级的计算去判断当前点是否落在指定区域。

    提示:
    地理坐标过滤器使用代价昂贵 —— 所以最好在文档集合尽可能少的场景使用。 你可以先使用那些简单快捷的过滤器,比如 term 或者 range,来过滤掉尽可能多的文档,最后才交给地理坐标过滤器处理。
    布尔型过滤器(bool filter)会自动帮你做这件事。 它会优先让那些基于“bitset”的简单过滤器(见 filter-caching)来过滤掉尽可能多的文档,然后依次才是地理坐标过滤器或者脚本类的过滤器。

    地理坐标盒模型过滤器

    这是目前为止最有效的 地理坐标过滤器了,因为它计算起来非常简单。 你指定一个矩形的 顶部(top), 底部(bottom), 左边界(left), 和 右边界(right), 然后它只需判断坐标的经度是否在左右边界之间,纬度是否在上下边界之间。

    GET /attractions/restaurant/_search
    {
      "query": {
        "bool": {
          "filter": {
            "geo_bounding_box": {
              "location": {<1> 
                "top_left": {
                  "lat":  40.8,
                  "lon": -74.0
                },
                "bottom_right": {
                  "lat":  40.7,
                  "lon": -73.0
                }
              }
            }
          }
        }
      }
    }
    

    <1> 盒模型信息也可以用 bottom_left(左下方点)和 top_right(右上方点) 来表示。

    优化盒模型

    地理坐标盒模型过滤器不需要把所有坐标点都加载到内存里。因为它要做的只是简单判断纬度和经度坐标数值是否在给定的范围内,所以它可以用倒排索引来做一个范围(range)过滤。

    要使用这种优化方式,需要把 geo_point 字段用 纬度(lat)和经度(lon)方式表示并分别索引。

    PUT /attractions
    {
      "mappings": {
        "restaurant": {
          "properties": {
            "name": {
              "type": "string"
            },
            "location": {
              "type":    "geo_point",
              "lat_lon": true <1>
            }
          }
        }
      }
    }
    
    • <1> location.lat 和 location.lon 字段将被分别索引。它们可以被用于检索,但是不会在检索结果中返回。

    然后,查询时你需要告诉 Elasticesearch 使用已索引的 lat和lon。

    GET /attractions/restaurant/_search
    {
      "query": {
        "bool": {
          "filter": {
            "geo_bounding_box": {
              "type":    "indexed", <1>
              "location": {
                "top_left": {
                  "lat":  40.8,
                  "lon": -74.0
                },
                "bottom_right": {
                  "lat":  40.7,
                  "lon":  -73.0
                }
              }
            }
          }
        }
      }
    }
    

    <1> 设置 type 参数为 indexed (默认为 memory) 来明确告诉 Elasticsearch 对这个过滤器使用倒排索引。

    注意:geo_point 类型可以包含多个地理坐标点,但是针对经度纬度分别索引的这种优化方式(lat_lon)只对单个坐标点的方式有效。

    地理距离过滤器

    地理距离过滤器(geo_distance)以给定位置为圆心画一个圆,来找出那些位置落在其中的文档:

    GET /attractions/restaurant/_search
    {
      "query": {
        "bool": {
          "filter": {
            "geo_distance": {
              "distance": "1km", <1>
              "location": { <2>
                "lat":  40.715,
                "lon": -73.988
              }
            }
          }
        }
      }
    }
    
    • <1> 找出所有与指定点距离在1公里(1km)内的 location 字段。
    • <2> 中心点可以表示为字符串,数组或者(如示例中的)对象。

    地理距离过滤器计算代价昂贵。 为了优化性能,Elasticsearch 先画一个矩形框(边长为2倍距离)来围住整个圆形, 这样就可以用消耗较少的盒模型计算方式来排除掉那些不在盒子内(自然也不在圆形内)的文档, 然后只对落在盒模型内的这部分点用地理坐标计算方式处理。

    提示:你需要判断你的使用场景,是否需要如此精确的使用圆模型来做距离过滤? 通常使用矩形模型是更高效的方式,并且往往也能满足应用需求。

    更快的地理距离计算

    两点间的距离计算,有多种性能换精度的算法:

    • arc::
      最慢但是最精确是弧形(arc)计算方式,这种方式把世界当作是球体来处理。 不过这种方式精度还是有限,因为这个世界并不是完全的球体。

    • plane::
      平面(plane)计算方式,(((“plane distance calculation”)))把地球当成是平坦的。 这种方式快一些但是精度略逊;在赤道附近位置精度最好,而靠近两极则变差。

    • sloppy_arc::
      如此命名,是因为它使用了 Lucene 的 SloppyMath 类。 这是一种用精度换取速度的计算方式,它使用 Haversine formula 来计算距离; 它比弧形(arc)计算方式快4~5倍, 并且距离精度达99.9%。这也是默认的计算方式。
      你可以参考下例来指定不同的计算方式:

    GET /attractions/restaurant/_search
    {
      "bool": {
        "filtered": {
          "filter": {
            "geo_distance": {
              "distance":      "1km",
              "distance_type": "plane", <1>
              "location": {
                "lat":  40.715,
                "lon": -73.988
              }
            }
          }
        }
      }
    }
    

    <1> 使用更快但精度稍差的平面(plane)计算方式。

    提示:你的用户真的会在意一个宾馆落在指定圆形区域数米之外了吗? 一些地理位置相关的应用会有较高的精度要求;但大部分实际应用场景中,使用精度较低但响应更快的计算方式可能就挺好。

    地理距离区间过滤器

    地理距离过滤器和地理距离区间过滤器的唯一差别在于后者是一个环状的,它会排除掉落在内圈中的那部分文档。

    指定到中心点的距离也可以换一种表示方式: 指定一个最小距离(使用from)和最大距离(使用to),就像使用区间(range)过滤器一样。

    GET /attractions/restaurant/_search
    {
      "aggs": {
        "agg_by_distance_range": {
          "geo_distance": {
            "field": "location",
            "origin": {
              "lat": 40.715,
              "lon": -73.988
            },
            "unit": "km",
            "ranges": [
              {
                "from": 1, <1>
                "to": 2 <1>
              }
            ]
          }
        }
      }
    }
    

    <1> 匹配那些距离中心点超过1公里而小于2公里的位置。

    缓存地理位置过滤器

    因为如下两个原因,地理位置过滤器默认是不被缓存的:

    • 地理位置过滤器通常是用于查找用户当前位置附近的东西。但是用户是在移动的,并且没有两个用户的位置完全相同,因此缓存的过滤器基本不会被重复使用到。

    • 过滤器是被缓存为比特位集合来表示段(segment)内的文档。假如我们的查询排除了几乎所有文档,只剩一个保存在这个特别的段内。一个未缓存的地理位置过滤器只需要检查这一个文档就行了,但是一个缓存的地理位置过滤器则需要检查所有在段内的文档。

    缓存对于地理位置过滤器也可以很有效。 假设你的索引里包含了所有美国的宾馆。一个在纽约的用户是不会对旧金山的宾馆感兴趣的。 所以我们可以认为纽约是一个热点(hot spot),然后画一个边框把它和附近的区域围起来。
    如果这个地理盒模型过滤器(geo_bounding_box)被缓存起来,那么当有位于纽约市的用户访问时它就可以被重复使用了。 它可以直接排除国内其它区域的宾馆。然后我们使用未缓存的,更加明确的地理盒模型过滤器(geo_bounding_box)或者地理距离过滤器(geo_distance)来在剩下的结果集中把范围进一步缩小到用户附近:

    GET /attractions/restaurant/_search
    {
      "query": {
        "bool": {
          "filter": {
            "bool": {
              "must": [
                {
                  "geo_bounding_box": {
                    "type": "indexed",
                    "_cache": true, <1>
                    "location": {
                      "top_left": {
                        "lat":  40,8,
                        "lon": -74.1
                      },
                      "bottom_right": {
                        "lat":  40.4,
                        "lon": -73.7
                      }
                    }
                  }
                },
                {
                  "geo_distance": { <2>
                    "distance": "1km",
                    "location": {
                      "lat":  40.715,
                      "lon": -73.988
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    <1> 缓存的地理盒模型过滤器把结果集缩小到了纽约市。
    <2> 代价更高的地理距离过滤器(geo_distance)让结果集缩小到1km内的用户。

    减少内存占用

    每一个经纬度(lat/lon)组合需要占用16个字节的内存。要知道内存可是供不应求的。 使用这种占用16字节内存的方式可以得到非常精确的结果。不过就像之前提到的一样,实际应用中几乎都不需要这么精确。
    你可以通过这种方式来减少内存使用量: 设置一个压缩的(compressed)数据字段格式并明确指定你的地理坐标点所需的精度。 即使只是将精度降低到1毫米(1mm)级别,也可以减少1/3的内存使用。更实际的,将精度设置到3米(3m)内存占用可以减少62%,而设置到1公里(1km)则节省75%之多。
    这个设置项可以通过 update-mapping API 来对实时索引进行调整:

    POST /attractions/_mapping/restaurant
    {
      "location": {
        "type": "geo_point",
        "fielddata": {
          "format":    "compressed",
          "precision": "1km" <1>
        }
      }
    }
    

    <1> 每一个经纬度(lat/lon)组合现在只需要4个字节,而不是16个。

    另外,你还可以这样做来避免把所有地理坐标点全部同时加载到内存中: 使用在优化盒模型(optimize-bounding-box)中提到的技术, 或者把地理坐标点当作文档值(doc values)来存储。

    PUT /attractions
    {
      "mappings": {
        "restaurant": {
          "properties": {
            "name": {
              "type": "keyword"
            },
            "location": {
              "type":       "geo_point",
              "doc_values": true <1>
            }
          }
        }
      }
    }
    

    <1> 地理坐标点现在不会被加载到内存,而是保存在磁盘中。

    将地理坐标点映射为文档值的方式只能是在这个字段第一次被创建时。 相比使用字段值,使用文档值会有一些小的性能代价,不过考虑到它对内存的节省,这种方式通常是还值得的。

    按距离排序

    检索结果可以按跟指定点的距离排序:

    提示 当你可以按距离排序时,按距离打分(scoring-by-distance)通常是一个更好的解决方案。

    GET /attractions/restaurant/_search
    {
      "query": {
        "bool": {
          "filter": {
            "geo_bounding_box": {
              "type":       "indexed",
              "location": {
                "top_left": {
                  "lat":  40,8,
                  "lon": -74.0
                },
                "bottom_right": {
                  "lat":  40.4,
                  "lon": -73.0
                }
              }
            }
          }
        }
      },
      "sort": [
        {
          "_geo_distance": {
            "location": { <1>
              "lat":  40.715,
              "lon": -73.998
            },
            "order":         "asc",
            "unit":          "km", <2>
            "distance_type": "plane" <3>
          }
        }
      ]
    }
    

    <1> 计算每个文档中 location 字段与指定的 lat/lon 点间的距离。
    <2> 以 公里(km)为单位,将距离设置到每个返回结果的 sort 键中。
    <3> 使用快速但精度略差的平面(plane)计算方式。

    你可能想问:为什么要制定距离的单位(unit)呢? 用于排序的话,我们并不关心比较距离的尺度是英里,公里还是光年。 原因是,这个用于排序的值会设置在每个返回结果的 sort 元素中。

    ...
      "hits": [
         {
            "_index": "attractions",
            "_type": "restaurant",
            "_id": "2",
            "_score": null,
            "_source": {
               "name": "New Malaysia",
               "location": {
                  "lat": 40.715,
                  "lon": -73.997
               }
            },
            "sort": [
               0.08425653647614346 <1>
            ]
         },
    ...
    

    <1> 宾馆距离我们的指定位置距离是 0.084km。
    你可以通过设置单位(unit)来让返回值的形式跟你应用中想要的匹配。

    提示:
    地理距离排序可以对多个坐标点来使用,不管(这些坐标点)是在文档中还是排序参数中。 使用 sort_mode 来指定是否需要使用位置集合的 最小(min),最大(max)或者平均(avg)距离。 这样就可以返回离我的工作地和家最近的朋友这样的结果了。

    按距离打分

    有可能距离只是决定返回结果排序的唯一重要因素,不过更常见的情况是距离会和其它因素,比如全文检索匹配度,流行程度或者价格一起决定排序结果。
    遇到这种场景你需要在查询分值计算(function_score query)中指定方式让我们把这些因子处理得到一个综合分。 decay-functions中有个一个例子就是地理距离影响排序得分的。
    另外按距离排序还有个缺点就是性能:需要对每一个匹配到的文档都进行距离计算。 而 function_score请求,在 rescore phase阶段有可能只需要对前 n 个结果进行计算处理。

    展开全文
  • 当我决定将我数据上传到GAE上时候,我就预计到将来数据调用将会是非常费劲,果然,我现在仅仅是小小使用了一下自己数据就已经把自己折磨够呛,因为GAE不能支持联合查询,在数据排序和条件上也有诸多...

        当我决定将我的数据上传到GAE上的时候,我就预计到将来的数据调用将会是非常费劲的,果然,我现在仅仅是小小的使用了一下自己的数据就已经把自己折磨的够呛,因为GAE不能支持联合查询,在数据的排序和条件上也有诸多限制,因此,操作起来非常费劲,甚至有时候必须牺牲一些性能或效果。

        本文对那些问题不做详细的表述,仅仅谈谈我进行地理数据查询的实现。

        将地理的数据存储到Google的DataStore之中,可以直接用两个float的字段,代表经纬度,也可以直接使用db.GeoPtProperty,现在看来,直接使用float字段要直观容易的多,可是我当时上传的时候考虑到以后Google可能会在db.GeoPtProperty的基础是那个提供一些方便的功能,因此,就将数据上传为db.GeoPtProperty,可是上传之后遇到问题,原来db.GeoPtProperty不支持基于范围的查询,这就困难了,早知道我用两个float,建立好索引,应该可以实现周边查询等等功能的(后来补充:这样也不行,因为GQL在查询的时候仅仅支持一种"非等于"的条件,也就是说要实现lat>3 and lat<54 and lon>73 and lon<136这种查询也是不行的),很怀恋以前直接使用SQL Server的时候,一个SQL语句,按距离排序就搞定了。

        那么GAE之中的经纬度是按照什么顺序存放的呢?我从网上查了一下,GAE的经纬度是严格按照(lat,lon)的顺序存放的,也就是说基本上是按照纬度排,纬度相同的再按照经度拍,这样的话,查找某一个纬度范围的点是很容易的,不过这个查询在实际应用之中用处不大。

        我从网上查了一下,基本上大家都是考虑用geohash来实现周边查询,这个东西我没有精力去做具体的研究(后来补充:准备研究,专文讲叙),只能大致的猜想:geohash将一个经纬度序列化成为一个字符串,最后能够大致做到“两个越相邻的经纬度,得到字符串开头部分相同的位数就越多”,也就是说将一个平面的2维坐标编码成为了一个线性的序列,在二维坐标之中离的近的点,在这个线性序列之中距离也近。这种算法让我觉得很奇怪,不知道怎么实现的,不过这个问题等有时间再去研究,我现在,且在网站上直接使用这个功能。

        1.首先要使用geohash库,从网上去下一个geohash.py文件,放到自己的应用程序根目录下面

        2.要将线上的数据包含经纬度的表增加一个geohash的字段,并且将geohash编码字符串存进去,这一点我是使用remote_data来实现的,这种方式来处理数据方便快捷的多,比以前一直刷新页面好多了,我的增加这个字段的代码如下:

     

    ContractedBlock.gifExpandedBlockStart.gifsetStationGeohash.py
     1# -*- coding: utf-8 -*- #   
     2import code
     3import getpass
     4import sys
     5#下面要改成自己的gae安装路径
     6sys.path.append("D:\Program Files\Google\google_appengine\lib\yaml\lib")
     7sys.path.append("D:\Program Files\Google\google_appengine")
     8#下面是我的应用程序的路径,刚才说过geohash是放在那里的
     9sys.path.append("D:\work\myapp")
    10
    11import geohash
    12from google.appengine.ext.remote_api import remote_api_stub
    13from google.appengine.ext import db
    14#这是数据表的定义,注意,最下面一行被我加上了geohash字段
    15class Train_stations(db.Model):
    16  name = db.StringProperty()
    17  latlng = db.GeoPtProperty()
    18  superior = db.StringProperty()
    19  address = db.StringProperty()
    20  postcode = db.StringProperty()
    21  regionCode = db.StringProperty()
    22  level = db.StringProperty()
    23  telephone = db.StringProperty()
    24  oldName = db.StringProperty()
    25  lineCount = db.IntegerProperty()
    26  geohash = db.StringProperty()
    27
    28def auth_func():
    29  return raw_input('Username:'), getpass.getpass('Password:')
    30#这是应用程序ID
    31app_id='myapp'
    32host = '%s.appspot.com' % app_id
    33
    34remote_api_stub.ConfigureRemoteDatastore("myapp"'/remote_api',auth_func)
    35
    36key=''
    37while True:
    38    sql="select * from Train_stations"
    39    if key:
    40        sql+=" where __key__>KEY('%s') "%key
    41    sql+=" order by __key__"
    42    stations=db.GqlQuery(sql).fetch(100)
    43    if len(stations)<=0:
    44        break
    45    for station in stations:
    46        if station.latlng and station.latlng.lat and station.latlng.lon:
    47            station.geohash=str(geohash.Geohash((float(station.latlng.lon), float(station.latlng.lat))))
    48        else:
    49            station.geohash=''
    50        print "%s:%s" % (station.name,station.geohash)
    51    db.put(stations)
    52    key=str(stations[len(stations)-1].key())
    53    print key
    54print "OK"

     

        上面这段代码在本地运行即可,不需要上传到服务器上去(不过需要注意服务器必须打开了remote_api,并且路径对应),运行的时候,会看到将每行数据经纬度进行geohash之后的数据,等到运行显示"OK",则说明所有的经纬度都hash完毕了,到GAE的后台可以看到数据,例如一个经纬度是"25.6138,109.484",geohash之后是"he6nyfgqsbce4"。

        3.数据处理完毕之后,就可以进行查询了,先理清思路:要查询一个经纬度附近的点,应该先查询大于这个geohash的点之中最小的hash,再查小于这个geohash的点之中最大的hash,因此必须查两遍:

     

        tvs['nearStations']=db.GqlQuery("select * from Train_stations where geohash < :1 order by geohash desc",(hash)).fetch(10)
        tvs[
    'nearStations'].extend(db.GqlQuery("select * from Train_stations where geohash > :1 order by geohash",(hash)).fetch(10))

     

        4.通过以上的方式,就可以查出临近的点,这只是geohash的一种使用而已,至少,你还可以通过查询和当前的geohash前几位字母相同的hash值,从而的得到这个经纬度周边一定范围内的所有点,这一点因为我的网站上没有用到,因此,没有相应的代码可以提供,不过从原理上是可以实现的。

        以上就是我对geohash的简单应用,现在,这些应用已经开始运行在http://www.dituren.cn上面,目前来看,效果不错,马上我会仔细研究一下geohash的实现,对于我这个非专业的人来讲,geohash真是太神奇了。

    展开全文
  • 我的化学/化学信息学计算器项目背后文件位置 指示: 该程序将花费一些时间来收集来自几个不同网页数据。 暂停之后,将出现一个菜单,允许用户输入所列标题之一索引: 此描述将集中于每次使用一次。 信息 ...
  • es支持基于地理位置的搜索,和聚合分析举个例子,...非常合适我现在在上海某个大厦附近,我要搜索到距离我2公里以内5星级带游泳池一个酒店s,用es就完全可以实现类似这样基于地理位置的搜索引擎1、建立geo...
    es支持基于地理位置的搜索,和聚合分析的

    举个例子,比如说,我们后面就会给大家演示一下,你现在如果说做了一个酒店o2o app,让你的用户在任何地方,都可以根据当前所在的位置,找到自己身边的符合条件的一些酒店,那么此时就完全可以使用es来实现,非常合适

    我现在在上海某个大厦附近,我要搜索到距离我2公里以内的5星级的带游泳池的一个酒店s,用es就完全可以实现类似这样的基于地理位置的搜索引擎

    1、建立geo_point类型的mapping
    第一个地理位置的数据类型,就是geo_point,geo_point,说白了,就是一个地理位置坐标点,包含了一个经度,一个维度,经纬度,就可以唯一定位一个地球上的坐标
    PUT /my_index 
    {
      "mappings": {
        "my_type": {
          "properties": {
            "location": {
              "type": "geo_point"
            }
          }
        }
      }
    }
    2、写入geo_point的3种方法
    PUT my_index/my_type/1
    {
      "text": "Geo-point as an object",
      "location": { 
        "lat": 41.12,
        "lon": -71.34
      }
    }
    latitude:维度
    longitude:经度

    我们这里就不用去关心,这些坐标到底代表什么地方,其实都是我自己随便写的,只要能够作为课程,给大家演示清楚就可以了,自己去找一些提供地理位置的一些公司,供应商,api,百度地图,也是提供各个地方的经纬度的

    不建议用下面两种语法
    PUT my_index/my_type/2
    {
      "text": "Geo-point as a string",
      "location": "41.12,-71.34" 
    }
    
    PUT my_index/my_type/4
    {
      "text": "Geo-point as an array",
      "location": [ -71.34, 41.12 ] 
    }
    3、根据地理位置进行查询
    最简单的,根据地理位置查询一些点,比如说,下面geo_bounding_box查询,查询某个矩形的地理位置范围内的坐标点比如41.12,-71.34就是一个酒店,然后我们现在搜索的是从42,-72(代表了大厦A)和40,-74(代表了马路B)作为矩形的范围,在这个范围内的酒店,是什么

    GET /my_index/my_type/_search 
    {
      "query": {
        "geo_bounding_box": {
          "location": {
            "top_left": {
              "lat": 42,
              "lon": -72
            },
            "bottom_right": {
              "lat": 40,
              "lon": -74
            }
          }
        }
      }
    }
    
    {
      "took": 81,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 1,
        "hits": [
          {
            "_index": "my_index",
            "_type": "my_type",
            "_id": "1",
            "_score": 1,
            "_source": {
              "location": {
                "lat": 41.12,
                "lon": -71.34
              }
            }
          }
        ]
      }
    }
    


    展开全文
  • 这两天公司叫做一个功能,通过获取用户ip判断所在地理位置,来做相对应功能。 一开始试用接口新浪API http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&amp;ip=IP地址 但是因为...

    这两天公司叫我做一个功能,通过获取用户的ip判断所在的地理位置,来做相对应的功能。

    一开始试用的接口的新浪的API

    http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=IP地址

    但是因为这个API是不知道什么时候就停用的了,所以就算了

    现在说可以使用的API:

    淘宝API

    缺点:

    1.有时候调用速度很快,但是有时候回超过30秒而导致服务器报错,终结页面的运行

    <?php
    $ip = file_get_contents("http://ip.taobao.com/service/getIpInfo.php?ip=".$_GET["ip"]);
    $ip = json_decode($ip,true);
    ?>

    结果是返回JSON格式的如下

    腾讯API

    缺点:好像用户试用WIFI情况下定位不准确或者不会有返回数据

    http://ip.taobao.com/service/getIpInfo.php?ip=IP

    结果是返回JSON格式(别人告诉的,然而我测试没用)

    搜狐API

    缺点:

    1.不能使用特定IP来查询,只能使用API原本查询的IP

    2.在服务器测试中,API直接查询出了服务器的IP,并不是用户的IP

    (这两个缺点感觉是我写代码的问题,但是我不知道怎么解,如果有大神解决了麻烦告诉我一下怎么解,谢谢)

    搜狐IP地址查询接口(默认GBK):http://pv.sohu.com/cityjson 
    搜狐IP地址查询接口(可设置编码):http://pv.sohu.com/cityjson?ie=utf-8 
    搜狐另外的IP地址查询接口:http://txt.go.sohu.com/ip/soip 

    第一个和第二个分别是不同编码的API,返回结果如下

    第三个API虽然有结果原谅我小白看不懂怎么使用,返回结果如下

    126API

    缺点:返回格式有点问题,不是UTF-8格式,转格式也失败

    126API:http://ip.ws.126.net/ipquery?ip=IP

    返回结果如下

    太平洋API

    这个API很强大:http://whois.pconline.com.cn

    详细的看一下里面的说明吧

    但是这个有问题 他JSON格式 属于回调  本地运行可以 放到项目里面就报错403 

    最终我也没有选择这个来使用 

    说明:该文章如有侵权,请联系我!该文章只供参考,有问题请各位自己担当哈!!在文章是在20180822编写,API有可能调用变动或者无法使用,请各位注意一下!

     

    展开全文
  • 这里主要用到了DATEDIFF(...这里DATEDIFF(‘现在时间’,时间字段名)里面两个参数是可以调换位置的,求距离现在时间是相反,可以测试下。 2、查询未来第n天所有数据 SELECT * FROM 表名 WHERE DATEDIFF(...
  • 地图功能有很多功能需要实现,这次分享是以圆中心点来实现,查询圆形里面所有医疗服务,现在来看一下周边分析样式布局吧! 制作中心点,选择,然后把圆半径设为500默认值,然后所需要查询的是...
  • 并且用odbc连上了sql数据库中的一张表,现在想建一个查询功能,在EDIT BOX中输入主键值,点击查询button,自动在表中检索相应的值并返回结果到界面,现在的问题不在代码,因为编译没错,问题是执行.exe以后无论在...
  • 是出租车管理系统,treeview做管理界面,现在基本功能都实现了,但是例如treeview中申请用车中应该有车辆是否归还状态,现在要将车辆查询中用gridview后几位置插入车辆状态,这要怎么才能加进去呀,
  • 注意:从1.1.1版开始,Backbone现在支持最少的查询参数: : 查询字符串路由语法 除以通配符结尾路由外,任何路由都将使用“?”自动接受其他内容。 分隔器。 此内容是一组键值对,使用“&”作为对分隔符,使用...
  • <div><h3>1. 现象 在使用数组条件查询数据库时出现报错 ...<h3>2....现在我只能在自己基类中重置指针,希望后续能更新下 多谢</p><p>该提问来源于开源项目:top-think/framework</p></div>
  • ES geo_shape查询

    2020-04-07 16:11:01
    我的第一反应是以用户为中心,做矩形或者圆形范围查询现在很多数据库Mongo 以及ES 都支持这种地理位置范围查询。以及距离查询算法等等 但是其实是理会错了提问者真实意图。因为类似美团,饿了么的查询都不是...
  • 如果你想查找一个IP地址在地球上实际地理位置现在已经有好多在线GeoIp查找服务你可以利用(例如geoiptool.com)。...在这篇教程里,想展示一下如何通过Linux命令行获取IP地址实际地理位置
  • 大家提到了一个问题,总感觉用相关度排序时候,lucene会把查询关键字相邻紧密doc排在前面,但是打分公式里面却没提到过这个因素,所以我现在来验证下查询紧密程度是否会影响打分。 局部代码 添加doc...
  • 自认为卡住的位置是python编写的文件与HTML之间的连接。 求助:在这么一个请求查询与展示返回数据的网站编制开发过程中,不懂得实在是太多了,还在努力学习中。请帮忙指教整个过程该如何写࿰...
  • Spatial_databases 创建(生成/采样)一些数据,对其进行可视化,对其进行查询... 已经计算出您15个位置之一中四个最邻近邻居[查找数据库空间函数,以执行此操作]。 使用查询结果在.kml文件中创建四个线段:
  • 我有mysql表(例如TestSuite),在TestSuiteDefinition列中保存xml内容(尽管是长文本),...知道如何在MS SQL中执行此操作,例如:从TestSuite的位置选择TestSuiteDefinition.query(‘data(/ test_suite / test_case /...
  • AmazonRoute 53是一项高可用性及高可扩展性域名服务(简称DNS),其中还包括...现在就让我们近距离一探这些项目价值所在。 域名注册与管理 早在1995年,就注册了自己第一个域名!在那个时候,域管理与注册方方
  • Matlab中常用希腊字母表查询 PAGE PAGE 1 作者 日期 PAGE / NUMPAGES Matlab中常用希腊字母表查询 Matlabtext中经常需要用到希腊字母表我现在将所有都总结了下 比如在坐标轴[0.5 0.5]位置上要显示字符那么可以...
  • 我的国庆,我的远图

    2009-10-08 21:54:00
    因为是外企,我的国庆长假在10月6日就结束了。这个国庆是梦回平头实现,是单反摄影又一次专门实践,是远图手机定位长途测试。...一路我的远图定位一直开着,不时地出现“位置解析”...
  • // 绝对定位窗体的位置与大小 Container c = getContentPane(); // 创建容器对象 Label lb1 = new Label ("选择文件:"); b1 = new JButton("点击选择"); // 创建按钮 b1.addActionListener(this);//b1这个...
  • 然后前端请求全部从我缓存里面请求,那么问题来了,我以什么样结构存储才能方便通过经纬度进行查询了,用户传入经纬度信息随时都有可能发生改变,我现在不知道该怎么处理了,因为redis不知道多条件查询啊,...
  • 目前测试过有三种方法可以根据ip地址获取地理位置,第一种是通过新浪IP查询接口获取,第二种是通过腾讯IP查询接口获取,第三种是通过ip138查询。 一、新浪IP查询接口地址:...
  • 【写博客常用】论文代写代发骗局之是如何查骗子ip地址遇到了骗子制作一个小端口调用程序放到服务器上上传文档引诱骗子上钩然后就没有理他了查看上传文档查询位置 遇到了骗子 据说是北京公司,可以帮忙...
  • 昨天 九月十八日 星期五,武汉市徐家棚地铁站A出口。 本来非常开心从地铁站准备骑上本人电瓶车回家,出地铁站口子发现电瓶...我现在就有个疑问,美团单车能查询到已知位置,已知时间情况下,能查询到使用者吗
  • 在CSDN平台第一个博客 #一、首先,在逻辑教育机构python课程学习,了解了CSDN平台博客位置; #二、其次,现在开始学习CSDN博客平台操作界面,了解大概操作方式,通过初步了解,认识到这个平台提供和很...
  • 之前做了一个天气预报,里面就用到了根据IP自动定位技术,今天就给大家分享一波:根据IP地址...所以我们需要用到IP查询接口,之前用是:http://ip.chinaz.com这个网址接口,现在好像不能用了,于是又换了一个IP...
  •  有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能:  1:在a-b集合中插入一个数  2:询问a-b集合中所有元素第k大. SOL:  调得火大! 李建说数据结构题能锻炼人,然而我的水平...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 290
精华内容 116
关键字:

查询我现在的位置