Dynamic map service layer 动态服务图层

ArcGIS动态地图服务图层(dynamic map service layer)显示来自ArcGIS Server地图服务的地图内容。这种Map服务不能被缓存(tiled)。该服务在图层请求时生成地图图像。当用户导航地图(navigates the map)时,该图层请求显示新的地图图像。由于地图图像是动态创建的,因此可以通过修改某些图层属性来自定义地图图像的内容。如果动态图层的空间参考不匹配地图的空间参考,则动态图层将自动重新投影其地图内容以匹配地图的空间参考

ArcGIS Server地图服务基于地图文档(* .mxd or *.msd files)。地图文档包含需要在地图中显示的功能。功能是真实世界的实体,如建筑物,管道和包裹。功能被组织成图层。例如,国家公园的地图文件可能包含远足小径,野餐区,露营地和主要道路的单独图层。

地图文档还包含控制地图外观的信息,例如符号系统,可视性,图层缩放范围等。 可以将地图文档发布到ArcGIS Server以创建地图服务。

ArcGIS Server地图服务可作为SOAP和REST Web服务在Web上访问。您可以使用ArcGIS Server服务目录找到这些Web服务端点的URL。

要实例化一个AGSDynamicMapServiceLayer,您需要为地图服务的REST Web服务端点提供一个URL。 该URL通常采用http://<server:port>/<instance>/rest/services/<service>/MapServer的格式。

let url = NSURL(string: "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer")
let layer = AGSDynamicMapServiceLayer(URL: url)

另一种创建图层的方法是使用AGSMapServiceInfo对象。您首先创建AGSMapServerInfo,然后使用它创建一个图层。如果您想在创建图层之前检查Map服务的属性,或者如果希望图层从一开始就使用不同的默认设置(如图层定义或图层可见性),这会非常有用。

可以通过AGSMapServiceInfo设置一些属性。

let url = NSURL(string: "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/ Specialty/ESRI_StateCityHighway_USA/MapServer")
var error:NSError?
let info = AGSMapServiceInfo(URL:url, error: &error)
        
//inspect or modify the info object if you want
...
        
let layer = AGSDynamicMapServiceLayer(mapServiceInfo: info)

创建一个AGSMapServiceInfo是同步的,这意味着它会阻塞调用线程。需要在后台线程上调用此方法。

创建图层后,您可以将其添加到地图以显示其内容。当图层准备好时,其加载的属性将被启用。然后您可以安全地访问其属性。

if layer.loaded {
    println("Initial Envelope : \(layer.initialEnvelope)")
}

您可以通过修改某些属性来更改图层的地图内容。例如,您可以通过修改visibleLayer属性来指定服务中哪些图层应该可见。

//only display ‘ushigh’ (id=0) and ‘states’ (id=1) layer
layer.visibleLayers = [0, 1]

您还可以选择通过指定图层定义在数据集中仅显示一部分要素。

//only display states beginning with 'C'
let layerID = 1
let defString = "STATE_NAME like 'C%'"
let layerDef = AGSLayerDefinition(layerId: 1, definition: defString)
        
layer.layerDefinitions = [layerDef]

ArcGIS Tiled Map Service layer 平铺服务层

ArcGIS平铺地图服务图层显示来自已缓存(tiled)的ArcGIS Server地图服务的地图内容。 缓存的地图服务包含预先生成的地图图块(map tile)。这些地图图块的数量和内容由服务的平铺方案( tiling scheme)和服务基于的地图文档来定义。平铺方案基本上指定了诸如平铺尺寸(dimensions),图像格式(image format),比例尺(scale levels)等的参数。 在导航地图(navigate the map)时,图层会提取新的地图图块进行显示。

与动态图层不同,平铺图层的空间参考必须与地图的空间参考相匹配。因为平铺图层显示提前预先生成的地图图块,无法重新投影以匹配不同的空间参考。

要实例化一个AGSTiledMapServiceLayer,您需要提供一个URL到地图服务的REST Web服务端点。 您应该检查服务目录中的Single Fused Map Cache属性是否设置为true,以确认该服务确实已缓存。 AGSTiledMapServiceLayer不适用于未缓存的地图服务。

let url = NSURL(string: "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer")
let layer = AGSTiledMapServiceLayer(URL: url)

创建图层后,您可以将其添加到地图以显示其内容。当图层准备好时,其加载的属性将被启用。然后您可以安全地访问其属性。

if layer.loaded {
 println("Tiling Scheme: \(layer.tileInfo)")
}

与ArcGIS动态地图服务图层不同,您不能修改ArcGIS平铺地图服务图层的属性来更改地图内容。 这是因为该层依赖于缓存的Map服务,该服务不像动态地图服务那样以动态方式创建地图图像。

Image Service layer 图像服务层

ArcGIS图像服务层显示由ArcGIS Server图像服务提供的图像和其他类型的栅格数据(raster data)。

ArcGIS Image Service层是一个动态层(dynamic layer)。它在用户导航地图时请求新的地图图像。 由于地图图像是在图层请求时动态创建的,因此可以通过修改某些图层属性来自定义地图图像的内容。 如果图层的空间参考与地图的空间参考不匹配,图层将自动重新投影其地图内容以匹配地图的空间参考

About Image Services

图像服务基于栅格数据(raster data)。栅格数据本质上是一个单元格网格。每个单元格对应一个物理位置,并且该单元格的值表示有关该位置的信息。 栅格格式通常使用矢量格式来存储连续数据,例如降雨或高程,因为它可以更好地表示某个区域数据的粒度变化。 栅格也常用于存储由卫星传感器捕获的图像和其他信息。

Learn more about raster data

Learn more about Image Services

图像服务的数据可以采用任何支持的栅格格式。可以将数据发布到ArcGIS Server以创建图像服务。根据数据的存储方式,某些图像服务功能可能无法使用。例如,指定镶嵌规则的功能仅在数据存储为镶嵌数据集时才可用。有关哪些功能可用于不同输入的更多信息,请参阅Image Service参数主题

图像服务可以作为SOAP和REST Web服务在Web上访问。 您可以在ArcGIS服务目录上找到这些Web服务的URL。

创建图层

要创建图像服务图层,您需要实例化AGSImageServiceLayer类的对象。 在实例化对象时,您需要为Image Service的REST Web服务端点提供一个URL。 该URL通常采用http://<server:port>/<instance>/rest/services/<service>/ImageServer格式。

let url = NSURL(string: "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Portland/CascadeLandsat/ImageServer")
let layer = AGSImageServiceLayer(URL: url)

修改地图内容

图像服务图层允许您通过指定几个属性来修改图层显示的地图内容。 例如,您可以指定应用于缩小地图图像大小的压缩量(0% - 100%)。 这对于通过低带宽连接访问高分辨率图像特别有用。

Band combinations

栅格数据可以有一个或多个信息带。 例如,高程模型通常包含单波段的高程信息,而全色图像包含单波段灰度值。 另一方面,航空照片通常包含三个波段,红色,绿色和蓝色波长各一个。 一些光栅数据可以是多光谱的,包含超过三个甚至超出可见光范围的信息,例如红外。

Learn about raster bands

获取图像服务层提供有关图像服务中有多少波段可用的信息,如下所示:

var layer = layer as AGSImageServiceLayer
let imageInfo = layer.imageServiceInfo
let bandCount = imageInfo.bandCount

如果bandCount为n,则每个频段都分配一个从0到n-1的对应ID。

您可以按如下方式指定应包含在地图图像中的波段组合:

//For a grayscale map image with band 0
var grayscaleBandIds = [0]
layer.bandIds = grayscaleBandIds
        
//Or, For a color image with band 2, band 5, and band 0 as Red, Green, and Blue respectively
var rgbBandIds = [2, 5, 0]
layer.bandIds = rgbBandIds

Note: 即使图像服务包含三个以上的波段,您也只能在地图图像中指定一个波段(对于灰度)或三个波段(对于颜色)。

Mosaic rules 马赛克规则?

基于镶嵌数据集的图像服务可以包含许多重叠的栅格。镶嵌规则定义了将栅格组合在一起以创建地图图像的顺序。支持以下方法:

  • 最靠近Center-Rasters的中心距离视图中心最近的放置在顶部。
  • 根据最低点位置和视图中心之间的距离,最接近Nadir-Orders栅格。这与“最接近中心”方法类似,但使用栅格的最低点,可能与中心不同,特别是对于倾斜图像。
  • 最接近Viewpoint-Orders栅格基于用户定义的位置和栅格的最低点位置之间的距离。
  • 按Attribute—Orders栅格基于指定的元数据属性和基础值之间的差异。
  • North-West—Rasters以及其中心向西北方向显示在上方。 … (略)

更多见:

https://developers.arcgis.com/ios/10-2/swift/guide/image-service-layer.htm

ArcGIS Local Tiled layer 本地平铺图层

ArcGIS本地平铺图层显示来自设备上可用的图块包的地图内容。 即使设备没有任何网络连接,该图层也可以继续显示地图内容,因为所有地图内容都可以在图块包中本地获得。

(略)

Bing 地图图层

(略)

WMS layer web地图服务层

(略)

Graphics layers 图形层

图形图层允许您在地图上动态显示图形。例如,可以使用图形图层来保存用户绘制的多边形或线条,或者显示满足任务结果(如查询或地理处理)的要素。在下图中,图形层用于突出显示人口密度超过每平方英里200的州:

2018040920947cc.png

如果要将图形图层添加到地图,请使用AGSGraphicsLayer类创建图层。这个类的实例包含一个图形列表和一个可选的渲染器(AGSRenderer)。还有添加,删除和重绘图形的方法。确保在任何基础图层之后添加图形图层,以便在运行应用程序时在图层上方显示图形。有关更多信息,请参阅图层类型。

符号定义了图形外观的非地理方面。这包括图形的颜色,边框宽度,透明度等等。适用于iOS的ArcGIS Runtime SDK包含许多符号类,每个符号类都允许您以独特的方式指定符号系统。每种符号类型也特定于一种几何类型(即点,线或多边形)。

渲染器定义了适用于图形图层的符号集。应用于每个图形的符号取决于图形的属性。渲染器指定哪些属性值对应于哪个符号。

添加一个graphics layer

现在app上添加地图(略), 然后

let myGraphicsLayer = AGSGraphicsLayer()

如果你想用另一种方法引用你的新图形层,你可以在你的类中创建一个实例变量来保存图形层。

要将新图形图层添加到地图,请使用AGSMapView方法addMapLayer:

self.mapView.addMapLayer(myGraphicsLayer, withName:"Graphics Layer")

请注意,您在addMapLayer方法中为您的图层命名的名称对于您的地图视图必须是唯一的。

添加图形功能

图形是AGSGraphic类的一个实例。图形与几何图形相关联,该图形定义了地图上图形的位置和形状。 该图形可以与符号相关联,该符号定义了图形应该如何显示。或者,图形层可以与渲染器相关联,该渲染器确定该层中的所有图形如何显示。或者,您可以拥有与图形相关的属性。这些属性是表示图形所代表的真实世界实体信息的关键值对。

在大多数情况下,您在地图上显示的图形将作为执行任务(例如查询地图服务,地址地理编码或执行地理处理分析)的结果返回。在这种情况下,图形将包含描述其在地图上的位置和形状的几何图形。您只需定义如何显示图形,方法是为每个图形分配一个符号,或者将图层分配给一个渲染器。

但是,您也可以通过编程方式创建图形。在这种情况下,您还需要为图形分配几何图形。您可以自己创建几何图形,也可以让用户使用Sketch图层交互式绘制几何图形。

以下代码创建一个图形,为其分配一个符号和一个几何图形,并将其添加到现有的图形图层:

func addGraphicsLayer() {
        
   //create a marker symbol to be used by our Graphic
   let myMarkerSymbol = AGSSimpleMarkerSymbol()
   myMarkerSymbol.color = UIColor.blue
   
   //Create an AGSPoint (which inherits from AGSGeometry) that
   //defines where the Graphic will be drawn
   let myMarkerPoint = AGSPoint(x: -93.2984, y: 44.9409, spatialReference: self.mapView.spatialReference)
   
   //Create the Graphic, using the symbol and
   //geometry created earlier
   let myGraphic = AGSGraphic(geometry: myMarkerPoint, symbol: myMarkerSymbol, attributes: nil)
   
   if self.graphicLayer == nil {
       self.graphicLayer = AGSGraphicsLayer()
       self.mapView.addMapLayer(self.graphicLayer, withName:"Graphics Layer")
   }
   
   //Add the graphic to the Graphics layer
   graphicLayer!.addGraphic(myGraphic)        
}

2018040910538c1.png

作为任务结果返回的图形已经填充了一个几何图形而不是一个符号,因此您需要给这些图形一个符号或在将图形添加到图形图层之前将一个渲染器应用到图形图层。 要将符号设置为作为查询任务结果返回的图形,请执行以下操作:

//create a simple fill symbol
let fillSymbol = AGSSimpleFillSymbol()
fillSymbol.color = UIColor.purpleColor().colorWithAlphaComponent(0.25)
fillSymbol.outline.color = UIColor.darkGrayColor()
        
//featureSet.features is the result of a Query task.
//It is an array of AGSGraphic objects containing
//geometries, but not symbols.
for graphic in featureSet.features as [AGSGraphic] {

	//set the graphics’s symbol to fillSymbol
 graphic.symbol = fillSymbol
            
 //add the graphic to the layer
 graphicsLayer.addGraphic(graphic)
}

在标注中显示属性信息

图形可以包含提供有关图形信息的自定义属性。例如,代表城市的图形可能具有提供有关其总人口,平均家庭收入等信息的属性。属性基本上是键值对,与每个图形一起存储在字典中。要在用户点击图形时自动显示地图标注,您必须:

  • Set a delegate on AGSCallout
  • Set a calloutDelegate on the AGSGraphicsLayer that contains the graphic.

Refer to Displaying a callout topic for more information.

个人理解类似气泡显示。

使用symbols

符号定义了图形的非地理方面的外观。这包括图形的颜色,边框宽度,透明度等等。适用于iOS的ArcGIS Runtime SDK包含许多符号类,每个符号类都允许您以独特的方式指定符号系统。每种符号类型也特定于一种几何类型(即点,线或多边形)。

在许多应用中,相同的符号将被多次使用。 例如,考虑使用查找任务来允许用户搜索县的应用程序。 在这种情况下,每次执行任务时将相同的符号系统应用于任务的结果是有意义的。 在这种情况下,您应该将对象的引用存储在类中的实例变量/属性中。

Symbol (可用来描述的)几何图形 Description class
Simple Marker 用简单的形状象征点 AGSSimpleMarkerSymbol
Picture Marker 用图像象征点 AGSPictureMarkerSymbol
Simple Line 折线 用预定义的样式表示线条 AGSSimpleLineSymbol
Composite 点/线/多边形 用一组符号来表示几何图形 AGSCompositeSymbol
Simple Fill 多边形 用多种图案填充多边 AGSSimpleFillSymbol
Text 点/线/多边形 显示几何图形的文本标签 AGSTextSymbol

这里提到的所有符号类都从AGSSymbol继承。

以下代码创建一个AGSSimpleMarkerSymbol,绘制为蓝色菱形,带有一个红色,三个像素宽的白色轮廓:

/create a marker symbol to be used by our Graphic
let myMarkerSymbol = AGSSimpleMarkerSymbol()
myMarkerSymbol.color = UIColor.blue
myMarkerSymbol.style = .diamond
myMarkerSymbol.outline.color = UIColor.red
myMarkerSymbol.outline.width = 3

2018040974999c2.png

以下代码创建一个半透明红色填充和两个像素宽的红色轮廓的AGSSimpleFillSymbol。 简单填充符号的大纲是一个AGSSimpleLineSymbol。

//Create the AGSSimpleFillSymbol and set it’s color
let myFillSymbol = AGSSimpleFillSymbol()
myFillSymbol.color = UIColor(red:0.7, green:0.1, blue:0.1, alpha:0.5)
        
//Create the AGSSimpleLineSymbol used for the outline
let myOutlineSymbol = AGSSimpleLineSymbol()
myOutlineSymbol.color = UIColor.redColor()
myOutlineSymbol.width = 2
        
//set the outline property to myOutlineSymbol
myFillSymbol.outline = myOutlineSymbol

使用 Renderers

渲染器定义了一组将用于图形图层中的图形的符号。 您可以使用渲染器根据图形的属性值使用不同颜色或大小的特征进行符号化。 要使用渲染器,可以创建它,定义符号系统,然后设置Graphics图层的渲染器属性

graphicsLayer.renderer = myRenderer

一个简单的渲染器为每个图形使用相同的符号。 你所需要做的就是用所需的符号创建渲染器,然后将其设置为图形图层的渲染器属性。

AGSSimpleRenderer上的符号属性是只读的。 要使用简单的渲染器使用符号,必须使用所需的符号创建渲染器。 另外,符号类型需要与要素类型匹配(点要素的标记符号,折线要素的线符号以及多边形要素的填充符号)。

其他略, 见 https://wiki.tyrad.cc/Swift/arcgis-symbols-and-renderers.html

Sketch layer

Sketch图层可以轻松地交互式地创建和修改几何图形。 用户可以使用sketches注释地图,并通过绘制诸如区域,线条和点的形状来完善地理内容。 您不必编写任何代码来实现sketching behavior。您只需连接Sketch图层,以便跟踪和响应用户交互。

Sketch workflow

这里介绍创建或修改sketch,所需的用户交互。

1). 当sketch图层is active时,点击地图以向草图添加顶点。如果您正在绘制多边形,多段线或多点,则可以反复点击以向草图添加更多顶点。如果您正在绘制一个点,则再次点击地图会将现有顶点移动到新位置。 2). 要在特定顶点(vertex)之后添加顶点,请点击顶点,然后点击要添加新顶点的地图。 3). 要在两个顶点之间插入一个顶点,通过点击它来选择两个顶点之间的中点。接下来,通过点击要插入新顶点的地图来移动中点。这会在轻敲的位置插入一个新的顶点。 4). 要移动顶点,请点击它来选择顶点。接下来,点击并按住顶点几秒钟。如果您在地图视图中启用了showMagnifierOnTapAndHold属性,则会出现放大镜。然后,您可以将手指拖动到要将顶点移动到的位。松开手指时,顶点将移动到该位置。

Sketch symbology

Sketch由很多不同的视觉元素组成,他们每个都是独立。例如:

2018041763737c2.png

您可以通过修改AGSSketchGraphicsLayer类的某些属性来更改每个元素的symbology。 mainSymbol属性允许您修改草图的Line和Fill symbols。

vertexSymbol,selectedVertexSymbol和midVertexSymbol属性允许您分别修改顶点,选定顶点和顶点之间的中点的符号。

使用Sketch layer

要使用Sketch图层,请实例化AGSSketchGraphicsLayer类的对象并将其添加到地图中。 如果您知道用户需要绘制的几何图形类型(the type of geometry),则可以在实例化图层时传入几何图形(geometry)。或者,您可以实例化没有几何体的图层(如下所示),并稍后分配几何图形。

let sketchLyr = AGSSketchGraphicsLayer()
self.mapView.addMapLayer(sketchLyr, withName: "Sketch Layer")

您分配给图层的几何图形类型决定了用户允许绘制的图形(geometry)类型。几何图形可以是以下类型之 一:

  • AGSMutablePoint
  • AGSMutableMultipoint
  • AGSMutablePolyline
  • AGSMutablePolygon

请注意,需要将可变几何图元分配给图层,因为随着用户草图的绘制,图层将更新该几何图元。

如果分配给图层的几何图形为空,则初始草图为空白,用户可以从头开始创建新草图。但是,如果几何体不是空的,则初始草图代表现有的几何体,用户可以对其进行修改。

//empty geometry for new sketch
let sketchPolygon = AGSMutablePolygon(spatialReference: self.mapView.spatialReference)
sketchLyr.geometry = sketchPolygon
        
//or, existing geometry for modifying sketch
let sketchPolygon = polygon.mutableCopy() as AGSMutablePolygon
sketchLyr.geometry = sketchPolygon

将Sketch图层添加到地图并为其分配几何图形不足以开始草图操作。您还需要将其设置为地图的触控代理,以便它可以跟踪和响应用户交互。

self.mapView.touchDelegate = sketchLyr

一次只能有一个对象作为地图的触控代理。将Sketch图层设置为委托可以取代任何先前的作为委托的对象。因此,您应该延迟将Sketch图层作为触摸委托,直到您真正希望用户开始绘制草图。

此时,用户可以在地图上开始绘制草图,并在用户绘制草图时修改几何图形。您可以随时访问草图几何图形,如下所示:

let sketch = sketchLyr.geometry

要开始另一个草图,你不需要创建一个新的图层; 可以为为现有图层分配新的几何图形。

(不需要的时候)草图工作流程结束后,抓取草图图层的几何图形,清除图层,然后将图层取消设置为地图的触摸代理,以防止进一步绘制草图。请务必恢复原始触摸委托,以启用依赖跟踪地图触摸事件的应用程序的其他部分。

note: 用户完成草图后,建议使用AGSGeometryEngine上的simplifyGeometry:方法简化草图几何。 如果几何体自身相交,或者多边形几何体的方向相反,则会进行必要的校正。 如果在地图上启用了环绕,则使用AGSGeometryEngine上的normalizeCentralMeridianOfGeometry:方法规格化几何。

Undo and Redo changes

Sketch layer提供撤销和重做对草图所做更改的功能。该层在引擎盖下使用Apple的NSUndoManager类来维护草图更改的历史记录。修改草图时,无论是通过调用“草图”图层上的方法还是通过与地图交互,图层都会跟踪更改。您可以通过在NSUndoManager上调用相应的方法来撤销和重做这些更改序列,如下所示:

let mgr = sketchLyr.undoManager
//Undo a change
if mgr.canUndo {
	mgr.undo()
}
        
//Or, redo a change
if mgr.canRedo {
	mgr.redo()
}

For more information about Undo and Redo changes, refer to Apple’s Undo Architecture guide.

草图更改特定于几何。 当草图图层的几何体被替换时,草图变化的历史会自动清除。

其他,略https://developers.arcgis.com/ios/10-2/swift/guide/sketch-layer.htm