GeoMesa Java API-寫入與查詢數(shù)據(jù)

1 寫入數(shù)據(jù)

GeoMesa作為空間大數(shù)據(jù)處理框架圈膏,本身是不存儲(chǔ)數(shù)據(jù)的。數(shù)據(jù)存儲(chǔ)依賴于底層的分布式數(shù)據(jù)庫篙骡,如HBase稽坤,Accumulo等桥帆。GeoMesa為了同時(shí)支持多種數(shù)據(jù)庫,提供了一個(gè)抽象的接口慎皱,屏蔽不同數(shù)據(jù)庫操作方法的差異老虫,使用戶用一種統(tǒng)一的方式存儲(chǔ)和查詢數(shù)據(jù)。來看下面這GeoMesa存儲(chǔ)架構(gòu)圖:

sampleIngestArch.png

從這張圖中可以看出茫多,無論采用何種方式寫入數(shù)據(jù)祈匙,我們都不需要直接操作數(shù)據(jù)庫,而只需按照GeoTools或GeoMesa的接口天揖,規(guī)范好要存儲(chǔ)的數(shù)據(jù)夺欲,提交給GeoMesa處理即可。GeoMesa會(huì)自動(dòng)為我們完成創(chuàng)建元數(shù)據(jù)今膊、創(chuàng)建索引些阅、存儲(chǔ)數(shù)據(jù)等一系列過程。

GeoTools 是英國利茲大學(xué)(University of Leeds)的James Macgll 從1996 年開始研發(fā)的一個(gè)操作和顯示地圖的開源Java 代碼庫斑唬,提供了一系列符合規(guī)范的操作地理空間數(shù)據(jù)的方法市埋,可以用它來實(shí)現(xiàn)一個(gè)地理信息系統(tǒng)。GeoTools庫在開發(fā)時(shí)執(zhí)行OGC規(guī)范恕刘。

GeoTools提供了許多用于表示地理空間數(shù)據(jù)的接口缤谎,可以用他們來定義需要存儲(chǔ)的數(shù)據(jù):

DataStore

DataStore是數(shù)據(jù)的核心訪問模型,存儲(chǔ)了數(shù)據(jù)集的名稱褐着、數(shù)據(jù)結(jié)構(gòu)與類型坷澡、數(shù)據(jù)訪問源等信息,類似一種數(shù)據(jù)元信息的存儲(chǔ)集合含蓉,用于定義和描述數(shù)據(jù)的基本信息频敛。

SimpleFeatureType

SimpleFeatureType即簡單要素類型,用于定義數(shù)據(jù)類型馅扣,類似SQL語句中create table時(shí)定義表字段時(shí)所指定的信息斟赚。常用一種特殊格式的字符串表示,如:

tpList:String,startTime:Date:default=true,startPoint:Point:srid=4326:default=true

創(chuàng)建SimpleFeatureType時(shí)岂嗓,需要使用GeoMesa提供的org.locationtech.geomesa.utils.interop.SimpleFeatureTypes類汁展,而不是直接使用Geotools的DataUtilities創(chuàng)建,目的是為了支持更多的數(shù)據(jù)類型厌殉。

sft = SimpleFeatureTypes.createType(getTypeName(), attributes.toString());

SimpleFeatureType在DataStore中被稱為Schema食绿,使用dataStore.createSchema(sft)函數(shù)在DataStore中創(chuàng)建Schema。

SimpleFeature

SimpleFeature即簡單要素公罕,用于定義具體的數(shù)據(jù)器紧。可以使用Geotools提供的SimpleFeatureBuilder類創(chuàng)建楼眷,只需要按照先前定義的SimpleFeatureType铲汪,依次傳入相應(yīng)類型的數(shù)據(jù)熊尉,最后設(shè)置Feature的ID即可,如:

SimpleFeatureBuilder builder = new SimpleFeatureBuilder(getSimpleFeatureType());
builder.set("tpList", ptListString);
builder.set("startTime", new Date(Long.valueOf(startTime)*1000));
builder.set("startPoint", "POINT (" + startPointY + " " + startPointX + ")");
SimpleFeature feature = builder.buildFeature(id);

其中掌腰,空間數(shù)據(jù)可以用WKT(well-known-text)格式的字符串來表示狰住。

寫入

創(chuàng)建好SimpleFeature后,就可以開始向數(shù)據(jù)庫中寫入數(shù)據(jù)了齿梁。
使用Geotools提供的FeatureWriter執(zhí)行寫入操作催植,具體代碼如下:

FeatureWriter<SimpleFeatureType, SimpleFeature> writer = datastore.getFeatureWriterAppend(sft.getTypeName(), Transaction.AUTO_COMMIT)
for (SimpleFeature feature : features) {
    SimpleFeature toWrite = writer.next();
    // copy attributes
    toWrite.setAttributes(feature.getAttributes());
    // if you want to set the feature ID, you have to cast to an implementation class
    // and add the USE_PROVIDED_FID hint to the user data
     ((FeatureIdImpl) toWrite.getIdentifier()).setID(feature.getID());
     toWrite.getUserData().put(Hints.USE_PROVIDED_FID, Boolean.TRUE);

    // make sure to copy the user data, if there is any
    toWrite.getUserData().putAll(feature.getUserData());

    // write the feature
    writer.write();
}

完整代碼:官方教程

2 查詢數(shù)據(jù)

GeoMesa同樣使用了GeoTools工具,作為查詢操作的接口勺择,查詢時(shí)的過程圖如下:

sampleQueryArch.png

使用GeoTools進(jìn)行查詢的基本流程如下:
① 獲取要查詢的要素名稱创南,即寫入時(shí)SimpleFeatureType的Name
② 對想要查詢的字段,編寫相應(yīng)的查詢條件省核,并創(chuàng)建Filter類型的對象
③ 創(chuàng)建Query對象稿辙,將上一步中所有查詢條件加入其中
④ 執(zhí)行查詢,獲得查詢結(jié)果

其中气忠,查詢條件可以使用GeoTools提供的CQL(GeoTools’ Contextual Query Language)或ECQL語句編寫邻储,并直接轉(zhuǎn)換為Filter對象,例如:

Filter result = CQL.toFilter("ATTR1 < 10 AND ATTR2 < 2 OR ATTR3 > 10" );
Filter result = CQL.toFilter( "ATTR1 AFTER 2006-11-30T01:30:00Z/2006-12-31T01:30:00Z" );
Filter result = CQL.toFilter( "CONTAINS(ATTR1, POINT(1 2))" );
Filter result = CQL.toFilter( "BBOX(ATTR1, 10,20,30,40)" );
Filter result = CQL.toFilter( "DWITHIN(ATTR1, POINT(1 2), 10, kilometers)" );

完整CQL教程:官方文檔

執(zhí)行查詢時(shí)笔刹,使用FeatureReader完成查詢操作芥备,代碼如下:

List<SimpleFeature> queryFeatureList = new ArrayList<>();
FeatureReader<SimpleFeatureType, SimpleFeature> reader = datastore.getFeatureReader(query, Transaction.AUTO_COMMIT) 
int n = 0;
while(reader.hasNext()){
    SimpleFeature feature=reader.next();
    queryFeatureList.add(feature);
    n++;
}
System.out.println();
System.out.println("Returned"+n+"totalfeatures");

完整代碼:官方教程

幾個(gè)常用查詢條件

設(shè)置最大返回條目:

Query query = new Query(typeName, ECQL.toFilter(queryCQL));
query.setMaxFeatures(Integer.parseInt(maxView));

設(shè)置排序:

Query query = new Query(typeName, ECQL.toFilter(queryCQL));
FilterFactoryImpl ff = new FilterFactoryImpl();
query.setSortBy(new SortBy[]{new SortByImpl(ff.property("startTime"), SortOrder.ASCENDING)});

統(tǒng)計(jì)查詢-查總數(shù)

Query query = new Query(typeName);
query.getHints().put(QueryHints.STATS_STRING(), "Count()");

聚合查詢-GroupBy冬耿,查每個(gè)分組的總數(shù)

Query query = new Query(typeName);
query.getHints().put(QueryHints.STATS_STRING(), "GroupBy(\"carID\",Count())");

統(tǒng)計(jì)查詢-查最大最小值

Query query = new Query(typeName);
query.getHints().put(QueryHints.STATS_STRING(), "MinMax(\"startTime\")");

更多類型的統(tǒng)計(jì)/聚合查詢:官方文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舌菜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子亦镶,更是在濱河造成了極大的恐慌日月,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缤骨,死亡現(xiàn)場離奇詭異爱咬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绊起,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門精拟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人虱歪,你說我怎么就攤上這事蜂绎。” “怎么了笋鄙?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵师枣,是天一觀的道長。 經(jīng)常有香客問我萧落,道長践美,這世上最難降的妖魔是什么洗贰? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮陨倡,結(jié)果婚禮上敛滋,老公的妹妹穿的比我還像新娘。我一直安慰自己兴革,他們只是感情好矛缨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著帖旨,像睡著了一般箕昭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上解阅,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天落竹,我揣著相機(jī)與錄音,去河邊找鬼货抄。 笑死述召,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蟹地。 我是一名探鬼主播积暖,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼怪与!你這毒婦竟也來了夺刑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤分别,失蹤者是張志新(化名)和其女友劉穎遍愿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耘斩,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沼填,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了括授。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坞笙。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荚虚,靈堂內(nèi)的尸體忽然破棺而出薛夜,到底是詐尸還是另有隱情,我是刑警寧澤曲管,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布却邓,位于F島的核電站,受9級特大地震影響院水,放射性物質(zhì)發(fā)生泄漏腊徙。R本人自食惡果不足惜简十,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撬腾。 院中可真熱鬧螟蝙,春花似錦、人聲如沸民傻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漓踢。三九已至牵署,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間喧半,已是汗流浹背奴迅。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挺据,地道東北人取具。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像扁耐,于是被迫代替她去往敵國和親暇检。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355