栅格图层定义(Raster Layer Definition)

本文介绍了栅格图层的基本概念及其定义方式,包括如何指定像素颜色规则、处理多光谱数据、设置数字高程数据的样式等。还详细解析了栅格图层定义中的各个元素及其作用。

    栅格图层的数据被渲染为图像,而图像是由像素组成的。所以,定义栅格图层的样式,本质上是定义计算每个像素颜色的规则。通过改变栅格图层定义,我们可以调整栅格图层中每个像素的亮度、对比度,选择透明颜色等。
    栅格图层支持多光谱(Multi-Spectral)栅格数据。这种数据有多个通道(Band),每个通道具有相同的地理位置,但是代表不同的信息。例如:一个多光谱栅格文件可以包含如下通道:

  • Blue:用于大气层和深水成像。
  • Green:用于植物和深水结构成像。
  • Red:用于人造物体、300英尺以上的水、土壤和植物的成像。
  • Near-infrared (近红外):主要用于植物成像。
  • Mid-infrared (中红外):用于植物和土壤水分、森林火灾、地质的成像。
  • Thermal-infrared (热红外):用于发射辐射、地质结构的成像。
  • Radar (雷达):用于地形成像或探测各种物体。

    因为栅格图层支持多光谱栅格数据,所以栅格图层定义也支持通道的概念。用户可以指定使用哪个通道作为图像数据,哪三个通道作为R、G、B通道,哪个通道作为高程数据,哪个通道用于计算山体阴影(Hillshade)。通常情况下,一个栅格文件只包含一个通道。这时,Band元素的值设置为1。
    栅格图层不仅支持普通的图像数据和多光谱栅格数据,而且支持数字高程数据。利用数字高程数据,我们可以构建数字地形模型(Digital Terrain Model)。对于这类型的数据,我们还可按照高度(Height)、坡度(Slope)和坡向(Aspect)来定义各种主题图样式。
    栅格图层定义的XML Schema如下图所示。下面的表格解释了栅格图层定义的一些主要元素。

名称

描述

FeatureName

用于指定一个包含Raster属性的要素类。

Filter

一个FDO布尔表达式,用来指定图层返回的栅格数据。如果没有指定Filter,那么返回要素类中所有栅格数据。

Geometry

用于指定Raster属性的名称。因为在一个要素类中,可能有多个Raster属性。此元素可以让MapGuide知道使用要素类中的那个Raster属性。但是,到现在为止还没有一种要素源支持包含多个Raster属性的要素类。

GridScaleRange

用于设定栅格图层的比例尺范围。

SurfaceStyle

用户指定栅格数据高程相关的信息。

ColorStyle

用户指定栅格数据颜色相关的样式信息。

RebuildFactor

用于指定何时重新发送请求以获得更高精度的栅格数据。在浏览和缩放地图时,当本次操作的图层缩放比例超过RebuildFactor指定的值时,MapGuide会重新发送请求以获得更高精度的栅格数据。

但是,目前MapGuide并没有使用这个值。每次缩放地图,MapGuide总会重新发送请求以获得更高精度的栅格数据。

Raster Layer Definition

 

    对于数字高程数据,栅格图层定义中使用了SurfaceStyle和Hillshade元素对它们进行处理。SurfaceStyle用来对高程数据进行预处理,它的XML Schema如下图所示。下面的表格解释了SurfaceStyle的一些主要元素。

名称

描述

Band

用于指定作为高程数据的通道。

ZeroValue

用于指定映射为0的高程值,默认值为0

ScaleFactor

用于指定高程数据的缩放比例,默认值为1

DefaultColor

用于指定像素的默认颜色。如果栅格图层定义中没有ColorStyle,就使用DefaultColor指定的颜色来样式化栅格数据。

Surface Style

 

    给定一个高程值e,应用SurfaceStyle后,目标高程值等于(e - ZeroValue) * ScaleFactor。
    HillShade用来设置山体阴影。通常情况下,HillShade所指定的Band与SurfaceStyle中指定的Band是同一个通道。但是,这并不意味着它们必须是同一个通道。通过应用HillShade,可以让栅格图层看是起来有3维的效果。例如:下面两个栅格图层,左边的是应用了HillShade的图层,右边的是没有应用HillShade的图层。左边的图层看是起来有3维的效果,右边的却没有。
HillShade

 

    HillShade的XML Schema如下图所示。下面的表格解释了HillShade的一些主要元素。

 

名称

描述

Band

用于指定一个包含用于计算山体阴影数据的通道。

Azimuth

用于指定太阳光线在XY平面的投影与正北方向的夹角。

Altitude

用于指定太阳光线与XY平面的夹角。

ScaleFactor

用于指定计算山体阴影时高程值的缩放因子,默认值为1。这个缩放因子并不会影响高程值本身,只影响山体阴影的计算。

 HillShade Definition

     ColorStyle的XML Schema如下图所示。下面的表格解释了ColorStyle的一些主要元素。

 

名称

描述

HillShade

用于指定作山体阴影样式信息。

TransparencyColor

用于指定一个透明的颜色。Opacity是用于设置整个图层的透明程度。与Opacity不同,应用这个样式后,图层中所有具有此颜色的像素都会变为透明的。

BrightnessFactor

用于指定图层的亮度。这是一个0~1之间的值,默认值为0

ContrastFactor

用于指定图层的对比度。这是一个0~1之间的值,默认值为0

ColorRule

用于指定颜色规则。用户可以指定多条颜色规则。

Filter

用于指定应用当前样式规则的像素。Filter只能应用于数字高程数据,不能用于普通的图像数据。目前,Filter支持三个函数HeightSlopeAspect,分别用于按照高度、坡度、坡向定义样式。这三个函数都是只有一个参数Band,用于指定按照那个通道的数据来计算高度、坡度、坡向。

Label

对于栅格图层无意义,MapGuide没有使用它。

Color

用于指定栅格图层颜色样式

ExplicitColor

用于指定一个RGBA格式的颜色值。

Band

用于指定一个包含图像数据的通道。

Bands

用于指定RGB三个通道,从而创建一个RGB样式的栅格图层。

 

Color Style

     下面的栅格图层定义用于显示一张普通的图像,它使用通道1的数据作为图像数据。

<GridLayerDefinition>
  <ResourceId>fsd://Raster_2</ResourceId>
  <FeatureName>rasters:g-01</FeatureName>
  <Geometry>Image</Geometry>
  <GridScaleRange>
    <ColorStyle>
      <ColorRule>
        <LegendLabel></LegendLabel>
        <Color>
          <Band>1</Band>
        </Color>
      </ColorRule>
    </ColorStyle>
    <RebuildFactor>1</RebuildFactor>
  </GridScaleRange>
</GridLayerDefinition>

    下面的栅格图层定义用于显示数字高程数据,它使用通道1的数据作为高程数据,通道1的数据计算山体阴影,包含了如下三条颜色规则:

  • 高度大于等于131,小于225的数据渲染为颜色FFFFFFC8。
  • 高度大于等于225,小于319的数据渲染为颜色FFF0D796。
  • 高度大于等于319,小于414的数据渲染为颜色FFE1AF64。

<GridLayerDefinition>
  <ResourceId>fsd://Raster_1</ResourceId>
  <FeatureName>rasters:REDDING</FeatureName>
  <Geometry>Image</Geometry>
  <GridScaleRange>
    <SurfaceStyle>
      <Band>1</Band>
      <DefaultColor>0000FF00</DefaultColor>
    </SurfaceStyle>
    <ColorStyle>
      <HillShade>
        <Band>1</Band>
        <Azimuth>45</Azimuth>
        <Altitude>45</Altitude>
      </HillShade>
      <ColorRule>
        <LegendLabel> 131 to 225</LegendLabel>
        <Filter>(Height(1) &gt;= 131) AND (Height(1) &lt; 225)</Filter>
        <Color>
          <ExplicitColor>FFFFFFC8</ExplicitColor>
        </Color>
      </ColorRule>
      <ColorRule>
        <LegendLabel> 225 to 319</LegendLabel>
        <Filter>(Height(1) &gt;= 225) AND (Height(1) &lt;)</Filter>
        <Color>
          <ExplicitColor>FFF0D796</ExplicitColor>
        </Color>
      </ColorRule>
      <ColorRule>
        <LegendLabel> 319 to 414</LegendLabel>
        <Filter>(Height(1) &gt;= 319) AND (Height(1) &lt;= 414)</Filter>
        <Color>
          <ExplicitColor>FFE1AF64</ExplicitColor>
        </Color>
      </ColorRule>
    </ColorStyle>
    <RebuildFactor>1</RebuildFactor>
  </GridScaleRange>
</GridLayerDefinition>

<think> 我们提供的工具是针对栅格图的,用户在使用时如果选择了非栅格图(如要素图),就会出现“该值不是raster layer的成员”的错误提示。 解决方案: 1. 确保工具参数设置正确:在参数定义中,我们通过`param0.filter.list = ["Raster Layer"]`来限制只能选择栅格图。 2. 检查输入:用户可能选择了非栅格图(如矢量或表格),需要检查输入图类型。 但是,用户反馈的错误提示可能是由于以下原因: - 在ArcGIS Pro中,即使我们设置了过滤器,有时用户通过“按名称选择图”的方式输入图名称,可能输入了非栅格图。 - 或者,用户使用的栅格图在添加到地图时被识别为其他类型(如栅格目录、镶嵌数据集等,可能被识别为其他类型图)。 修改建议: 在工具执行时,增加对输入图类型的检查。 修改`execute`函数中的处理逻辑: 在循环处理每个图之前,先判断图的类型是否为栅格图。 具体步骤: 1. 获取输入参数中的图列表(注意:参数0是多值图参数,我们将其拆分为列表)。 2. 遍历每个图路径,在活动地图中查找对应的图。 3. 判断找到的图是否为栅格图(通过图的`isRasterLayer`属性)。 修改代码: 在`execute`函数中,在循环内部增加类型判断: ```python if not raster_layer.isRasterLayer: arcpy.AddWarning(f"⚠️ 图 {raster_name} 不是栅格图,跳过处理") continue ``` 同时,在获取图时,我们之前已经通过名称匹配,但可能匹配到非栅格图,因此增加类型检查。 另外,我们也可以考虑在参数获取时,使用`GPRasterLayer`数据类型,但注意多值参数使用`GPLayer`并过滤为栅格图已经足够。 但是,用户仍然可能输入一个非栅格图(例如,通过手动输入图名称,而该名称是一个要素图),所以执行时的检查是必要的。 修改后的`execute`函数中循环部分: ```python for raster_path in rasters: try: # 提取图名称 raster_name = os.path.basename(raster_path).split(".")[0] # 在当前地图中查找图 raster_layer = None for layer in active_map.listLayers(): if (layer.name == raster_name or layer.longName == raster_path) and layer.isRasterLayer: raster_layer = layer break # 如果没有找到栅格图 if not raster_layer: arcpy.AddWarning(f"⚠️ 未找到栅格图: {raster_name},请确保该图已添加到当前地图并且是栅格类型") continue # 如果找到了图,但再次确认类型(双重保险) if not raster_layer.isRasterLayer: arcpy.AddWarning(f"⚠️ 图 {raster_name} 不是栅格图,跳过处理") continue ... # 后续处理 ``` 此外,还可以在`updateMessages`方法中添加验证,在用户输入参数后立即检查所选图是否为栅格图。 不过,考虑到多值参数在用户选择时已经过滤,因此主要问题可能出现在用户手动输入图名称的情况下。因此,在执行时进行检查更为稳妥。 我们更新一下代码,在循环中增加类型检查。 由于我们提供的工具在参数定义中已经限制了只能选择栅格图,所以一般情况下不会出现非栅格图。但为了健壮性,我们仍然添加上述检查。 另外,注意在`find_layer_by_name`函数中(如果使用)也应该检查图类型,但上面的循环中已经加入了`and layer.isRasterLayer`。 因此,我们修改后的完整代码(仅修改了循环中的查找条件)以及增加类型检查。 以下是修正后的`execute`函数中循环查找图部分: 注意:我们不再使用单独的`find_layer_by_name`函数,而是直接在循环中查找并判断。 如果问题仍然出现,请确保输入的都是栅格图。如果用户确认输入的是栅格图,但工具仍报错,可能是因为该栅格图是镶嵌数据集的一部分或其他特殊情况。这种情况下,可以尝试使用`arcpy.Raster`来访问,但我们的工具是针对图Layer)的符号系统进行设置的,所以必须要求该图在地图中。 如果用户遇到该错误,建议检查输入的图是否是栅格图:在内容列表中查看图图标,栅格图的图标是矩形的图片样式。 我们重新提供完整的`.pyt`文件代码,其中修改了图查找逻辑,确保只查找栅格图,并增加错误处理。 完整代码(修改版): </think> 您遇到的错误"提示该值不是raster layer的成员"通常有以下原因和解决方案: ### 错误原因及解决方案: 1. **图未添加到地图** - 问题:工具需要操作地图中的图对象,但您选择的栅格可能只是数据源(硬盘上的文件)而未添加到地图 - 解决: ```markdown 1. 先将栅格数据拖拽到ArcGIS Pro的内容窗格中 2. 确保图在"内容"列表可见 3. 重新运行工具 ``` 2. **图类型不匹配** - 问题:选择的可能是镶嵌数据集、影像服务等特殊类型 - 解决: ```python # 修改工具参数定义,增加支持的图类型 param0.filter.list = ["Raster Layer", "Mosaic Layer", "Image Service Layer"] ``` 3. **路径解析问题** - 问题:工具无法正确匹配图路径和名称 - 解决:更新代码中的图查找逻辑 ```python # 替换原有的查找方法 def execute(...): # ... for raster_path in rasters: # 直接使用完整路径匹配图 raster_layer = None for layer in active_map.listLayers(): if layer.dataSource == raster_path: raster_layer = layer break ``` ### 完整修正版工具代码: ```python import arcpy import os class Toolbox(object): def __init__(self): self.label = "栅格黑边处理工具箱" self.alias = "RasterBorderTool" self.tools = [RemoveBlackBorderTool] class RemoveBlackBorderTool(object): def __init__(self): self.label = "去除黑边" self.description = "通过设置背景值透明去除栅格黑边" def getParameterInfo(self): param0 = arcpy.Parameter( displayName="输入栅格图", name="in_rasters", datatype="GPLayer", parameterType="Required", direction="Input", multiValue=True) # 扩展支持的图类型 param0.filter.list = ["Raster Layer", "Mosaic Layer", "Image Service Layer"] param1 = arcpy.Parameter( displayName="背景值", name="background_value", datatype="GPString", parameterType="Required", direction="Input") param1.value = "0" return [param0, param1] def execute(self, parameters, messages): rasters = parameters[0].valueAsText.split(";") if parameters[0].valueAsText else [] background_value = parameters[1].valueAsText aprx = arcpy.mp.ArcGISProject("CURRENT") active_map = aprx.activeMap processed_count = 0 for raster_path in rasters: try: # 方法1:通过数据源路径精确匹配 raster_layer = None for layer in active_map.listLayers(): if hasattr(layer, "dataSource") and layer.dataSource == raster_path.strip(): raster_layer = layer break # 方法2:通过名称匹配(备用) if not raster_layer: raster_name = os.path.basename(raster_path) for layer in active_map.listLayers(raster_name): raster_layer = layer break if not raster_layer: arcpy.AddWarning(f"⚠️ 未找到图: {raster_path},请确保已添加到地图") continue # 处理图 sym = raster_layer.symbology if hasattr(sym, 'displayBackgroundValue'): # 设置背景值 try: if "." in background_value: sym.backgroundValues = [float(background_value)] else: sym.backgroundValues = [int(background_value)] except: sym.backgroundValues = [background_value] sym.displayBackgroundValue = False # 透明显示 raster_layer.symbology = sym processed_count += 1 arcpy.AddMessage(f"✅ 成功处理: {raster_layer.name}") else: arcpy.AddWarning(f"⚠️ 图类型 {raster_layer.name} 不支持此操作") except Exception as e: arcpy.AddError(f"❌ 处理错误: {str(e)}") arcpy.AddMessage(f"处理完成: {processed_count}/{len(rasters)}个图") ``` ### 使用注意事项: 1. **必须先将栅格添加到地图**:在ArcGIS Pro内容窗格中可见 2. **图选择方式**: - 在工具对话框中选择地图中的栅格图(不是目录中的数据集) - 或输入完整的栅格路径 3. **特殊图处理**: - 镶嵌数据集:使用"Raster Layer"类型 - 影像服务:直接选择服务图 ### 验证步骤: 1. 在内容列表右键点击图 → 属性 2. 查看"源"选项卡中的"数据源"路径 3. 确保与工具输入的路径完全一致 如果仍有问题,可尝试: ```python # 调试代码:列出所有图信息 for layer in arcpy.mp.ArcGISProject("CURRENT").activeMap.listLayers(): print(f"图名: {layer.name},类型: {layer.dataSource}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值