最近專案中使用到了solr,並且需求中需要通過給定乙個經緯度,查詢附件方圓多少多少範圍的店鋪資訊,網上查了一下資料,大致總結了一下有幾種使用方式
1.使用latlontype(用於平面座標,而不是大地座標)版本比較老 好像不怎麼用了
2.spatialrecursiveprefixtreefieldtype(縮寫為rpt) 我用的就是這個 下面主要講這個部分
3.bboxfield(用於邊界索引查詢) 沒用這個 具體的還不太了解
因為我主要使用的是第2種方式來做的 所以主要寫第2種方式rpt
首先的話需要在solr的配置檔案中加上經緯度的配置 比如我的經緯度起的名稱叫latitude_longitude 那麼在配置中就需要加上這個的配置
這裡的type型別為location_rpt 然後下面的class引用就是我們的第2種-——spatialrecursiveprefixtreefieldtype
對solr.spatialrecursiveprefixtreefieldtype的配置說明:
spatialrecursiveprefixtreefieldtype
用於深度遍歷字首樹的fieldtype,主要用於獲得基於lucene中的recursiveprefixtreestrategy。
geo預設為true,值為true的情況下座標基於球面座標系,採用geohash的方式;值為false的情況下座標基於2d平面的座標系,採用euclidean/cartesian的方式。
disterrpct
定義非point圖形的精度,範圍在0-0.5之間。該值決定了非point的圖形索引或查詢時的level(如geohash模式時就是geohash編碼的長度)。當為0時取maxlevels,即精度最大,精度越大將花費更多的空間和時間去建索引。
maxdisterr/maxlevels:maxdisterr
定義了索引資料的最高層maxlevels,上述定義為0.000009,根據 geohashutils.lookuphashlenforwidthheight(0.000009, 0.000009)算出編碼長度為11位,精度在1公尺左右,直接決定了point索引的term數。maxlevels優先順序高於maxdisterr, 即有maxlevels的話maxdisterr失效。詳見spatialprefixtreefactory.init()方法。不過一般使用 maxdisterr。
units
單位是degrees。
接下來經緯度的資料從資料庫讀取出來 會有乙個精度和乙個緯度的字段,而在solr當中我們需要把這2個字段組合在一起 可以使用2種表達方式 比如114.31,30.52 或者114.31 30.52 一種是使用逗號隔開,另一種是使用空格的方式隔開 這裡要記住一點 精度和緯度不要弄反了 不然會報錯的 我之前就是因為把這2個值組合在一起寫反了 然後報的異常資訊:
can't parse point '30.570000 114.020000' because: bad y value 114.02 is not in boundary rect(minx=-180.0,maxx=180.0,miny=-90.0,maxy=90.0)
報錯也非常的明顯 就是超出了正常範圍的值。所以在這裡提乙個醒 注意一下就行了。
這裡使用「經度 緯度」這樣的字串格式將經緯度索引新增到latitude_longitude欄位中 注意一點的是 如果你是先在solr中加入這個field的話 它會自動新增該字段的 然後型別為string 然後你再手動新增的話就會出現2個 執行的時候會報重複的字段值 所以如果有2個的話就需要刪除乙個 field不能重複 就把自動生成為string的刪除掉 當然如果你正常先走第一步的話就不會出現這樣的問題。
q=q=
q=poi_location_p:"intersects(-74.093 41.042 -69.347 44.558)" //a bounding box (not in wkt)
q=poi_location_p:"intersects(polygon((-10 30, -40 40, -10 -20, 40 20, 0 0, -10 30)))" //a wkt example
涉及到的字段說明:
字段含義
q查詢條件,如 q=poi_id:134567
fq過濾條件,如 fq=store_name:農業
fl返回字段,如fl=poi_id,store_name
pt座標點,如pt=54.729696,-98.525391
d搜尋半徑,如 d=10表示10km範圍內
sfield
指定座標索引字段,如sfield=geo
deftype
指定查詢型別可以取 dismax和edismax,edismax支援boost函式相乘作用,dismax是通過累加方式計算最後的score.
qf指定權重字段:qf=store_name^10+poi_location_p^5
score
排序字段根據qf定義的字段deftype定義的方式計算得到score排序輸出
在程式當中的話 則是:
if(latitude!=null&&longitude!=null) "); //距離過濾函式
query.set("pt", longitude+" "+latitude); //當前經緯度
query.set("sfield", "latitude_longitude"); //經緯度的字段
query.set("d", 5+""); //就近 5 km的所有資料
query.set("sort", "geodist() asc"); //距離排序
query.set("fl","*,dist:geodist()");//返回的距離資料
}整個過程大致就是醬紫的 因為這裡我只使用到了第2種搜尋經緯度的方式,第1和第3種的還沒有用到 所以就主要就第2種rpt的方式來寫的。
經緯度座標轉換
經緯度與xy座標轉換工具類 public class latlngxyzconverthelper xy轉經緯度 需要轉換的x座標 需要轉換的y座標 地圖級別 轉換後的經度 轉換後的緯度 public static void tiletolatlng double tile x,double til...
經緯度座標系轉東北天 經緯度座標系轉換
網際網路地圖的座標系現狀 地球座標 wgs84 國際標準,從 gps 裝置中取出的資料的座標系 國際地圖提供商使用的座標系 火星座標 gcj 02 也叫國測局座標系 中國標準,從國行移動裝置中定位獲取的座標資料使用這個座標系 國家規定 國內出版的各種地圖系統 包括電子形式 必須至少採用gcj 02對...
arcgis 經緯度轉大地座標 大地經緯度轉UTM
在日常gnss應用中,常需要應用到utm座標,而python提供了較為完備座標轉換工具,無需再去用arcgis了。首先貼出幾個帖子,值得一讀,其次,說一下要用到的工具,pyproj,其源於proj4庫 安裝 pip install pyproj 呼叫 import pyproj 再者,庫函式使用,先...