收藏 分销(赏)

arcview教程.doc

上传人:xrp****65 文档编号:9435723 上传时间:2025-03-26 格式:DOC 页数:37 大小:1.11MB 下载积分:10 金币
下载 相关 举报
arcview教程.doc_第1页
第1页 / 共37页
arcview教程.doc_第2页
第2页 / 共37页


点击查看更多>>
资源描述
实习二、地图投影及其变换 一、 目的 1. 掌握地图投影变换的基本原理与方法 2. 熟悉ArcView、ARCINFO中投影的应用及投影变换的方法、技术 3. 了解地图投影及其变换在实际中的应用 二、 实验准备 1. 软件准备:ARCINFO, ARCVIEW,VC++ 2. 资料准备: 三、 实验内容及步骤、方法 对于地面上的任何事物来讲,其空间位置是非常重要的信息。地理信息数据中一个重要部分就是地物的空间位置,包括空间相对位置和绝对位置。空间的相对位置空间拓扑关系来描述,而空间绝对位置则用空间某一坐标系中的坐标来表示,即(x,y,z)或是(λ,φ,r)。我们知道,地球是一个近似于椭球的星体。在地理信息系统中,我们通常把地球看作一个旋转椭球体,而研究球面或椭球面上的空间位置往往比较复杂,于是我们采用一定的数学法则将地球表面的事物的空间位置表示到平面上,这就是所谓的投影。 实际上,投影这门学科原本是地图学的一个重要的分支。对地理信息系统来讲,它也是地理信息系统的数学基础之一。常用的投影有方位、圆锥、圆柱、高斯-克吕格投影等。下面以Arc/Info和ArcView为例,讲述一下投影在实际工作中的应用。 1)Arc/Info中投影的应用 以下内容适用于Arc/Info7.15及Arc/Info8.1 workstation, a. 查看坐标信息 启动Arc/Info,使用Describe命令来查看图层的投影信息,命令使用方法如下: Usage: DESCRIBE <geo_dataset> ,其中<geo_dataset>可以是coverage, grid, tin,或image 例:Arc: w d:\workspace //设定工作路径 Arc: describe states //查看图层states的基本情况 如得到下图的结果(图中红线框中的所示),则表明该图没有定义任何坐标系统。 b. 定义坐标信息: 上图表明图层states没有坐标信息,可以使用PROJECTDEFINE命令来定义投影信息。命令用法如下: Usage:PROJECTDEFINE <COVER | GRID | FILE | TIN> <target> 例:Arc: projectdefine cover states Define Projection Project: projection geographic //定义投影坐标为地理坐标系 Project: units dd //坐标单位为度小数 Project: datum wgs84 //定义坐标基准为wgs84基准 Project: spheroid clarke1866 //定义椭球为clarke1866椭球 Project: parameters //定义投影参数(因为地理坐标系没有其他参数,所以空缺) 然后用上述的DESCRIBE命令查看坐标信息。 得到如下图结果,注意红框所示部分。 c. 投影坐标变换 地理坐标系是比较常用的投影坐标系,但是它以经纬度建立坐标系统,以度为单位,有时不适用于实际工作。在实际工作中我们常需要将数据转换到一些指定的投影坐标系。在Arc/Info中用Project命令来实现投影变换。命令用法如下: Usage:PROJECT <COVER | FILE> <input> <output> {projection_file} Usage:PROJECT <GRID > <input> <output> {projection_file} {NEAREST | BILINEAR | CUBIC} {out_cellsize} {x_register} {y_register} 例:Arc: project cover states states1 //将图层states投影变换至图层states1 //这表明输入图层即states已有投影信息 ************************************************** * The INPUT projection has been defined. * ************************************************** Use OUTPUT to define the output projection and END to finish. Project: output //定义输出图层投影信息 Project: projection ALBERS //定义输出图层为等面积圆锥投影 Project: units meters //坐标单位为米 Project: datum wgs84 //定义坐标基准为wgs84基准 Project: spheroid clarke1866 //定义椭球为clarke1866椭球 Project: parameters //定义等面积圆锥投影参数 1st standard parallel [ 0 0 0.000 ]: 32 30 0 2nd standard parallel [ 0 0 0.000 ]: 42 30 0 central meridian [ 0 0 0.000 ]: -100 0 0 latitude of projection's origin [ 0 0 0.000 ]: 20 0 0 false easting (meters) [ 0.00000 ]: 0.0 false northing (meters) [ 0.00000 ]: 0.0 Project: end //命令结束 接下来可以用DESCRIBE命令查看图层states1的坐标信息。也可以进入ArcEdit查看一下转换结果。下面的图是转换前后两个图层的结果。 转换前图层states 转换后的图层states1 以上就是在Arc/Info中投影的简单应用。关于上面用到的命令的详细用法、相关信息即主要注意事项,参见Arc/Info帮助文件。 2)ArcView中投影的应用 以下内容适用于ArcView3.0及以上版本 a. 运行ArcView,打开一个视图(view),并向视图中添加数据。(数据可以从ArcView的安装目录如D:\ESRI\ESRIDATA中找到,比如我们打开一幅美国地图)。 b. 从View菜单选择Properties菜单项 c. 在出现的对话框中看是否已经为视图指定了投影(下图中红框标记的地方,如果有投影,则会出现投影名称,下图还没有设置投影)。 如没有设置投影,注意要将MapUnits设置为decimal degrees(十进制度小数)。如已设置投影,就不要将MapUnits设置为decimal degrees。 d. 单击上图中的Projection按钮,将出现如下图对话框。 图中上部有两个单选按钮,默认选择是Standard。这是ArcView预设的一些标准投影。可以在Categeory下拉框中选择投影区域或投影面,在Type下拉框中选择相应的投影类型。例如:在Categeoy中选择Projections of the Unites States(美国区域的投影),而在Type中选择Lambert Conformal Conic(North America),(适于北美地区的兰伯特等角圆锥投影),就可以得到如下图的结果。 我们也可以选择自己定义投影参数,这是我们要选择Custom单选按钮,对话框就变成如下图所示。此时我们就可以在projection下拉框中指定投影类型,在Spheroid下拉框中指定椭球,并根据所选的投影修改投影参数。需要指出的是,这样的自定义投影只是在ArcView提供的投影类型中修改相应的参数,而并不是定义新的投影方式。尽管ArcView提供了许多投影方式和椭球,但并不是所有的投影类型和椭球都有,像我国常用的高斯-克吕格投影及80坐标系所使用的IAG-75椭球就没有。 e. 上述的做法只是为视图(View)指定了投影,而数据并没有发生改变。也就是说数据是在被添加到视图时才被投影,显示在屏幕上,当你关掉当前视图,重新建立一个视图,并将原来的数据添加进来时,你会发现它们并没有被投影,也就是说刚才的操作对数据并没有影响。如果你要将数据真正进行投影变换,就必须将数据重新存储,使新数据保有投影变换后的投影信息。这时可以这样做: a) 选中要存储的数据层(单击窗口左边数据目录中的该层,使其处于激活状态); b) 单击Theme菜单,选取Convert to shapeFile菜单项。将数据重新保存。 以上就是在Arc/Info和ArcView中投影的简单应用。对于各种不同的地理信息系统软件,上述的过程略有差异,但大体上基本上是相同的。对于投影而言,最重要的并不是对各种软件软件的熟练掌握,而是如何在实际应用中将投影的原理加以灵活应用。 数据格式转换部分 在地理信息系统中,数据格式是数据交换和共享的重要因素。数据格式的转换包括: 1) 不同数据文件格式之间的转换。由于各地理信息系统的开发公司在研制自己的地理信息系统软件时,都定义了自己的一套文件存储方式,而用户在实际应用中几乎不可能在一套软件中完成所有的应用,这就产生了数据格是转换的问题。在地理信息系统发展的早期,数据文件格式是一种商业机密,进行数据文件格时的转换几乎是不可能的。但随着信息时代发展,越来越多的软件厂商已经开始展开合作,互相支持对方的数据格式,或是公布自己的数据格式,以方便用户的应用 2) 不同数据结构之间的转换,如矢量和栅格数据之间的转换。由于矢量数据结构和栅格数据结构在应用中各有自己的优势和不足,而且,这两种数据结构决定了数据文件存贮格式的不同,因此,要将二者结合起来使用时,就会遇到数据各式转换的问题。常见的数据格式有: a. 矢量数据格式:Arc/Info的Coverage,e00文件,ArcView的Shapefile,Erdas的aoi文件,MapInfo的mif文件,AutoCAD的dxf文件等; b. 栅格数据格式:Arc/Info的Grid, Erdas的img文件,geotiff文件,bmp文件,jpeg文件等 下面我们就以一些实际应用来讲一下数据格式转换的问题。 1. 在实际应用软件中的数据格式转换。 a.Arc/Info中的数据格式转换: 在Arc/Info中数据格式的转换主要依靠命令来完成。常用的命令主要有: ARCSHAPE 将Arc/Info的coverage数据转换为ArcView的Shapefile格式。 SHAPEARC 将ArcView的Shapefile格式转换为Arc/Info的coverage数据。 EXPORT 将Arc/Info的coverage数据转换为Arc/Info文件交换格式e00格式。 IMPORT 将Arc/Info文件交换格式e00格式转换为Arc/Info的coverage数据。 GRIDSHAPE 将Arc/Info的Grid数据转换为ArcView的Shapefile格式。 SHAPEGRID 将ArcView的Shapefile格式转换为Arc/Info的Grid数据。 ARCDXF 将Arc/Info的coverage数据转换为AutoCAD的DXF格式。 DXFARC 将AutoCAD的DXF格式转换为Arc/Info的coverage数据。 CONVERTIMAGE 将一种Arc/Info支持的影像格式转换为另一种影像格式。 GRIDIMAGE 将Arc/Info的Grid数据转换为某种Arc/Info支持的影像格式。 IMAGEGRID 将某种Arc/Info支持的影像格式转换为Arc/Info的Grid数据。 ASCIIGRID 将一个ASCII码文件转换为Arc/Info的Grid数据。 GRIDASCII 将Arc/Info的Grid数据转换为一个ASCII码文件。 例:Arc: export cover states a //将一个图层states转换为a.e00数据。 Exporting states into interchange file a.e00... Arc: 在Arc/Info中还有很多与数据结构转换相关的命令,这里就不一一罗列了。在实际工作中,可以参看一下Arc/Info的帮助文件。 b.ArcView中的数据格式转换: 在ArcView中数据格式转换是依靠ArcView提供的一些工具软件和菜单命令来完成的。主要有以下一些: 1) 在开始菜单中选取“程序/ESRI/ArcView Gis 3.2a”,就会看到如下图红框所示的一些工具。 其中Import和Import71是将e00数据转换为coverage数据的。MIF to Shape是将Mapinfo的mif文件转换为Shpefile的。SDTS Point to Arc和SDTS Raster to Grid是将SDTS(空间数据交换标准)的数据转换为Arc/Info的数据的。Shape DXF Converter是将Shapefile转换为AutoCAD的dxf文件的。下图是Import71的使用界面。 2) 打开ArcView,有一些菜单命令可以用来做数据格式转换。 图中红框所选中的五个菜单项可以用来做数据格式的转换。即将ArcView打开的数据转换为Shapefile,3D Shapefile,将Grid数据转换为Tin数据,将其他的数据转换为Grid,或是重新存储数据集。需要指出的是上述菜单需要在File菜单中选取Extensions子菜单,并在弹出的对话框中选中3D analysis和spatial analysis模块。 在Arcview中还有一些其它的菜单功能可以作数据格式的转换。如下图红框所示: 其中Import Data Source是将外部数据文件导入到ArcView中,而Export Data Sourec则相反,是将ArcView的数据导出到外部数据文件中。具体能够导入和导出的外部数据格式如下图所示: 以上是简要的介绍了数据格式转换在Arc/info和ArcView中的应用,其他的GIS软件基本上都提供有类似的数据格式转换的功能。掌握了上述两种软件的数据格式转换的功能,其它软件的操作是大同小异的,读者在实际操作中会慢慢体会到。 2. 编制程序进行数据格式转换 编制程序进行数据格式转换主要是由于用户的特殊要求而产生的。由于有时软件自身所有的数据格式转换功能不能满足用户要求,用户就不得不自己进行数据格式转换程序的开发。 自己编制程序进行数据格式的转换,问题集中在两个方面: a. 如何从原有的数据文件中读出数据; b. 如何将原有的数据写进新的数据格式中。 要完成这些内容,关键就是要了解新旧数据文件的格式。了解了新旧文件的格式,既可以顺利地用程序语言来编制程序。以下示例是将下面的原始数据写入Mapinfo的Mif和Mid数据文件中。 原始数据文件:test.sx文件(属性文件)和test.zb文件(坐标文件):(自己定义的文件格式) D:\TEST\Ttest.sx P 278 5997 70 21311 11568 21284 11664 60 1 653 1 100036.00 32 5998 70 19534 11435 19550 11533 60 1 653 1 100062.00 33 5999 70 21004 7035 20919 6984 60 1 653 1 100762.00 34 … … … … … … … … … … … … L 2418 1508 0 0 0 0 70 224 0 0 32 1509 0 0 0 0 70 224 0 1 100023.00 33 1510 0 0 0 0 70 224 0 0 34 … … … … … … … … … … … … 3923 0 0 0 0 70 419 0 1 101323.00 0 3924 0 0 0 0 70 419 0 1 103173.00 0 3925 0 0 0 0 70 419 0 1 103513.00 0 A 0 D:\TEST\Ttest.zb 1508 14 16960 3794 17030 3787 17052 3786 17096 3797 17116 3812 17145 3844 17173 3861 17204 3877 17238 3894 17266 3910 17290 3937 17302 3963 17311 3989 17310 4021 1509 15 17302 4023 17315 4071 17325 4103 17337 4116 17373 4134 17449 4164 17467 4172 17494 4173 17548 4151 17597 4138 17645 4124 17682 4115 17710 4108 17721 4106 17817 4109 … … … … … … … … … … … … 3924 6 10147 11157 10180 11125 10206 11094 10227 11058 10242 11023 10262 10988 3925 6 12815 8312 12886 8293 12938 8252 12978 8210 12992 8181 13000 8156 Mif和Mid文件格式参见MapInfo公司的网站。 下面是用Visual C++6.0编写的将原始的test.sx文件和test.zb文件写入Mif和Mid的程序源代码的主要部分。 // CFileTestDoc.cpp : implementation of the CCFileTestDoc class // #include "stdafx.h" #include "CFileTest.h" #include "CFileTestDoc.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCFileTestDoc IMPLEMENT_DYNCREATE(CCFileTestDoc, CDocument) BEGIN_MESSAGE_MAP(CCFileTestDoc, CDocument) //{{AFX_MSG_MAP(CCFileTestDoc) ON_COMMAND(ID_OPEN_TST, OnOpenTst) ON_COMMAND(ID_WRITE_TST, OnWriteTst) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCFileTestDoc construction/destruction CCFileTestDoc::CCFileTestDoc() { // TODO: add one-time construction code here nl=0; na=0; pNum=0;lNum=0;aNum=0; m_pPointData=NULL; m_pLineData=NULL; m_pAreaData=NULL; } CCFileTestDoc::~CCFileTestDoc() { if(m_pPointData!=NULL) delete m_pPointData; if(m_pLineData!=NULL) { for(int i=0;i<lNum;i++) { for(int j=0;j<m_pLineData[i].nLine;j++) delete m_pLineData[i].p; } delete m_pLineData; } if(m_pAreaData!=NULL) delete m_pAreaData; } BOOL CCFileTestDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: add reinitialization code here // (SDI documents will reuse this document) return TRUE; } ///////////////////////////////////////////////////////////////////////////// // CCFileTestDoc serialization void CCFileTestDoc::Serialize(CArchive& ar) { if (ar.IsStoring()) { // TODO: add storing code here } else { // TODO: add loading code here } } ///////////////////////////////////////////////////////////////////////////// // CCFileTestDoc diagnostics #ifdef _DEBUG void CCFileTestDoc::AssertValid() const { CDocument::AssertValid(); } void CCFileTestDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CCFileTestDoc commands void CCFileTestDoc::OnOpenTst() { /////////////////////////////////////////////////////////// char szbuf[]="二进制文件(*.TST)|*.TST||"; CFileDialog FileDlg(TRUE,"TST","Test",OFN_HIDEREADONLY,szbuf); // if(FileDlg.DoModal()==IDOK) m_strFilePathName=FileDlg.GetPathName(); else return; // m_File.Open(m_strFilePathName,CFile::modeRead|CFile::typeBinary); char strBuf[20]; m_File.Read(&strBuf,20); m_strFilePathName=strBuf; char Code; int x,y; // while(m_File.GetPosition()<m_File.GetLength()) { //Read Point m_File.Read(&Code,1); if(Code=='p') { m_File.Read(&x,sizeof(int)); m_File.Read(&y,sizeof(int)); pp.x=x; pp.y=y; } //Read Line //m_File.Read(&Code,1); if(Code=='l') { m_File.Read(&nl,sizeof(int)); for(int i=0;i<nl;i++) { m_File.Read(&x,sizeof(int)); m_File.Read(&y,sizeof(int)); pl[i].x=x; pl[i].y=y; } } //Read Area //m_File.Read(&Code,1); if(Code=='a') { m_File.Read(&na,sizeof(int)); for(int i=0;i<na;i++) { m_File.Read(&x,sizeof(int)); m_File.Read(&y,sizeof(int)); pa[i].x=x; pa[i].y=y; } } } m_File.Close(); /////////////////////////////////////////////////////////// } //Write typeBinary File void CCFileTestDoc::OnWriteTst() { /////////////////////////////////////////////////////////// char szbuf[]="二进制文件(*.TST)|*.TST||"; CFileDialog FileDlg(FALSE,"TST","Test",OFN_HIDEREADONLY,szbuf); if(FileDlg.DoModal()==IDOK) m_strFilePathName=FileDlg.GetPathName(); else return; m_File.Open(m_strFilePathName,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); char strBuf[20]; strcpy(strBuf,m_strFilePathName); m_File.Write(&strBuf,20); char Code; //Write Point Code='p'; int x=50,y=50; m_File.Write(&Code,1); m_File.Write(&x,sizeof(int)); m_File.Write(&y,sizeof(int)); //Write Line Code='l'; int n=5,xl[5], yl[5]; xl[0]=55; yl[0]=60; xl[1]=55; yl[1]=70; xl[2]=65; yl[2]=65; xl[3]=100;yl[3]=90; xl[4]=200;yl[4]=80; m_File.Write(&Code,1); m_File.Write(&n,sizeof(int)); for(int i=0;i<n;i++) { m_File.Write(&xl[i],sizeof(int)); m_File.Write(&yl[i],sizeof(int)); } //Write Area Code='a'; int m=3,xa[3], ya[3]; xa[0]=100; ya[0]=110; xa[1]=50; ya[1]=300; xa[2]=150; ya[2]=300; m_File.Write(&Code,1); m_File.Write(&m,sizeof(int)); for(int j=0;j<m;j++) { m_File.Write(&xa[j],sizeof(int)); m_File.Write(&ya[j],sizeof(int)); } m_File.Close(); /////////////////////////////////////////////////////////// } // CFileTestView.cpp : implementation of the CCFileTestView class // #include "stdafx.h" #include "CFileTest.h" #include "CFileTestDoc.h" #include "CFileTestView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CCFileTestView IMPLEMENT_DYNCREATE(CCFileTestView, CView) BEGIN_MESSAGE_MAP(CCFileTestView, CView) //{{AFX_MSG_MAP(CCFileTestView) ON_COMMAND(ID_FORMAT_MIF, OnFormatMif) ON_COMMAND(ID_WRITE_TXT, OnWriteTxt) ON_COMMAND(ID_OPEN_CHA_TXT, OnOpenChaTxt) ON_COMMAND(ID_DRAW_MAP, OnDrawMap) ON_COMMAND(ID_ZOOM_IN, OnZoomIn) ON_COMMAND(ID_ZOOM_OUT, OnZoomOut) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CCFileTestView construction/destruction CCFileTestView::CCFileTestView() { // TODO: add construction code here InOne=TRUE; m_isDraw=FALSE; m_sss=30000.0; } CCFileTestView::~CCFileTestView() { } BOOL CCFileTestView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CCFileTestView drawing void CCFileTestView::OnDraw(CDC* pDC) { CCFileTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here if(InOne) { InOne=FALSE; CRect rect; GetClientRect(&r
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服