http://pan.baidu.com/s/1qWIDphU (工程文件在vs2008中编写)
1、使用到的技术
GDAL:读取矢量数据
GDI: 绘制矢量数据
2、详细解释
GDI绘图:
void CDisplayShpDialogDlg::initialCDC(void) { m_slider_r.SetRange(0,255,FALSE); //对slider范围的设定 m_slider_g.SetRange(0,255,FALSE); m_slider_b.SetRange(0,255,FALSE); m_pDC = m_picDraw.GetDC(); //获取图形控件的DC m_picDraw.GetClientRect(m_rectPicture); //获取图形控件的大小 }
GDAL数据读取:
void CDisplayShpDialogDlg::DrawShp() { //定义画笔的颜色 newPen.CreatePen(PS_SOLID,1,RGB(m_slider_r.GetPos(),m_slider_g.GetPos(),m_slider_b.GetPos())); //给CDC设置会画时的画笔 pOldPen = m_pDC->SelectObject(&newPen); //将CDC与画笔关联起来 CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO" ); //使GDAL支持中文 OGRRegisterAll(); //打开数据 GDALDataset *poDS ; //定义一个图形数据集 poDS = (GDALDataset *)GDALOpenEx(m_filePathName.GetBuffer(),GDAL_OF_VECTOR,NULL,NULL,NULL); //打开矢量数据并返回指针给数据集 if (poDS==NULL) { MessageBox("Open Failed"); exit(1); } OGRLayer *poLayer = poDS->GetLayer(0); //从数据集中获取图层 poLayer->GetExtent(envelope); //获取图层的坐标范围到envelop指向的内存中 poLayer->ResetReading(); OGRFeature *poFeature; //定义要素指针 while((poFeature = poLayer->GetNextFeature())!=NULL) //从图层中获取要素 { OGRGeometry *poGeometry=poFeature->GetGeometryRef(); //从要素中获取几何图形 if (poGeometry!=NULL) { switch (wkbFlatten(poGeometry->getGeometryType())) //判别几何图形的类型 {case wkbLineString: //如果几何图形的类型为线状执行下面程序 OGRLineString *poLine = (OGRLineString*)poGeometry; for(int i = 0;i<poLine->getNumPoints();i++) { double staX = poLine->getX(i); double staY = poLine->getY(i); TransformCoordinate(&staX,&staY); //坐标转换 if(i==0) { m_pDC->MoveTo(staX,staY); //使用CDC类进行绘图 } else { m_pDC->LineTo(staX,staY); } } OGRFeature::DestroyFeature( poFeature ); break; } } } m_pDC->SelectObject(pOldPen); newPen.DeleteObject(); }