跳转至

为什么我无法“获取”我的数据

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/why-cant-i-get-my-data

16653 为本文评分:

5.0

为什么我无法“获取”我的数据

匿名 2015年12月11日,星期五

在进行一个近期项目时,我需要使用 REST API 从一个 ESRI 服务器上拉取一些数据。这绝不是一项新颖的任务,但就像你们许多人一样,这并不是我每天都会做的事情。为这项任务做准备,我重温了 IDLnetURL 对象并通读了后续文档。我感觉自己已经准备充分,可以开始了。首先,我编写了 "get" 调用来获取我工作区域的几何形状(在这个例子中我将使用犹他州)。

oURL = obj_new('IDLnetURL')

oURL->SetProperty, $ url_scheme='https', $ url_host = 'sampleserver6.arcgisonline.com',$ url_path = 'arcgis/rest/services/USA/MapServer/2/query?text=Utah&geometryType=esriGeometryEnvelope&spatialRel=esriSpatialRelIntersects&f=pjson'

Cords_Json = oUrl->Get(/string_array, /BUFFER)

Cords_Json = JSON_PARSE(strjoin(Cords_Json))

GeomJson = JSON_SERIALIZE(((Cords_Json['features'])[0])['geometry'])

这运行得很好,下一步是查找落在给定区域内的所有矢量要素(在这个例子中我将使用县)。然而,当我回过头使用我可靠的 "get" 命令时,它却失败了。

oURL = obj_new('IDLnetURL')

oURL->SetProperty, $ url_scheme='https', $ url_host = 'sampleserver6.arcgisonline.com',$ url_path = 'arcgis/rest/services/USA/MapServer/3/query?geometry='+GeomJson+'&geometryType=esriGeometryPolygon&spatialRel=esriSpatialRelContains&outFields=*&f=json'

County_Json = oUrl->Get(/string_array)

返回的不是格式良好的 JSON,而是 HTML,而且还是不完整的 HTML。我对此感到困惑,直到我意识到 "get" 请求的返回字符限制是 2,048。这带来了一个问题,因为在我的区域内有 29 个矢量要素,每个都有复杂的几何形状和数百个顶点。所以,必须重新想办法。

当执行从客户端到服务器的请求-响应时,有两种返回数据的选项。有 "get" 方法和 "post" 方法。这两种方法有几个细微差别,但就我们的目的而言,主要需要注意的一点是,"get" 将您请求的数据嵌入在 URL 中返回,因此其长度有限制。另一方面,"post" 将其与请求正文一起返回,因此没有限制。所以,我相信您已经猜到了,"post" 方法就是我问题的答案。

oURL = obj_new('IDLnetURL')

oURL->SetProperty, $ url_scheme='https', $ url_host = 'sampleserver6.arcgisonline.com',$ url_path = 'arcgis/rest/services/USA/MapServer/3/query?f=json'

data = 'geometry='+GeomJson+'&geometryType=esriGeometryPolygon&spatialRel=esriSpatialRelContains&outFields=*'

County_Json = oURL->Put(data, /POST, /BUFFER)

通过使用 "post" 方法代替 "get" 方法,我成功获取了所有的县及其名称。

; 获取县名 County_Json = JSON_PARSE(County_Json, /TOSTRUCT) County_Names = strarr(n_elements(County_Json.features)) for i = 0, n_elements(County_Json.features)-1 do County_Names[i] = (County_Json.features)[i].Attributes.name print, County_Names, FORMAT='(a)'

LiDAR与高光谱数据融合概述 利用可扩展系统实现精准农业