日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

java gdal postgresql_使用GDAL/OGR操作Postgresql数据库

發(fā)布時(shí)間:2023/12/9 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java gdal postgresql_使用GDAL/OGR操作Postgresql数据库 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.



GDAL(Geospatial Data AbstractionLibrary)是一個(gè)在X/MIT許可協(xié)議下的開源柵格空間數(shù)據(jù)轉(zhuǎn)換庫。它利用抽象數(shù)據(jù)模型來表達(dá)所支持的各種文件格式。它還有一系列命令行工具來進(jìn)行數(shù)據(jù)轉(zhuǎn)換和處理。

本文將使用GDAL/OGR庫讀寫Postgresql數(shù)據(jù)庫中的表,代碼執(zhí)行環(huán)境在ubuntu12.04,

直接上代碼

#include "/usr/include/gdal/ogrsf_frmts.h"

#include "/usr/include/gdal/ogr_feature.h"

#include "/usr/include/gdal/ogr_geometry.h"

#include "/usr/include/gdal/gdal_priv.h"

///

//使用OGR讀Postgresql

///

int getFeature( vector& RoadList //RoadRec是自定義數(shù)據(jù)結(jié)構(gòu)

)

{

OGRRegisterAll();

const char* filepath =

"PG:dbname=test host=172.0.0.1 port=5432 user=postgres password=postgres";

const char* drivename = "Postgresql"; //標(biāo)明是Postgresql數(shù)據(jù)庫操作

const char* ptablename = "roadlist";//數(shù)據(jù)表名稱 table name

OGRSFDriver* pdriver = NULL;

OGRLayer* player = NULL;

OGRDataSource* pDS = NULL;

//注冊驅(qū)動(dòng),這樣ogr就知道即將打開的是什么類型的文件

pdriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(drivename);

if ( pdriver == NULL ) {

return FAILURE;

}

//驅(qū)動(dòng)注冊完畢打開數(shù)據(jù)庫

pDS = pdriver->Open(filepath,0);

if ( NULL == pDS ) {

return FAILURE;

}

//打開數(shù)據(jù)庫中的數(shù)據(jù)表

player = pDS->GetLayerByName(ptablename);

if ( NULL == player ) {

return FAILURE;

}

//OGRFeature*相當(dāng)于指向數(shù)據(jù)表中一條記錄的指針,根據(jù)它可以獲取每一個(gè)字段

OGRFeature* pogrfeature = NULL;

player->ResetReading();

int gid = 0;

//循環(huán)遍歷每一條記錄,這里的遍歷是按照表中數(shù)據(jù)的存儲(chǔ)順序遍歷

//并不會(huì)按照主鍵唯一值順序遍歷,這和sql的select結(jié)果的順序不一樣

//想要一樣應(yīng)該創(chuàng)建索引,并將表數(shù)據(jù)按索引順序存儲(chǔ)

/*

CREATE INDEX roadlist_gid_idx

ON roadlist

USING btree

(gid);

cluster roadlist using roadlist_gid_idx;

*/

while( (pogrfeature = player->GetNextFeature()) != NULL )

{

gid++;

//獲取一條記錄中的幾何屬性字段的引用

OGRGeometry *pgeo = pogrfeature->GetGeometryRef();

if ( NULL != pgeo )

{

//判斷一下是不是自己想要的類型,這里我的數(shù)據(jù)是道路,line數(shù)據(jù)

if ( wkbMultiLineString == pgeo->getGeometryType() || wkbLineString == pgeo->getGeometryType() )

{

OGRGeometry* pgeometry = pgeo;

//單獨(dú)處理一下multilinestring的情況

if ( wkbMultiLineString == pgeo->getGeometryType() )

{

OGRMultiLineString* pmultilinestring = (OGRMultiLineString*)pgeo;

if( 1 != pmultilinestring->getNumGeometries() )

{

return FAILURE;

}

pgeometry = pmultilinestring->getGeometryRef(0);

}

//定義OGRLineString類型指針指向幾何數(shù)據(jù)

//這樣就可以使用OGRLineString提供的函數(shù)接口了

OGRLineString* pline = (OGRLineString *)pgeometry;

int pointnum = pline->getNumPoints();

RoadRec tmp;//自定義數(shù)據(jù)類型

//使用OGRFeature類提供的 GetFieldAsInteger

//方法獲取每個(gè)字段的值,”link_id”,”road_name”都是字段名

tmp.link_id = pogrfeature->GetFieldAsInteger("link_id");

//tmp.src_id = pogrfeature->GetFieldAsInteger("src_id");

tmp.road_name = pogrfeature->GetFieldAsString("road_name");

tmp.one_way = pogrfeature->GetFieldAsInteger("one_way");

//獲得幾何屬性的每一個(gè)點(diǎn)坐標(biāo)信息

for ( int pointid = 0; pointid < pointnum;++pointid )

{

OGRPoint point;

pline->getPoint(pointid,&point);

GEO_POINT geo_point;

geo_point.x = point.getX();

geo_point.y = point.getY();

tmp.vstShplist.push_back(geo_point);

}

RoadList.push_back(tmp);

}

}

//釋放Feature資源

OGRFeature::DestroyFeature(pogrfeature);

//cout<

}

//釋放指向該數(shù)據(jù)庫的指針

OGRDataSource::DestroyDataSource(pDS);

return SUCCESS;

}

///

//使用OGR寫Postgresql

///

int setFeature( const vector& RoadList )

{

OGRRegisterAll();

const char* filepath =

"PG:dbname=test host=172.0.0.1 port=5432 user=postgres password=postgres";

const char* drivename = "Postgresql";

const char* ptablename = "roadlist";

OGRSFDriver* pdriver = NULL;

OGRLayer* player = NULL;

OGRDataSource* pDS = NULL;

pdriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(drivename);

if ( pdriver == NULL ) {

return FAILURE;

}

pDS = pdriver->Open(filepath,0);

if ( NULL == pDS ) {

return FAILURE;

}

//相當(dāng)于sql語句中的創(chuàng)建數(shù)據(jù)表,只是這里只先指定表名稱和幾何字段屬性

player = pDS->CreateLayer( ptablename,NULL,wkbLineString,NULL );

if ( NULL == player )

{

return FAILURE;

}

//定義一個(gè)字段one_way

OGRFieldDefn* pfielddefn_oneway = new OGRFieldDefn("one_way",OFTInteger);

//在數(shù)據(jù)表中創(chuàng)建定義的字段

player->CreateField(pfielddefn_oneway);

OGRFieldDefn* pfielddefn_name = new OGRFieldDefn("road_name",OFTString);

player->CreateField(pfielddefn_name);

//刪除字段定義指針

delete pfielddefn_oneway;

delete pfielddefn_name;

int roadnum = RoadList.size();

//循環(huán)寫入每一條道路數(shù)據(jù)

for ( int roadcnt = 0; roadcnt < roadnum ;++roadcnt )

{

const RoadRec& roadrec = RoadList.at(roadcnt);

OGRLineString* pline = new OGRLineString;//要寫入的幾何字段

int pointnum = roadrec.vstShplist.size();

for ( int pointcnt = 0; pointcnt < pointnum ;++pointcnt )

{

const GEO_POINT& point = roadrec.vstShplist.at(pointcnt);

pline->addPoint(point.x,point.y);

}

OGRGeometry* pgeo = (OGRGeometry*)pline;

pgeo->setCoordinateDimension(2);//設(shè)置坐標(biāo)系維度

//創(chuàng)建一個(gè)指向要寫入的記錄的指針

//指定要寫入的數(shù)據(jù)庫player->GetLayerDefn()

OGRFeature* pfeature = OGRFeature::CreateFeature( player->GetLayerDefn() );

//設(shè)置當(dāng)前記錄的字段值

pfeature->SetField("one_way",roadrec.one_way);

pfeature->SetField("road_name",roadrec.road_name.c_str());

if ( OGRERR_NONE != pfeature->SetGeometry( pgeo ) )

{

return FAILURE;

}

//將記錄寫入數(shù)據(jù)表

if ( OGRERR_NONE != player->CreateFeature( pfeature ) )

{

return FAILURE;

}

delete pline;

OGRFeature::DestroyFeature(pfeature);

}

OGRDataSource::DestroyDataSource(pDS);

return SUCCESS;

}

int main()

{

vector roadlist;

getFeature(roadlist);

cout<

setFeature(roadlist);

return 0;

}

編譯鏈接:g++ -o feature feature_pro.cpp -lgdal

相關(guān)文章

總結(jié)

如果覺得編程之家網(wǎng)站內(nèi)容還不錯(cuò),歡迎將編程之家網(wǎng)站推薦給程序員好友。

本圖文內(nèi)容來源于網(wǎng)友網(wǎng)絡(luò)收集整理提供,作為學(xué)習(xí)參考使用,版權(quán)屬于原作者。

如您喜歡交流學(xué)習(xí)經(jīng)驗(yàn),點(diǎn)擊鏈接加入交流1群:1065694478(已滿)交流2群:163560250

總結(jié)

以上是生活随笔為你收集整理的java gdal postgresql_使用GDAL/OGR操作Postgresql数据库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。