Как преобразовать хэш геопространственных точек (широта, долгота) в значения широты?

Мой вопрос связан с Solr и фасетными запросами.

Я новичок в использовании Solr и использовании его с записями твитов. Моя цель - построить количество твитов, происходящих из уникальной точки (широта, долгота). Я получаю результаты индивидуального подсчета фасетов для уникальной точки ("pgeom"), но возвращаемое значение искажено, поскольку оно представляет собой хэш-представление сохраненных данных точки. Как этот хеш можно преобразовать обратно в полезную точку? Пожалуйста, смотрите детали ниже.

Существующие поля в наборе данных:

Пгеом: Точка гео-пространственная. Пример: "pgeom":"POINT(13.13735209 -4.2170403)"

долгота: долгота Пример: "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" для представления твитов из местоположения на карте Google.

Point Geo Spacial:

"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" в читаемый / пригодный для использования формат, скажем Point(12.041015625, 42.01171875) для "sfju"?

Большое спасибо за ваше время. lalan

2 ответа

Решение

Этот ответ основан на вкладе Дэвида и последующей дискуссии с моими коллегами. Мы обнаружили, что поле Solr, содержащее географическое местоположение, в нашем случае "pgeom", должно быть сконфигурировано для использования класса на основе PrefixTree. Как объяснено на следующей странице:

Solr Пространственный поиск - PrefixTree

После того, как поле Solr, в данном случае поле "pgeom", настроено на использование типа "location_rpt", в котором используется PrefixTree (class="solr.SpatialRecursivePrefixTreeFieldType").

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

После того, как у нас есть список, содержащий все побочные эффекты "pgeom", каждое из значений геохеша может быть декодировано в отдельные пары латунных пар, используя некоторые библиотеки, перечисленные в разделе "Внешние ссылки" в 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)
>>>

Быстро перепроверьте геохэш-декодирование: Пример1 Пример2

Также новой находкой стало использование Facet.limit для ограничения количества полей фасетов в ответе.

Большое спасибо, Дэвид.:)

Ответ на ваш конкретный вопрос заключается в том, чтобы индексировать геохеши в полную длину с точностью, которую вы хотите. Независимо от того, какой язык программирования вы выберете, я уверен, что вы можете найти библиотеку фрагмента кода для преобразования туда и обратно. Индексируйте его как строку и фасетку.

Затем вы сталкиваетесь с тем, как масштабировать, что может быть смешным количеством точек на карте. Вам придется использовать пространственную кластеризацию / тепловую карту. Смотрите http://wiki.apache.org/solr/SpatialClustering

Другие вопросы по тегам