ArcMap切图原理Word文档下载推荐.docx
《ArcMap切图原理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《ArcMap切图原理Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
地图切图参数
ArcGISServer发布切片地图服务流程:
准备地图文档发布地图服务设置缓存参数开始切图切图结束服务发布成功。
使用ArcGISServer发布切片地图服务时,需要确定以下参数:
比例尺级别、切片原点、图像高度和宽度、DPI。
下图所示为ArcGIS10.0中切片地图服务的一个缓存参数设置。
四、切片原理
ESRI使用的是二叉树索引法,将平面地图从地图左上角(切图原点)到地图右下角分成若干行列,指定比例尺下以行列号为切图图片的索引。
我们需要使用到的切图参数:
切图原点、图片宽高、地图范围、地图比例尺及DPI。
这里DPI的左右是将比例尺换算成像素比实际距离,即为了确定每张图片实际地理范围。
废话不多说,直接上实现代码。
五、代码实现
1、准备工作:
使用arcmap准备地图文档,发布地图服务,配置切图方案,不需切图。
(这一步也可代码实现,这里略过)
2、地图服务类
地图服务类提供对地图服务的访问,获取切图参数及地图文档的位置(地图文档MXD在ArcGISServer10.0中可获取,后面版本更新不可获取)
连接GISServer方法:
GISServerConnectionClassgisconnection=newGISServerConnectionClass();
gisconnection.Connect(host);
获取MapServer服务名方法:
List<
string>
names=newList<
();
ESRI.ArcGIS.Server.IServerObjectManagersom=gisconnection.ServerObjectManager;
IEnumServerObjectConfigurationInfoinfos=som.GetConfigurationInfos();
infos.Reset();
IServerObjectConfigurationInfoinfo=infos.Next();
while(info!
=null)
{
if(info.TypeName.Equals("
MapServer"
))
names.Add(info.Name);
}
info=infos.Next();
获取切片信息方法:
IServerContextsc=gisconnection.ServerObjectManager.CreateServerContext(mapServerName,"
);
IMapServerpMapServer=sc.ServerObjectasIMapServer;
ITiledMapServertm=pMapServerasITiledMapServer;
ITileCacheInfoinfo=tm.GetTileCacheInfo(pMapServer.DefaultMapName);
我们从ITileCacheInfo中可以获取到信息包括dpi、lod、切图原点及切图像素宽和高
3、
切片信息类
从ITileCacheInfo对象中提取我们需要的信息,这里创建了一个TileCacheInfoModel类
publicclassTileCacheInfoModel
#region变À
?
量¢
int_dpi=96;
int[]_levels;
double[]_resolutions;
double[]_scale;
double_originX=0;
double_originY=0;
int_tileCols=256;
int_tileRows=256;
#endregion
#region属º
性?
publicintDpi
get{return_dpi;
set{_dpi=value;
publicint[]Levels
get{return_levels;
set{_levels=value;
publicdouble[]Resolutions
get{return_resolutions;
set{_resolutions=value;
publicdouble[]Scale
get{return_scale;
set{_scale=value;
publicdoubleOriginX
get{return_originX;
set{_originX=value;
publicdoubleOriginY
get{return_originY;
set{_originY=value;
publicintTileCols
get{return_tileCols;
set{_tileCols=value;
publicintTileRows
get{return_tileRows;
set{_tileRows=value;
publicTileCacheInfoModel(ITileCacheInfoinfo)
_dpi=info.Dpi;
_levels=newint[info.LODInfos.Count];
_resolutions=newdouble[info.LODInfos.Count];
_scale=newdouble[info.LODInfos.Count];
for(inti=0;
i<
info.LODInfos.Count;
i++)
_levels[i]=info.LODInfos.get_Element(i).LevelID;
_resolutions[i]=info.LODInfos.get_Element(i).Resolution;
_scale[i]=info.LODInfos.get_Element(i).Scale;
_originX=info.Origin.X;
_originY=info.Origin.Y;
_tileCols=info.TileCols;
_tileRows=info.TileRows;
4、切片计算类
通过切片信息,我们能够计算需要切的地图中某比例尺下任意一个点所在的切片行列索引号,并能获取切片行列索引所对应的地图显示范围。
publicclassTileCacheHelper
privateTileCacheInfoModel_model;
publicTileCacheHelper(TileCacheInfoModelm)
_model=m;
publicintGetCol(doublex,intscaleindex)
return(int)((x-_model.OriginX)/(_model.Resolutions[scaleindex]*_model.TileCols));
publicintGetCol(doublex,doublescale)
inti;
for(i=0;
_model.Scale.Length;
if(scale==_model.Scale[i])
break;
return(int)((x-_model.OriginX)/(_model.Resolutions[i]*_model.TileCols));
publicintGetRow(doubley,intscaleindex)
return(int)((_model.OriginY-y)/(_model.Resolutions[scaleindex]*_model.TileRows));
publicintGetRow(doubley,doublescale)
return(int)((_model.OriginY-y)/(_model.Resolutions[i]*_model.TileRows))-1;
publicIEnvelopegetExtent(intscaleindex,introw,intcol)
doublexmin=this._model.OriginX+col*_model.Resolutions[scaleindex]*this._model.TileCols;
doublexmax=this._model.OriginX+(col+1)*_model.Resolutions[scaleindex]*this._model.TileCols;
doubleymin=this._model.OriginY-(row+1)*_model.Resolutions[scaleindex]*this._model.TileRows;
doubleymax=this._model.OriginY-row*_model.Resolutions[scaleindex]*this._model.TileRows;
IEnvelopeextent=newEnvelopeClass();
extent.XMin=xmin;
extent.XMax=xmax;
extent.YMin=ymin;
extent.YMax=ymax;
//xmin,ymin,xmax,ymax,this._tileInfo.spatialReference);
returnextent;
5、切图工具类
根据比例尺级别循环
foreach(intscaleindexinscaleindexs)
根据坐标范围获取行列索引范围
TileCacheHelpertcTool;
intr0=tcTool.GetRow(_ymax,scaleindex);
intc0=tcTool.GetCol(_xmin,scaleindex);
intrN=tcTool.GetRow(_ymin,scaleindex);
intcN=tcTool.