• OGR 写点线面对象和单独的dbf文件


    //写点对象
    void  saveNodeShp(string path)
    {
     if (m_NodeTopologyvec.size() == 0)
     return;

     int nodenum = m_NodeTopologyvec.size();

     const char *pszDriverName = "ESRI Shapefile";
     OGRSFDriver *poDriver;

     OGRRegisterAll();

     poDriver = (OGRSFDriver *)OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName);
     if (poDriver == NULL)
     {
      printf("%s driver not available. ", pszDriverName);
      exit(1);
     }
     OGRDataSource *poDS;
     //poDS = poDriver->CreateDataSource("road.shp", NULL);

     string shapename = path + "\node.shp";
     poDS = poDriver->CreateDataSource(shapename.c_str(), NULL);

     if (poDS == NULL)
     {
      printf("Creation of output file failed. ");
      exit(1);
     }
     
     OGRLayer *poLayer;
     poDS->CreateLayer("node", NULL, wkbPoint, NULL);
     poLayer = NULL;
     poLayer = poDS->GetLayer(0);//shp文件只有一个图层;
     if (poLayer == NULL)
     {
      printf("Layer creation failed. ");
      exit(1);
     }

     OGRFieldDefn Field01("jdid", OFTInteger); Field01.SetWidth(32);
     OGRFieldDefn Field02("jdlxdm", OFTInteger); Field02.SetWidth(32);
     OGRFieldDefn Field03("x_coord", OFTReal); Field03.SetWidth(12); Field03.SetPrecision(6);
     OGRFieldDefn Field04("y_coord", OFTReal); Field04.SetWidth(12); Field04.SetPrecision(6);

     poLayer->CreateField(&Field01);
     poLayer->CreateField(&Field02);
     poLayer->CreateField(&Field03);
     poLayer->CreateField(&Field04);
     
     for (int i = 0;i < nodenum;i++)
     {
      NodeTopology tempJBNode = m_NodeTopologyvec[i];

      OGRFeature *poFeature;
      poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());//必须用CreateFeature来生成对象,用new生成对象出错

      poFeature->SetField("jdid"     , tempJBNode.m_nodeId);
      poFeature->SetField("jdlxdm"   , tempJBNode.m_nodeType);
      poFeature->SetField("x_coord"  , tempJBNode.m_xNodeCoord);
      poFeature->SetField("y_coord"  , tempJBNode.m_yNodeCoord);

      //先构建对象,再添加进来

      OGRPoint pt;
      double x = tempJBNode.m_xNodeCoord;
      double y = tempJBNode.m_yNodeCoord;
      pt.setX(x);
      pt.setY(y);
      poFeature->SetGeometry(&pt);
      
      if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
      {
       printf("Failed to create feature in shapefile. ");
       exit(1);
      }

      OGRFeature::DestroyFeature(poFeature);
     }

     OGRDataSource::DestroyDataSource(poDS);
    }

    //写线对象
    void saveRoadShp(string path)
    {
     if (m_Roadvec.size() == 0)
      return;
      
     int roadnum = m_Roadvec.size();
     
     const char *pszDriverName = "ESRI Shapefile";
     OGRSFDriver *poDriver;
     OGRRegisterAll();

     poDriver = (OGRSFDriver *)OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName);
     if (poDriver == NULL)
     {
      printf("%s driver not available. ", pszDriverName);
      exit(1);
     }
     OGRDataSource *poDS;
     //poDS = poDriver->CreateDataSource("road.shp", NULL);

     string shapename = path + "\road.shp";
     poDS = poDriver->CreateDataSource(shapename.c_str(), NULL);


     if (poDS == NULL)
     {
      printf("Creation of output file failed. ");
      exit(1);
     }
     OGRLayer *poLayer;
     poDS->CreateLayer("road", NULL, wkbLineString, NULL);
     poLayer = NULL;
     poLayer = poDS->GetLayer(0);//shp文件只有一个图层;
     if (poLayer == NULL)
     {
      printf("Layer creation failed. ");
      exit(1);
     }

     OGRFieldDefn Field01("ysbh", OFTInteger); Field01.SetWidth(32);
     OGRFieldDefn Field02("mc", OFTString); Field02.SetWidth(50);
     OGRFieldDefn Field03("kd", OFTReal); Field03.SetWidth(32); Field03.SetPrecision(6);
     
     poLayer->CreateField(&Field01);
     poLayer->CreateField(&Field02);
     poLayer->CreateField(&Field03);


     for (int i = 0;i < roadnum;i++)
     {
      JBRoad tempJBRoad = m_Roadvec[i];

      OGRFeature *poFeature;
      poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());//必须用CreateFeature来生成对象,用new生成对象出错

      poFeature->SetField("ysbh", tempJBRoad.m_ElementCode);
      poFeature->SetField("mc", tempJBRoad.m_RoadName.c_str());
      poFeature->SetField("kd", tempJBRoad.m_RoadWidth);

      OGRLineString line;

      for (int j = 0;j < tempJBRoad.m_vPoints.size();j++)
      {
       double x = tempJBRoad.m_vPoints[j].getX();
       double y = tempJBRoad.m_vPoints[j].getY();
       line.addPoint(x, y);
      }

      poFeature->SetGeometry(&line);

      if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
      {
       printf("Failed to create feature in shapefile. ");
       exit(1);
      }

      OGRFeature::DestroyFeature(poFeature);
     }

     OGRDataSource::DestroyDataSource(poDS);
    }

    //写面对象
    void  savecityShp(string path)
    {
     if (m_Cityvec.size() == 0)
     return;

     int citynum = m_Cityvec.size();

     const char *pszDriverName = "ESRI Shapefile";
     OGRSFDriver *poDriver;

     OGRRegisterAll();

     poDriver = (OGRSFDriver *)OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName);
     if (poDriver == NULL)
     {
      printf("%s driver not available. ", pszDriverName);
      exit(1);
     }
     OGRDataSource *poDS;
     //poDS = poDriver->CreateDataSource("road.shp", NULL);

     string shapename = path + "\city.shp";
     poDS = poDriver->CreateDataSource(shapename.c_str(), NULL);

     if (poDS == NULL)
     {
      printf("Creation of output file failed. ");
      exit(1);
     }
     
     OGRLayer *poLayer;
     poDS->CreateLayer("city", NULL, wkbPolygon, NULL);
     poLayer = NULL;
     poLayer = poDS->GetLayer(0);//shp文件只有一个图层;
     if (poLayer == NULL)
     {
      printf("Layer creation failed. ");
      exit(1);
     }

     OGRFieldDefn Field01("id", OFTInteger); Field01.SetWidth(32);
     OGRFieldDefn Field02("dm", OFTInteger); Field02.SetWidth(32);
     OGRFieldDefn Field03("area1", OFTReal); Field03.SetWidth(12); Field03.SetPrecision(6);
     OGRFieldDefn Field04("area2", OFTReal); Field04.SetWidth(12); Field04.SetPrecision(6);

     poLayer->CreateField(&Field01);
     poLayer->CreateField(&Field02);
     poLayer->CreateField(&Field03);
     poLayer->CreateField(&Field04);
     
     for (int i = 0;i < citynum;i++)
     {
      Cityclass tempCity = m_Cityvec[i];

      OGRFeature *poFeature;
      poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());//必须用CreateFeature来生成对象,用new生成对象出错

      poFeature->SetField("id"     , tempCity.m_nodeId);
      poFeature->SetField("dm"   , tempCity.m_code);
      poFeature->SetField("area1"  , tempCity.area1);
      poFeature->SetField("area2"  , tempCity.area2);

      //先构建对象,再添加进来

      OGRPolygon area;
      OGRLineaRing linering;

      for(int j = 0;j < tempCity.m_vPoints.size();j++)
      {
       double x = tempCity.m_vPoints[j].getX();
       double y = tempCity.m_vPoints[j].getY();
       linering.addPoint(x,y);
      }

      area.addRing(&linering);
      poFeature->SetGeometry(&area);
      
      if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
      {
       printf("Failed to create feature in shapefile. ");
       exit(1);
      }

      OGRFeature::DestroyFeature(poFeature);
     }

     OGRDataSource::DestroyDataSource(poDS);
    }


    //只写dbf文件
    void  saveGroupNodeShp(string path)
    {
     if (m_GroupNodevec.size() == 0)
     return;

     int Gnodenum = m_GroupNodevec.size();

     const char *pszDriverName = "ESRI Shapefile";
     OGRSFDriver *poDriver;

     OGRRegisterAll();

     poDriver = (OGRSFDriver *)OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName);
     if (poDriver == NULL)
     {
      printf("%s driver not available. ", pszDriverName);
      exit(1);
     }
     OGRDataSource *poDS;
     //poDS = poDriver->CreateDataSource("GroupNode.shp", NULL);

     string shapename = path + "\GroupNode.shp";
     poDS = poDriver->CreateDataSource(shapename.c_str(), NULL);

     if (poDS == NULL)
     {
      printf("Creation of output file failed. ");
      exit(1);
     }
     
     OGRLayer *poLayer;
     poDS->CreateLayer("GroupNode", NULL, wkbNone, NULL);
     poLayer = NULL;
     poLayer = poDS->GetLayer(0);//shp文件只有一个图层;
     if (poLayer == NULL)
     {
      printf("Layer creation failed. ");
      exit(1);
     }

     OGRFieldDefn Field01("id", OFTInteger); Field01.SetWidth(32);
     OGRFieldDefn Field02("dm", OFTInteger); Field02.SetWidth(32);
     OGRFieldDefn Field03("area1", OFTReal); Field03.SetWidth(12); Field03.SetPrecision(6);
     OGRFieldDefn Field04("area2", OFTReal); Field04.SetWidth(12); Field04.SetPrecision(6);

     poLayer->CreateField(&Field01);
     poLayer->CreateField(&Field02);
     poLayer->CreateField(&Field03);
     poLayer->CreateField(&Field04);
     
     for (int i = 0;i < Gnodenum;i++)
     {
      NodeTopology tempNode = m_GroupNodevec[i];

      OGRFeature *poFeature;
      poFeature = OGRFeature::CreateFeature(poLayer->GetLayerDefn());//必须用CreateFeature来生成对象,用new生成对象出错

      poFeature->SetField("id"     , tempNode.m_nodeId);
      poFeature->SetField("dm"   , tempNode.m_code);
      poFeature->SetField("area1"  , tempNode.area1);
      poFeature->SetField("area2"  , tempNode.area2);

      //先构建对象,再添加进来
      poFeature->SetGeometry(NULL);
      
      if (poLayer->CreateFeature(poFeature) != OGRERR_NONE)
      {
       printf("Failed to create feature in shapefile. ");
       exit(1);
      }

      OGRFeature::DestroyFeature(poFeature);
     }

     OGRDataSource::DestroyDataSource(poDS);
    }

  • 相关阅读:
    java中this()、super()的用法和区别
    线段树基础操作
    普通平衡树的基础操作
    简单dp问题汇总
    欧拉线性筛法打表素数
    单调队列与dp的关系
    最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
    常用chrome扩展程序
    各种数据类型的字节数
    排查mysql的奇怪问题
  • 原文地址:https://www.cnblogs.com/roea1/p/13910856.html
Copyright © 2020-2023  润新知