Как преобразовать хэш геопространственных точек (широта, долгота) в значения широты?
Мой вопрос связан с 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