//#include "gdal_priv.h"
//#include "ogrsf_frmts.h"
#include "ogr_feature.h"
#include "ogr_geometry.h"
#include "gdal_priv.h"
#include "ogrsf_frmts.h"
int main()
{
//GDALALLRegister();
//const char* filepath="jdbc:oracle:thin:@127.0.0.1:1521:HeSD";
//const char* drivename ="oracle.jdbc.driver.OracleDriver";
//GDALDataset *poDS;
//OGRDataSource *poDS = NULL;
//poDS = OGRSFDriverRegistrar::Open(inFileName, FALSE );
/*if( poDS == NULL )
{
MessageBox( _T("转换文件失败!"),_T("提示") );
exit(1);
}*/
//OGRRegisterALL();
//GDALALLRegister();
//OGRRegisterAll();
//const char* filepath ="OCI:dbname=test host=127.0.0.1 port=1521 user=Test password=1";
//const char* filepath2 ="OCI: system/123 @mytest";
//const char* drivename = "OCI";
//const char* ptablename = "Table1";
//GDALDriver* pdriver = NULL;
//OGRSFDriver* pdriver1 = NULL;
//OGRLayer* player = NULL;
//OGRDataSource* pDS =NULL;
//pdriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(drivename);
/*if(pdriver == NULL)
{
printf("failed");
}
*/
//pDS=pdriver1->Open(filepath,0);
//poDS->ExecuteSQL()
//poDS->ExecuteSQL("SELECT ")
//pDS = pdriver->Open(filepath,0);
//OGRRegisterALL();
//GDALALLRegister();
/*GetGDALDriverManager()->AutoLoadDrivers();
GDALDataset *poDS;
poDS=(GDALDataset*) GDALOpenEx("F:\\Desktop\Test.txt",GDAL_OF_VECTOR,NULL,NULL,NULL);
if(poDS == NULL)
{
printf("Open failed\n");
}*/
//OGRDataSource *poDS;
//poDS = OGRSFDriverRegistrar::OpenWithDriverArg(,"F:\Desktop\A.dbf");
//poDSOut = poDriverOut->Create("OCI: Test/1 @HeSD:Table1",NULL);
//poDSOut = poDriverOut->CreateDataSource(outFileName, NULL );
int m_all_fea_count=0;//总的要素个数
int m_fea_done_count=0;//已处理的要素个数
int m_fea_null_count=0;//空要素的个数
int m_geo_null_count=0;//空类型个数
int m_fea_fail_count=0;//创建失败要素个数
int m_fea_create_count=0;//创建成功要素个数
int m_geo_done=0;//已处理的非空geometry个数
int m_geo_point_count=0;//点类型个数
int m_geo_ori_error_count=0;//原始geometry错误
int m_geo_line_count=0;//线类型个数
int m_geo_multi_point_count=0;//多点类型个数
int m_geo_multi_line_count=0;//多线类型个数
int m_geo_polygon_count=0;//面类型个数
int m_error_count=0;//错误数量
int m_geo_multi_polygon_count=0;//多面类型个数
GDALAllRegister();//注册驱动
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");//必须设置中文路径
const char* filepath_oracle ="OCI: system/123 @mytest";//OCI: 用户名/密码 @SID
const char* filepath_shp ="E:\\桌面\\例子\\Chinadata\\Lambert\\中国湖泊.shp";
GDALDataset *poDS_oracle;
GDALDataset *poDS_shp;
poDS_oracle = (GDALDataset*) GDALOpenEx(filepath_oracle,GDAL_OF_VECTOR,NULL,NULL,NULL);
poDS_shp = (GDALDataset*) GDALOpenEx(filepath_shp,GDAL_OF_VECTOR,NULL,NULL,NULL);
if(poDS_shp==NULL)
{
printf("Open SHP failed");
}
if(poDS_oracle==NULL)
{
printf("Open Oracle failed");
}
/////////////获取shp文件图层名字
OGRLayer* player =NULL;
/*player = poDS_shp->GetLayer(0);
if(player==NULL)
{
printf("failed");
}
const char* a=player->GetName();
printf(a);
*/
int lyrCount=poDS_shp->GetLayerCount();//获得shp文件图层数量
OGRLayer* tempLayer;//临时图层 用来存取获得的shp图层 来统计总的要素个数。
for (int i=0;i<lyrCount;i++)
{
tempLayer=poDS_shp->GetLayer(i);//输出shape文件获取输入文件图层(空的)
unsigned int _fea_count=tempLayer->GetFeatureCount();//获取Feature数量
m_all_fea_count+=_fea_count;
}
//////////遍历shp文件
OGRLayer *poLayer;
for(int i=0;i<lyrCount;i++)
{
poLayer=poDS_shp->GetLayer(i);
//获得图层坐标
OGREnvelope extent;
poLayer->GetExtent(&extent);
OGRLayer *poLayerOut;
OGRFeatureDefn * poFeaDef=poLayer->GetLayerDefn();
//获取图层名称
const char* szlyrname=poFeaDef->GetName();
const char* res_lyrname;
res_lyrname=szlyrname;
//获取几何类型
OGRwkbGeometryType type=poLayer->GetLayerDefn()->GetGeomType();
//输入数据进输出的图层
poLayerOut=poDS_oracle->CreateLayer("hb",NULL,type);
//创建shape输出图层字段
int _field_count= poFeaDef->GetFieldCount(); //获得每行字段总数 不包含前两个字段(FID、shaape类型)
for (int i=0;i<_field_count;i++)
{
OGRFieldDefn *poField=poFeaDef->GetFieldDefn(i);
//创建shape输出图层字段
poLayerOut->CreateField(poField);
}
if(poLayerOut == NULL)
{
exit(1);
}
OGRFeature *poFeature;
//OGRFeature *poFeatureOut;
unsigned int _this_fea_count=poLayer->GetFeatureCount();
poLayer->ResetReading();
/////////遍历所有字段
for (unsigned long i=0;i<_this_fea_count;i++)
{
m_fea_done_count++;
poFeature = poLayer->GetNextFeature();
if (poFeature ==NULL)
{
m_fea_null_count++;
continue;
}
int fea_FID=poFeature->GetFID();
OGRGeometry *poGeometry=NULL;//几何拓扑关系
OGRLineString *poLine=NULL;
OGRPoint *poPoint=NULL;
OGRMultiPoint *poMultiPoint=NULL;
OGRMultiLineString *poMultiLineString=NULL;
OGRPolygon *poPolygon=NULL;
OGRMultiPolygon *poMultiPolygon=NULL;
poGeometry = poFeature->GetGeometryRef();//获取几何拓扑关系
//each geometry trans its coordinate
if(poGeometry == NULL)
{
m_geo_null_count++;
OGRErr _error =poLayerOut->CreateFeature( poFeature ) ;
if( _error!= OGRERR_NONE )
{
//LOGSTR( "error:Failed to create feature in shapefile." );
//return S_FALSE;
m_fea_fail_count++;
}
m_fea_create_count++;
OGRFeature::DestroyFeature( poFeature );
continue;
}
OGRwkbGeometryType type=poGeometry->getGeometryType();//获取几何类型
double _oldX;
double _oldY;
double _oldZ;
// double _oldX;
// double _oldY;
// double _oldZ;
int _pt_count=0;
int _ex_count;
OGRLinearRing* _ex_ring=NULL;
int _in_ring_count=0;
int _geo_count=0;
m_geo_done++;
//判别shape
switch (type)
{
//点
case wkbPoint:
case wkbPoint25D:
m_geo_point_count++;
poPoint=(OGRPoint*)poGeometry;
_oldX=poPoint->getX();//经度或东方向
_oldY=poPoint->getY();//纬度或北方向
_oldZ=poPoint->getZ();
if(_oldX>extent.MaxX||_oldX<extent.MinX||_oldY>extent.MaxY||_oldY<extent.MinY)
{
m_geo_ori_error_count++;
char *geo_Ori_Error=(char*)malloc(100);
int fea_FID=poFeature->GetFID();
itoa(fea_FID,geo_Ori_Error,10);
}
//_coordtransf( fea_FID , 1,&_oldX,&_oldY,&_oldZ,&_oldX,&_oldY,&_oldZ);
//TransLate(_oldX,_oldY,_oldZ,_oldX,_oldY,_oldZ);
if(poPoint->getDimension()==0)
{
poPoint->setX(_oldX);
poPoint->setY(_oldY);
}
else if(poPoint->getDimension()==1)
{
poPoint->setX(_oldX);
poPoint->setY(_oldY);
poPoint->setZ(_oldZ);
}
break;
//线
case wkbLineString:
case wkbLineString25D:
m_geo_line_count++;
poLine=(OGRLineString *) poGeometry;
_pt_count=poLine->getNumPoints();
for (int i=0;i<_pt_count;i++)
{
_oldX=poLine->getX(i);//经度或东方向
_oldY=poLine->getY(i);//纬度或北方向
_oldZ=poLine->getZ(i);
if(_oldX>extent.MaxX||_oldX<extent.MinX||_oldY>extent.MaxY||_oldY<extent.MinY)
{
m_geo_ori_error_count++;
char *geo_Ori_Error=(char*)malloc(100);
int fea_FID=poFeature->GetFID();
itoa(fea_FID,geo_Ori_Error,10);
}
//_coordtransf( fea_FID , 1,&_oldX,&_oldY,&_oldZ,&_oldX,&_oldY,&_oldZ);
//TransLate(_oldX,_oldY,_oldZ,_oldX,_oldY,_oldZ);
if (poLine->getDimension()==0)
{
poLine->setPoint(i,_oldX,_oldY);
}
else if(poLine->getDimension()==1)
{
poLine->setPoint(i,_oldX,_oldY);
}
else if(poLine->getDimension()==2)
{
poLine->setPoint(i,_oldX,_oldY,_oldZ);
}
}
//_coordtransf(_pt_count,ori_x,ori_y,ori_z,Newx,New
利用GDAL2.1.2库 把shp文件导入 oracle数据库中 例子
需积分: 18 144 浏览量
2017-11-16
23:57:37
上传
评论 2
收藏 10.68MB RAR 举报
为何为肖
- 粉丝: 16
- 资源: 7