Ganos的資料查詢採用GeoTools Query對象來完成,Query中的查詢條件是通過構建CQL查詢語句來實現的。同時Query還有更多強大的功能,可以指定返回的屬性列、對某一屬性進行排序等。返回的資料是以SimpleFeatureCollection對象存在,可以通過迭代器遍曆所有的SimpleFeature,進而解析出需要的資料。
構造查詢條件
查詢條件也稱之為過濾器(Filter),採用CQL語言描述。CQL功能類似SQL語句的WHERE子句,根據這些條件可以過濾資料。
空間查詢
空間查詢支援如下謂詞,表中的Expression表示WKT表示的空間對象(點、線、面):
| 文法 | 描述 |
| INTERSECTS(Expression , Expression) | 判斷兩個空間對象是否相交,例如兩條道路是否相交。 |
| DISJOINT(Expression , Expression) | 判斷兩個空間對象是否相離。 |
| CONTAINS(Expression , Expression) | 判斷第一個空間對象是否包含第二個空間對象。 |
| WITHIN(Expression , Expression) | 與CONTAINS謂詞相反,判斷第一個對象是否被第二個空間對象包含。 |
| TOUCHES(Expression , Expression) | 判斷兩要素是否相接,即至少有一個公用點要素。 |
| CROSSES(Expression , Expression) | 判斷兩個空間要素是否相交,要求僅有部分交集而不是完全包含。 |
| BBOX(Expression , Xmin , Ymin , Xmax , Ymax [ , CRS ]) | 空間對象[Expression]是否與[Xmin,Ymin,Xmax,Ymax]所組成的四邊形相交。 |
可選的CRS是空間參考系,包含SRS代碼的字串(例如,EPSG:1234。預設使用查詢圖層的CRS)。
- 案例1:擷取某個空間範圍(120E,30N,130E,40N)所包含的空間對象(餐館、船舶、車輛等)。
DataStore ds = DataStoreFinder.getDataStore(params); SimpleFeatureType schema=... String stFilter = "bbox(geom, 120,30,130,40)" Query query = new Query(schema, ECQL.toFilter(stFilter)); SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query); - 案例2:擷取周邊5公裡範圍內的所有車輛。
- 首先將周邊5公裡的範圍構造成空間對象(面),假設為(46.9 48.9, 47.1 48.9, 47.1 49.1, 46.9 49.1, 46.9 48.9)。
- 使用contains謂詞將所有對象過濾出來```String stFilter = “contains(‘POLYGON ((46.9 48.9, 47.1 48.9, 47.1 49.1, 46.9 49.1, 46.9 48.9))’, geom)
時空查詢
HBase Ganos支援的時間查詢謂詞如下,表中的Expression為時間列名,Time為字串。表示的時間UTC:
| 文法 | 描述 |
| Expression BEFORE Time | 時間在Time之前 |
| Expression BEFORE OR DURING Time Period | 時間在Time Period之前或包含在Time Period之中 |
| Expression DURING Time Period | 時間在Time Period之中 |
| Expression DURING OR AFTER Time Period | 時間在Time Period之中或之後 |
| Expression AFTER Time | 時間在Time Period之後 |
HBase Ganos支援的時間表達方式有多種:
| 文法 | 描述 |
| Time / Time | 由起始時間和結束時間定義的區間 |
| Duration / Time | 在Time之前的時間區間 |
| Time / Duration | 在Time之後的時間區間 |
樣本:如使用者想查詢位於(120E,30N,130E,40N)之中,時間介於2014-01-01T11:45:00與2014-01-01T12:15:00之間的車輛軌跡,那麼需要將空間查詢和時間查詢結合在一起,如下:
String stFilter = “bbox(geom, 120,30,130,40) AND dtg DURING 2014-01-01T11:45:00.000Z/2014-01-01T12:15:00.00
Query query = new Query(schema, ECQL.toFilter(stFilter));
SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query);說明
- 比較子包括:=,<>,>,>=,<,<=,如要選取人口大於1500萬的城市,條件為PERSONS>15000000,其中PERSONS為人口數量的欄位,後面不再單獨說明。
- BETWEEN表示從一個範圍到另一個範圍,如
PERSONS BETWEEN 1000000 AND 3000000。 - 比較子支援文本值,可在運算子=的右側指定文本值,如
CITY_NAME='Beijing',表示選擇北京市;也可以使用LIKE操作符,與SQL中的用法一樣,如CITY_NAME LIKE 'N%'會選擇所有以N開頭的城市。 - 對兩個屬性進行比較,如
MALE > FEMALE,選擇男性多於女性的城市。 - 算術運算式可以使用 +, -, *, /構成,如過濾條件
UNEMPLOY/(EMPLOYED + UNEMPLOY) > 0.07選擇所有失業率大於7%的城市。 - 使用IN操作符,可選擇屬性在給定值範圍內的,與SQL用法相同,如
ID IN ('cities.1', 'cities.12'),或尋找名字在給定值內的城市,可使用CITY_NAME IN ('Beijing','Shanghai', 'Guangzhou')。 - 可使用Geoserver中的任何過濾函數,如
strToLowerCase(CITY_NAME) like '%m%',表示名字中包含m的城市,不區分M的大小寫。 - 幾何過濾,使用BBOX,如
BBOX(the_geom, -90, 40, -60, 45)表示選擇在(-90, 40, -60, 45)範圍內的城市。
String filter = “ name = ‘bob’”
val q = new Query(sft.getTypeName, ECQL.toFilter(filter))
SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query); 上例查詢中對name欄位的值做了限制。
### 指定返回列名使用者可以通過配置Query對象參數指定具體返回哪些列,
String[] returnFields=… //指定返回欄位名
Query query = new Query(schema, ECQL.toFilter(ecqlPredicate));
query.setPropertyNames(returnFields);
SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query);### 指定排序方式使用者可以通過構建SortBy對象參數指定具體返回哪些列,如:
String sortField=… //指定排序欄位名
FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();
SortBy[] sort = new SortBy[]{ff.sort(sortField, order)};
query.setSortBy(sort);
SimpleFeatureCollection features=ds.getFeatureSource(schema).getFeatures(query);