使用gdal ogr创建shapefile文件(c++)
来源:互联网 发布:网络用语ng是什么意思 编辑:程序博客网 时间:2024/05/19 20:20
使用ogr库创建点状要素的shapefile文件以及将经纬度坐标转为投影坐标。实例如下:
#include "ogrsf_frmts.h"#include "gdal.h"#include "gdal_priv.h"#include "cpl_string.h" #include <string>#include <iostream>#include <strstream>using namespace std;void convertToShp(double longitude, double latitude, char *outshp){ //使属性表字段支持中文 CPLSetConfigOption("SHAPE_ENCODING",""); OGRRegisterAll();//注册所有的驱动 //创建ESRI shp文件 char *pszDriverName = "ESRI Shapefile"; //调用对Shape文件读写的Driver OGRSFDriver *poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName); if (poDriver == NULL) { cout<<pszDriverName<<"驱动不可用!"<<endl; return; } //创建数据源 OGRDataSource *poDs = poDriver->CreateDataSource(outshp, NULL); if (poDs == NULL) { cout<<"DataSource Creation Error"<<endl; return; } //创建图层Layer string outShapName = outshp; string layerName = outShapName.substr(0, outShapName.length()-4); //layerName.c_str()表示将string转为char *类型 //参数说明:新图层名称,坐标系,图层的几何类型,创建选项,与驱动有关 OGRLayer *poLayer = poDs->CreateLayer(layerName.c_str(), NULL, wkbPoint, NULL); if (poLayer == NULL) { cout<<"Layer Creation Failed"<<endl; OGRDataSource::DestroyDataSource(poDs); return; } //下面创建属性表,我们在属性表中创建两列数据即可 //先创建一个“ID”整型属性 OGRFieldDefn oFieldId("ID", OFTInteger); oFieldId.SetWidth(5); poLayer->CreateField(&oFieldId); //再创建一个"X"double属性 OGRFieldDefn oFieldX("X", OFTString); oFieldX.SetWidth(30); poLayer->CreateField(&oFieldX); //再创建一个"Y"double属性 OGRFieldDefn oFieldY("Y", OFTString); oFieldY.SetWidth(30); poLayer->CreateField(&oFieldY); //创建一个feature OGRFeature *poFeature; poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());//GetLayerDefn()获取当前图层的属性表结构 //给属性表中我们刚创建的列赋值 int i = 0; poFeature->SetField("ID", i); poFeature->SetField("X", longitude); poFeature->SetField("Y", latitude); i++; //创建一个OGRPoint对象 OGRPoint point; point.setX(longitude); point.setY(latitude); //point.setZ(0); poFeature->SetGeometry(&point); if(poLayer->CreateFeature(poFeature) != OGRERR_NONE ) { printf( "Failed to create feature in shapefile.\n" ); exit( 1 ); } OGRFeature::DestroyFeature(poFeature); OGRDataSource::DestroyDataSource(poDs); }//======= 经纬度转化为投影坐标=============double* transfer(double longitude, double latitude){ OGRSpatialReference oSourceSRS; //EPSG code 代表特定的椭球体、单位、地理坐标系或投影坐标系等信息 //This method will initialize the spatial reference based on the passed in EPSG GCS or PCS code oSourceSRS.importFromEPSG(4326);//EPSG:4326代表地理坐标系WGS1984 OGRSpatialReference oTargetSRS; oTargetSRS.importFromEPSG(2029);// utm zone 17N OGRCoordinateTransformation *poTransform; poTransform = OGRCreateCoordinateTransformation(&oSourceSRS, &oTargetSRS); if (poTransform == NULL) { cout<<"poTransform is null"<<endl; exit(1); } if (!poTransform->Transform(1, &longitude, &latitude, NULL)) { cout<<"transform failed"<<endl; exit(1); } //poTransform->Transform(1, &longitude, &latitude, NULL); double *inout = new double[2]; inout[0] = longitude; inout[1] = latitude; return inout;}int main(int argc, char *argv[]){ char *xCoordinate = argv[1]; char *yCoordinate = argv[2]; char *outShp = argv[3]; double x = atof(xCoordinate); double y = atof(yCoordinate); convertToShp(x, y, outShp); cout<<"success! file is saved to "<<outShp<<endl; double *transferedLongLat = transfer(116.246742, 40.022211); cout<<"转换后的投影坐标为:"<<transferedLongLat[0]<<","<<transferedLongLat[1]<<endl; getchar();}
程序运行结束后即在我们指定的目录下生成点状要素的shp文件。
关于坐标转换,可以参考:http://blog.csdn.net/jingss_3/article/details/8240328
0 0
- 使用gdal ogr创建shapefile文件(c++)
- 使用gdal的ogr创建shapefile文件(c++)
- C++、GDAL创建shapefile文件
- 用GDAL/OGR去读shapefile
- 用GDAL/OGR去读shapefile
- 使用GDAL/OGR包+python将CSV转成shapefile并投影
- C++、GDAL创建shapefile,并向矢量文件中添加网格
- 【GDAL/OGR】利用GDAL/OGR读取shp文件并转换为json文件(Java版)
- GDAL/OGR创建DXF文件中多图层的方法
- GDAL/OGR创建DXF文件中多图层的方法 .
- C#用GDAL/OGR库创建与写Shape文件
- GDAL/OGR创建DXF文件中多图层的方法 .
- android 平台下通过GDAL创建SHP(ShapeFile)文件至SD卡
- 使用GDAL/OGR读取点、线矢量文件
- GDAL/OGR
- GDAL-OGR对shp文件的操作
- 使用GDAL/OGR读取多边形数据
- 使用GDAL/OGR操作Postgresql数据库
- PostgreSql 学习笔记二 CentOS下postgres升级
- sql---建表 太多列
- JavaScript(7) - 栈和队列
- 类
- linux安装vmware-tools
- 使用gdal ogr创建shapefile文件(c++)
- 创建型:设计模式之原型模式(五)
- iOS扫描二维码条形码ZBar的简单使用
- [leetcode] 112. Path Sum 解题报告
- ButterKnife基本使用
- Java多线程和并发性知识点总结
- linux 安装CUnit-2.1-3
- Web开发中乱码问题的解决
- android view点击事件无效 OnClickListener