ArcGIS影像服务研究之影像下载

来源:互联网 发布:php黑客技术 编辑:程序博客网 时间:2024/04/29 02:21

影像服务(Image Service)是ArcGIS Server中非常重要的一种服务类型,通过影像服务能够将各类影像数据、栅格数据发布为服务,客户端可以通过SOAPREST接口进行访问,从而在更大范围内实现影像数据的共享访问和在线处理等。

本文主要探讨ArcGIS Server 10.0新增的影像下载功能。

1  准备服务

ArcGIS Server 10.0中,影像服务可以提供下载功能(要求数据源是镶嵌数据集),在服务能力中启用下载功能即可,如下图所示。

启用影像服务的Web下载功能

1  影像下载参数说明

影像下载功能的参数可以在REST SDK中查询,如下所述:

f:返回值(响应)的格式,可选值为htmljson,其中html是默认响应格式。

rasterIds:由逗号分隔的raster IDs,指定待下载的栅格数据,例如:rasterIds=37,462

geometry用于裁剪栅格数据的图形。如果指定了,则选择的栅格数据将在服务器端被裁剪。默认情况下认为该geometry的空间参考与影像服务的空间参考一致。

JSON语法结构:geometryType=<geometryType>&geometry={geometry}

Envelope简单语法:geometryType=esriGeometryEnvelope&geometry=

<xmin>,<ymin>,<xmax>,<ymax>

示例:

geometryType=esriGeometryEnvelope&geometry={xmin: -104,ymin: 35.6, xmax: -94.32, ymax: 41}

geometryType=esriGeometryEnvelope&geometry=-104,35.6,-94.32,41

geometryType用于裁剪的图形类型,可选值为envelope polygon默认值是envelope

format返回的栅格数据格式,如果不指定,将返回数据本身的格式。本参数仅当裁剪时有效。可选的格式包括:TIFF, Imagine Image, JPEG, BIL, BSQ, BIP, ENVI, JP2, GIF, BMP,PNG。例如:format=TIFF

Json格式返回值语法:

{
"rasterFiles" :
 [ //the list of files that make up the rasters to be downloaded
  { //info pertaining to a single file
    //use this id to download the file using the Raster File resource
    "id" : "<fileId1>",
    "size" : <fileSize1>,
    //an array of IDs of rasters that include this file
    "rasterIds" : [ <rasterId11>, <rasterId12> ]
  },
  {
    "id" : "<fileId2>",
    "size" : <fileSize2>,
    "rasterIds" : [ <rasterId21>, <rasterId22> ]
  }
]
}

2  客户端访问

ArcGIS Silverlight API中,通过HttpWebRequest来请求下载,通过HttpWebResponse获取下载结果并进行处理。

下面的代码演示了如何请求下载以及如何处理下载结果。

public void BeginDownload(string rasterIds,stringgeometry,string geoType,string imgFormat)

{

    stringcomma = "%2C";//逗号

    rasterIds = rasterIds.Replace(",", comma);

    geometry = geometry.Replace(",", comma);

 

    StringBuilderurlBuilder = new StringBuilder();

    urlBuilder.Append(_ImageServiceUrl);

    urlBuilder.Append("/download?");

    urlBuilder.Append("RasterIds=");//指定要下载的栅格数据ObjectID

    urlBuilder.Append(rasterIds);

    urlBuilder.Append("&geometryType=");//指定范围类型

    urlBuilder.Append(geoType);

    urlBuilder.Append("&geometry=");//指定裁切范围

    urlBuilder.Append(geometry);

    urlBuilder.Append("&format=");//指定输出的栅格数据格式

    urlBuilder.Append(imgFormat);

    urlBuilder.Append("&f=json");//指定返回的结果格式

 

    // 开始请求下载

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(

urlBuilder.ToString());

    request.BeginGetResponse(new AsyncCallback(DownloadCallback), request);

}

 

private void DownloadCallback(IAsyncResult asynchronousResult)

{

    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(

asynchronousResult);

    long length= response.ContentLength;

    Streamstream = response.GetResponseStream();

    StreamReaderreader = new StreamReader(stream);

 

    stringresult = reader.ReadToEnd();//读取返回的json字符串

 

    //处理错误结果

    if(result.Contains("/"error/":"))

    {

        result = result.Substring(10);//去掉开头的 {"error":{

        result = result.Substring(0,result.Length - 4);//去掉末尾的 "]}}

 

        intcodeIndex = result.IndexOf("/"code/":");

        intmsgIndex = result.IndexOf(",/"message/":/"");

        intdetailsIndex = result.IndexOf("/",/"details/":[/"");

 

        intcodeLength = 7;// "code":"

        intmsgLength = 12;// ,"message":"

        int detailsLength = 14;//","details":["

 

        DownloadErrorerror = new DownloadError();

        error.ErrorCode =result.Substring(codeIndex + codeLength,

 msgIndex - codeIndex - codeLength);

        error.Message =result.Substring(msgIndex + msgLength,

detailsIndex - msgIndex - msgLength);

        error.Detail =result.Substring(detailsIndex + detailsLength);

 

        if(DownloadFailed != null)

        {

            DownloadFailed(error);// 触发下载失败事件

        }

    }

    else//获取数据成功

    {

        IList<DownloadResult> lstResultObjects = new List<DownloadResult>();

 

        if(result.Contains("id"))//有下载结果

        {

            result = result.Substring(17);//去掉开头的 {"rasterFiles":[{               

            result=result.Substring(0,result.Length-3);//去掉末尾的 }]}

 

            string[]files = result.Split(new string[] { "},{"},

            StringSplitOptions.RemoveEmptyEntries);

            foreach(string jsonResult infiles)

            {

                intnameIndex = jsonResult.IndexOf("/"id/":/"");

               int sizeIndex = jsonResult.IndexOf("/",/"size/":");

                int rasterIdIndex = jsonResult.IndexOf(",/"rasterIds/":");

 

                intidLength = 6;// "id":"

                intsizeLength = 9;// ","size":

                intrasteridLength = 13;// ,"rasterIds":

 

                // 创建下载结果对象

                DownloadResultresultObject = new DownloadResult();

                resultObject.FileSize = Convert.ToInt64(

jsonResult.Substring(sizeIndex +sizeLength,

rasterIdIndex - sizeIndex - sizeLength));

                resultObject.RasterIds =jsonResult.Substring(

rasterIdIndex + rasteridLength);

 

                stringfileName = jsonResult.Substring(nameIndex +

                idLength, sizeIndex - nameIndex- idLength);

                stringfileUrl = fileName;

                if(fileUrl.StartsWith("http:"))

                {

                    fileName =fileName.Substring(

fileName.LastIndexOf('/') + 1);

                }

                else// 下载结果指向原始文件路径

                {

                    fileUrl = _ImageServiceUrl + "//file?id=" + fileName;

                    fileName =fileName.Substring(

fileName.LastIndexOf('//') + 1);

                }

 

                resultObject.FileName =fileName;

                resultObject.Url = fileUrl;// 结果文件URL

 

               lstResultObjects.Add(resultObject);

            }

        }

 

        if(DownloadCompleted != null)

        {

            if(lstResultObjects.Count > 0)

            {

               DownloadCompleted(lstResultObjects);// 触发下载完成事件

            }

            else

            {

                DownloadErrorerror = new DownloadError();

                error.Message = "结果为0";

                error.Detail = "未能在指定范围内获取到数据";

 

                if(DownloadFailed != null)

                {

                    DownloadFailed(error);// 触发下载失败事件

                }

            }

        }

    }

}

}

辅助类:

public class DownloadResult

{

    public string Url = "";

    public stringFileName = "";

    public stringRasterIds = "";

    public long FileSize= 0;

}

 

public class DownloadError

{

    public stringErrorCode = "0";

    public string Message= "";

    public string Detail= "";

}

3  总结

ArcGIS Server 10.0中,通过REST接口能够方便地实现影像服务的访问,如果影像服务启用了Web下载功能,则在ArcGISAPI for Silverlight中,通过简单编码即可获取待下载的数据URL,从而供用户点击下载。

 影像数据的下载,既可以下载原始文件,也可以下载裁剪结果(可指定数据格式),可以通过raster id过滤要下载的影像数据。

影像数据支持Web下载的前提是,影像服务的数据源是镶嵌数据集。