附上gdal书籍的源码及数据:GDAL书籍源码,GDAL书籍数据
void CPowerTower_SlopeDoc::writevectorpoint(std::string PathName, CString type_name, osg::Vec3dArray * m_pts)
{
ref_ptr<orsISpatialReference> utm = getSRService()->CreateSpatialReference();
utm->importFromEPSG(32649);
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
CPLSetConfigOption("SHAPE_ENCODING", "");
GDALAllRegister();
const char *pszDriverName = _T("ESRI Shapefile");
GDALDriver *poDriver;
poDriver = GetGDALDriverManager()->GetDriverByName(pszDriverName);
if (poDriver == NULL)
{
AfxMessageBox(_T("驱动器不可用"));
return;
}
OGRSpatialReference InputOGRS;
InputOGRS.SetWellKnownGeogCS("WGS84");
GDALDataset *poDS = poDriver->Create(PathName.c_str(), 0, 0, 0, GDT_Unknown, NULL);
OGRLayer* poLayer = poDS->CreateLayer(type_name, &InputOGRS, wkbPoint25D, NULL);
if (poLayer == NULL)
{
AfxMessageBox(_T("创建输出文件失败"));
return;
}
//属性表创建
OGRFieldDefn oFieldId("ID", OFTInteger);
OGRFieldDefn oFieldx("x", OFTReal);
OGRFieldDefn oFieldy("y", OFTReal);
OGRFieldDefn oFieldz("z", OFTReal);
oFieldId.SetWidth(5);
oFieldx.SetWidth(32);
oFieldy.SetWidth(32);
oFieldz.SetWidth(32);
poLayer->CreateField(&oFieldId);
poLayer->CreateField(&oFieldx);
poLayer->CreateField(&oFieldy);
poLayer->CreateField(&oFieldz);
CPowerTower_SlopeView *pView;
POSITION pos = GetFirstViewPosition();
pView = (CPowerTower_SlopeView *)GetNextView(pos);
OGRPoint point;
OGRPolygon poly;
OGRLinearRing ring;
int nSize = m_pts->size();
for (int i = 0; i < nSize; i++)
{
orsPOINT3D pt((*m_pts)[i].x(), (*m_pts)[i].y(), (*m_pts)[i].z());
orsPOINT3D gc;
utm->ToGeocentric(pt, &gc);
point.setX(gc.X);
point.setY(gc.Y);
point.setZ(gc.Z);
//属性表赋值
OGRFeature *poFeature;
poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());
poFeature->SetField("ID", i);
poFeature->SetField("x", gc.X);
poFeature->SetField("y", gc.Y);
poFeature->SetField("z", gc.Z);
poFeature->SetGeometry(&point);
if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
{
printf("Failed to create feature in shapefile.\n");
return;
}
OGRFeature::DestroyFeature(poFeature);
}
GDALClose(poDS);
}