【问题标题】:How to convert geospatial Point(lat,lon) hash back to lat lon values?如何将地理空间点(纬度,经度)哈希转换回纬度值?
【发布时间】:2013-09-09 17:23:05
【问题描述】:

我的问题与 Solr 和方面查询有关。

我不熟悉使用 Solr 并将其与推文记录一起使用。我的目标是绘制源自一个独特点(纬度,经度)的推文数量。我正在获取唯一点(“pgeom”)的单个方面计数结果,但返回的值是乱码,因为它是存储点数据的哈希表示。如何将此哈希转换回可用点?请参阅下面的详细信息。

数据集中的现有字段:

pgeom :点地理空间。示例:“pgeom”:“POINT(13.13735209 -4.2170403)”

lon :经度。示例:“lon”:13.13735209

lat:纬度。示例:“纬度”:-4.2170403}

查询参数示例:

在这里,我尝试使用对所有三个“lat”、“lon”和“pgeom”的构面字段查询来获取单个推文计数。

?q=%3A&facet=true&fl=lat,lon,pgeom&facet.field=pgeom&facet.field=lat&facet.field=lon

Json 结果:

“pgeom”构面查询会产生带有相关计数的摄取点的哈希值。其中“lat”和“lon”导致与每个纬度和经度相关联的单独推文计数。我想使用这个“pgeom”哈希来表示来自谷歌地图上某个位置的推文。

点地理空间:

"pgeom":[
    "s",5931,
    "sfju",361,
    "sx",336,
        .. and so on

经度:

"lon":[
    "9.6017436",361,
    "6.807174",195,
    "9.28786844",167,
    "5.4770747",169,
    "9.03439492",112,
         .. and so on

纬度:

"lat":[
    "4.450025",361,
    "9.420721",195,
    "1.29138702",167,
    "8.6851517",169,
    "0.97996991",157,
        .. and so on

响应标头:

"responseHeader":{
"status":0,
"QTime":990,
"params":{
  "facet":"true",
  "fl":"lat,lon,pgeom",
  "indent":"on",
  "start":"200",
  "q":"*:*",
  "facet.field":["lat",
    "lon",
    "pgeom"],
  "wt":"json",
  "rows":"200"}},

回复:

"response":{"numFound":2034074,"start":200,"docs":[
  {
    "pgeom":"POINT(13.13735209 -4.2170403)",
    "lon":13.13735209,
    "lat":-4.2170403},
  {
    "pgeom":"POINT(18.284989 -8.731565)",
    "lon":18.284989,
    "lat":-8.731565},
  {
        .. and so on

如何将“s”、“sxp”、“sfju”等值转换为可读/可用格式,比如“sfju”的 Point(12.041015625, 42.01171875)?

非常感谢您的宝贵时间。 拉兰

【问题讨论】:

    标签: solr geospatial solr4


    【解决方案1】:

    您的具体问题的答案是让您将完整长度的geohashes 索引到您想要的精度。无论您选择哪种编程语言,我相信您都可以找到一个代码库 sn-p 来来回转换。将其索引为字符串和构面。

    然后,您将面临如何以可扩展的方式在地图上绘制出荒谬数量的点。您必须使用空间聚类/热图。见http://wiki.apache.org/solr/SpatialClustering

    【讨论】:

    • 感谢您的宝贵时间。所以我想,没有办法在不修改服务器设置的情况下获得所需的结果。目前,我不需要绘制所有点,只需绘制前 200 个 - 由 facet.range 定义的区域内的最高推文计数 lat,lon 说 lat:[10.0 到 20.0] 和 lon:[20.0 到 30.0 ].
    • 无法绕过从分面区域解码 geohash 的需要。这没什么大不了的。你肯定可以找到代码来完成这个简单的任务。例如,如果您的客户端是浏览器,则使用 Javascript:github.com/davetroy/geohash-js/blob/master/geohash.js
    【解决方案2】:

    此答案基于 David 的意见以及与我的同事的后续讨论。我们发现包含地理位置的 Solr 字段,在我们的例子中是“pgeom”,必须配置为使用基于 PrefixTree 的类。如下页所述:

    Solr Spatial Search - PrefixTree

    一旦 Solr 字段(在本例中为“pgeom”字段)配置为使用“location_rpt”类型,该类型使用 PrefixTree (class="solr.SpatialRecursivePrefixTreeFieldType")。

    <field name="pgeom"  type="location_rpt"  indexed="true" stored="true"  multiValued="true" />
    

    一旦我们有了包含所有“pgeom”方面结果的列表,就可以使用Geohash 上“外部链接”下列出的一些库将每个 geohash 值解码为单独的纬度对。我使用了一个未列出的库python-geohash

    >>> import geohash
    >>> print 'geohash for 42.5, -4.0:', geohash.encode(42.5,-4.0)
    geohash for 42.5, -4.0: ezt1ubzk3npz
    >>> print 'coordintate for geohash s', geohash.decode('s')
    coordintate for geohash s (22.5, 22.5)
    >>> print 'coordintate for geohash sfju', geohash.decode('sfju')
    coordintate for geohash sfju (12.041015625, 42.01171875)
    >>>
    

    快速交叉校验geohash解码:Example1Example2

    另外,一个新发现是使用Facet.limit 来限制响应中的构面字段计数。

    非常感谢大卫。 :)

    【讨论】:

      猜你喜欢
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 2022-12-21
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多