arcgis-cim-symbols
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseArcGIS CIM Symbols
ArcGIS CIM 符号
Use this skill for creating advanced cartographic symbols with CIM (Cartographic Information Model).
本技能用于借助CIM(制图信息模型)创建高级制图符号。
CIM Symbol Basics
CIM 符号基础
CIM symbols provide advanced cartographic capabilities:
- Multi-layer symbols
- Complex marker graphics
- Custom line patterns
- Animated symbols
- Data-driven symbol properties
CIM符号提供以下高级制图功能:
- 多层符号
- 复杂标记图形
- 自定义线型图案
- 动画符号
- 数据驱动的符号属性
Basic CIM Symbol
基础CIM符号
javascript
const graphic = new Graphic({
geometry: point,
symbol: {
type: "cim",
data: {
type: "CIMSymbolReference",
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
enable: true,
size: 20,
frame: { xmin: 0, ymin: 0, xmax: 10, ymax: 10 },
markerGraphics: [{
type: "CIMMarkerGraphic",
geometry: {
rings: [[[0,0], [10,0], [10,10], [0,10], [0,0]]]
},
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
enable: true,
color: [255, 0, 0, 255]
}]
}
}]
}]
}
}
}
});javascript
const graphic = new Graphic({
geometry: point,
symbol: {
type: "cim",
data: {
type: "CIMSymbolReference",
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
enable: true,
size: 20,
frame: { xmin: 0, ymin: 0, xmax: 10, ymax: 10 },
markerGraphics: [{
type: "CIMMarkerGraphic",
geometry: {
rings: [[[0,0], [10,0], [10,10], [0,10], [0,0]]]
},
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
enable: true,
color: [255, 0, 0, 255]
}]
}
}]
}]
}
}
}
});CIM Point Symbols
CIM 点符号
Numbered Marker
带编号的标记
javascript
function getNumberedMarkerCIM(number) {
return {
type: "CIMSymbolReference",
primitiveOverrides: [{
type: "CIMPrimitiveOverride",
primitiveName: "textGraphic",
propertyName: "TextString",
valueExpressionInfo: {
type: "CIMExpressionInfo",
expression: "$feature.text",
returnType: "Default"
}
}],
symbol: {
type: "CIMPointSymbol",
symbolLayers: [
// Text layer (on top)
{
type: "CIMVectorMarker",
enable: true,
size: 32,
frame: { xmin: -5, ymin: -5, xmax: 5, ymax: 5 },
markerGraphics: [{
type: "CIMMarkerGraphic",
primitiveName: "textGraphic",
geometry: { x: 0, y: 0 },
symbol: {
type: "CIMTextSymbol",
fontFamilyName: "Arial",
fontStyleName: "Bold",
height: 4,
horizontalAlignment: "Center",
verticalAlignment: "Center",
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
enable: true,
color: [255, 255, 255, 255]
}]
}
},
textString: String(number)
}]
},
// Circle background
{
type: "CIMVectorMarker",
enable: true,
size: 24,
frame: { xmin: 0, ymin: 0, xmax: 10, ymax: 10 },
markerGraphics: [{
type: "CIMMarkerGraphic",
geometry: {
rings: [/* circle coordinates */]
},
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
enable: true,
color: [0, 100, 200, 255]
}]
}
}]
}
]
}
};
}javascript
function getNumberedMarkerCIM(number) {
return {
type: "CIMSymbolReference",
primitiveOverrides: [{
type: "CIMPrimitiveOverride",
primitiveName: "textGraphic",
propertyName: "TextString",
valueExpressionInfo: {
type: "CIMExpressionInfo",
expression: "$feature.text",
returnType: "Default"
}
}],
symbol: {
type: "CIMPointSymbol",
symbolLayers: [
// 文本层(顶层)
{
type: "CIMVectorMarker",
enable: true,
size: 32,
frame: { xmin: -5, ymin: -5, xmax: 5, ymax: 5 },
markerGraphics: [{
type: "CIMMarkerGraphic",
primitiveName: "textGraphic",
geometry: { x: 0, y: 0 },
symbol: {
type: "CIMTextSymbol",
fontFamilyName: "Arial",
fontStyleName: "Bold",
height: 4,
horizontalAlignment: "Center",
verticalAlignment: "Center",
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
enable: true,
color: [255, 255, 255, 255]
}]
}
},
textString: String(number)
}]
},
// 圆形背景
{
type: "CIMVectorMarker",
enable: true,
size: 24,
frame: { xmin: 0, ymin: 0, xmax: 10, ymax: 10 },
markerGraphics: [{
type: "CIMMarkerGraphic",
geometry: {
rings: [/* 圆形坐标 */]
},
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
enable: true,
color: [0, 100, 200, 255]
}]
}
}]
}
]
}
};
}Pin Marker
图钉标记
javascript
const pinMarkerCIM = {
type: "CIMSymbolReference",
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
enable: true,
anchorPoint: { x: 0, y: -0.5 },
anchorPointUnits: "Relative",
size: 40,
frame: { xmin: 0, ymin: 0, xmax: 20, ymax: 30 },
markerGraphics: [{
type: "CIMMarkerGraphic",
geometry: {
rings: [[
[10, 30], [0, 15], [0, 10],
[10, 0], [20, 10], [20, 15], [10, 30]
]]
},
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [
{
type: "CIMSolidStroke",
enable: true,
width: 1,
color: [50, 50, 50, 255]
},
{
type: "CIMSolidFill",
enable: true,
color: [255, 100, 100, 255]
}
]
}
}]
}]
}
};javascript
const pinMarkerCIM = {
type: "CIMSymbolReference",
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
enable: true,
anchorPoint: { x: 0, y: -0.5 },
anchorPointUnits: "Relative",
size: 40,
frame: { xmin: 0, ymin: 0, xmax: 20, ymax: 30 },
markerGraphics: [{
type: "CIMMarkerGraphic",
geometry: {
rings: [[
[10, 30], [0, 15], [0, 10],
[10, 0], [20, 10], [20, 15], [10, 30]
]]
},
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [
{
type: "CIMSolidStroke",
enable: true,
width: 1,
color: [50, 50, 50, 255]
},
{
type: "CIMSolidFill",
enable: true,
color: [255, 100, 100, 255]
}
]
}
}]
}]
}
};CIM Line Symbols
CIM 线符号
Arrow Line
箭头线型
javascript
const arrowLineCIM = {
type: "CIMSymbolReference",
symbol: {
type: "CIMLineSymbol",
symbolLayers: [
// Arrow head at end
{
type: "CIMVectorMarker",
enable: true,
size: 12,
markerPlacement: {
type: "CIMMarkerPlacementAtExtremities",
extremityPlacement: "JustEnd",
angleToLine: true
},
frame: { xmin: 0, ymin: 0, xmax: 10, ymax: 10 },
markerGraphics: [{
type: "CIMMarkerGraphic",
geometry: {
rings: [[[0, 0], [10, 5], [0, 10], [3, 5], [0, 0]]]
},
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
enable: true,
color: [0, 0, 0, 255]
}]
}
}]
},
// Line stroke
{
type: "CIMSolidStroke",
enable: true,
width: 2,
color: [0, 0, 0, 255]
}
]
}
};javascript
const arrowLineCIM = {
type: "CIMSymbolReference",
symbol: {
type: "CIMLineSymbol",
symbolLayers: [
// 末端箭头
{
type: "CIMVectorMarker",
enable: true,
size: 12,
markerPlacement: {
type: "CIMMarkerPlacementAtExtremities",
extremityPlacement: "JustEnd",
angleToLine: true
},
frame: { xmin: 0, ymin: 0, xmax: 10, ymax: 10 },
markerGraphics: [{
type: "CIMMarkerGraphic",
geometry: {
rings: [[[0, 0], [10, 5], [0, 10], [3, 5], [0, 0]]]
},
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
enable: true,
color: [0, 0, 0, 255]
}]
}
}]
},
// 线条描边
{
type: "CIMSolidStroke",
enable: true,
width: 2,
color: [0, 0, 0, 255]
}
]
}
};Dashed Line with Pattern
自定义虚线图案
javascript
const dashedLineCIM = {
type: "CIMSymbolReference",
symbol: {
type: "CIMLineSymbol",
symbolLayers: [{
type: "CIMSolidStroke",
enable: true,
width: 3,
color: [0, 100, 200, 255],
effects: [{
type: "CIMGeometricEffectDashes",
dashTemplate: [8, 4, 2, 4], // dash, gap, dash, gap
lineDashEnding: "NoConstraint"
}]
}]
}
};javascript
const dashedLineCIM = {
type: "CIMSymbolReference",
symbol: {
type: "CIMLineSymbol",
symbolLayers: [{
type: "CIMSolidStroke",
enable: true,
width: 3,
color: [0, 100, 200, 255],
effects: [{
type: "CIMGeometricEffectDashes",
dashTemplate: [8, 4, 2, 4], // 实线段,间隔,实线段,间隔
lineDashEnding: "NoConstraint"
}]
}]
}
};CIM Polygon Symbols
CIM 面符号
Hatched Fill
填充图案
javascript
const hatchedFillCIM = {
type: "CIMSymbolReference",
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [
// Hatch pattern
{
type: "CIMHatchFill",
enable: true,
lineSymbol: {
type: "CIMLineSymbol",
symbolLayers: [{
type: "CIMSolidStroke",
enable: true,
width: 1,
color: [0, 0, 0, 255]
}]
},
rotation: 45,
separation: 5
},
// Background fill
{
type: "CIMSolidFill",
enable: true,
color: [255, 255, 200, 255]
},
// Outline
{
type: "CIMSolidStroke",
enable: true,
width: 2,
color: [0, 0, 0, 255]
}
]
}
};javascript
const hatchedFillCIM = {
type: "CIMSymbolReference",
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [
// 填充图案
{
type: "CIMHatchFill",
enable: true,
lineSymbol: {
type: "CIMLineSymbol",
symbolLayers: [{
type: "CIMSolidStroke",
enable: true,
width: 1,
color: [0, 0, 0, 255]
}]
},
rotation: 45,
separation: 5
},
// 背景填充
{
type: "CIMSolidFill",
enable: true,
color: [255, 255, 200, 255]
},
// 轮廓线
{
type: "CIMSolidStroke",
enable: true,
width: 2,
color: [0, 0, 0, 255]
}
]
}
};Marker Placement
标记放置方式
Along Line
沿线路放置
javascript
const markerAlongLine = {
type: "CIMVectorMarker",
enable: true,
size: 10,
markerPlacement: {
type: "CIMMarkerPlacementAlongLineSameSize",
placementTemplate: [20], // Every 20 points
angleToLine: true
},
// ... marker graphics
};javascript
const markerAlongLine = {
type: "CIMVectorMarker",
enable: true,
size: 10,
markerPlacement: {
type: "CIMMarkerPlacementAlongLineSameSize",
placementTemplate: [20], // 每20个单位放置一个
angleToLine: true
},
// ... 标记图形定义
};At Vertices
在顶点放置
javascript
const markerAtVertices = {
type: "CIMVectorMarker",
enable: true,
size: 8,
markerPlacement: {
type: "CIMMarkerPlacementAtRatioPositions",
positionArray: [0, 0.5, 1], // Start, middle, end
angleToLine: true
},
// ... marker graphics
};javascript
const markerAtVertices = {
type: "CIMVectorMarker",
enable: true,
size: 8,
markerPlacement: {
type: "CIMMarkerPlacementAtRatioPositions",
positionArray: [0, 0.5, 1], // 起点、中点、终点
angleToLine: true
},
// ... 标记图形定义
};Animated CIM Symbols
动画CIM符号
javascript
// Animation is controlled via primitive overrides
const animatedCIM = {
type: "CIMSymbolReference",
primitiveOverrides: [{
type: "CIMPrimitiveOverride",
primitiveName: "rotatingElement",
propertyName: "Rotation",
valueExpressionInfo: {
type: "CIMExpressionInfo",
expression: "$view.animation.currentTime * 360",
returnType: "Default"
}
}],
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
primitiveName: "rotatingElement",
// ... marker definition
}]
}
};javascript
// 动画通过primitive overrides控制
const animatedCIM = {
type: "CIMSymbolReference",
primitiveOverrides: [{
type: "CIMPrimitiveOverride",
primitiveName: "rotatingElement",
propertyName: "Rotation",
valueExpressionInfo: {
type: "CIMExpressionInfo",
expression: "$view.animation.currentTime * 360",
returnType: "Default"
}
}],
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
primitiveName: "rotatingElement",
// ... 标记定义
}]
}
};Data-Driven Properties
数据驱动属性
Color from Attribute
基于属性的颜色设置
javascript
const dataDrivenCIM = {
type: "CIMSymbolReference",
primitiveOverrides: [{
type: "CIMPrimitiveOverride",
primitiveName: "fillLayer",
propertyName: "Color",
valueExpressionInfo: {
type: "CIMExpressionInfo",
expression: `
var val = $feature.value;
if (val < 50) return [255, 0, 0, 255];
if (val < 100) return [255, 255, 0, 255];
return [0, 255, 0, 255];
`,
returnType: "Default"
}
}],
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
markerGraphics: [{
type: "CIMMarkerGraphic",
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
primitiveName: "fillLayer",
enable: true,
color: [128, 128, 128, 255] // Default
}]
}
}]
}]
}
};javascript
const dataDrivenCIM = {
type: "CIMSymbolReference",
primitiveOverrides: [{
type: "CIMPrimitiveOverride",
primitiveName: "fillLayer",
propertyName: "Color",
valueExpressionInfo: {
type: "CIMExpressionInfo",
expression: `
var val = $feature.value;
if (val < 50) return [255, 0, 0, 255];
if (val < 100) return [255, 255, 0, 255];
return [0, 255, 0, 255];
`,
returnType: "Default"
}
}],
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
markerGraphics: [{
type: "CIMMarkerGraphic",
symbol: {
type: "CIMPolygonSymbol",
symbolLayers: [{
type: "CIMSolidFill",
primitiveName: "fillLayer",
enable: true,
color: [128, 128, 128, 255] // 默认颜色
}]
}
}]
}]
}
};Size from Attribute
基于属性的大小设置
javascript
primitiveOverrides: [{
type: "CIMPrimitiveOverride",
primitiveName: "mainMarker",
propertyName: "Size",
valueExpressionInfo: {
type: "CIMExpressionInfo",
expression: "Sqrt($feature.population) * 0.01",
returnType: "Default"
}
}]javascript
primitiveOverrides: [{
type: "CIMPrimitiveOverride",
primitiveName: "mainMarker",
propertyName: "Size",
valueExpressionInfo: {
type: "CIMExpressionInfo",
expression: "Sqrt($feature.population) * 0.01",
returnType: "Default"
}
}]Common CIM Properties
常见CIM属性
Colors
颜色设置
javascript
// RGBA array [R, G, B, A] where each value is 0-255
color: [255, 0, 0, 255] // Red, fully opaque
color: [0, 0, 255, 128] // Blue, 50% transparentjavascript
// RGBA数组 [R, G, B, A],每个值范围0-255
color: [255, 0, 0, 255] // 红色,完全不透明
color: [0, 0, 255, 128] // 蓝色,50%透明度Stroke Properties
描边属性
javascript
{
type: "CIMSolidStroke",
enable: true,
width: 2,
color: [0, 0, 0, 255],
capStyle: "Round", // Butt, Round, Square
joinStyle: "Round", // Bevel, Miter, Round
miterLimit: 10
}javascript
{
type: "CIMSolidStroke",
enable: true,
width: 2,
color: [0, 0, 0, 255],
capStyle: "Round", // 平头、圆头、方头
joinStyle: "Round", // 斜接、圆角、斜切
miterLimit: 10
}Anchor Points
锚点设置
javascript
{
anchorPoint: { x: 0, y: 0 }, // Center
anchorPoint: { x: 0, y: -0.5 }, // Bottom center
anchorPointUnits: "Relative" // Relative or Absolute
}javascript
{
anchorPoint: { x: 0, y: 0 }, // 中心
anchorPoint: { x: 0, y: -0.5 }, // 底部中心
anchorPointUnits: "Relative" // 相对单位或绝对单位
}TypeScript Usage
TypeScript 使用方法
CIM symbols are plain objects by design (following CIM specification). For TypeScript safety, use or type annotations:
as constCIM符号本质是遵循CIM规范的普通对象。为了在TypeScript中保证类型安全,可以使用或类型注解:
as constUsing as const
as const使用as const
as consttypescript
const cimSymbol = {
type: "cim",
data: {
type: "CIMSymbolReference",
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
enable: true,
size: 20,
// ... rest of symbol definition
}]
}
}
} as const;typescript
const cimSymbol = {
type: "cim",
data: {
type: "CIMSymbolReference",
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
enable: true,
size: 20,
// ... 剩余符号定义
}]
}
}
} as const;Using Type Annotation
使用类型注解
typescript
const cimSymbol: __esri.CIMSymbolProperties = {
type: "cim",
data: {
type: "CIMSymbolReference",
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
enable: true,
size: 20,
// ... rest of symbol definition
}]
}
}
};Note: CIM symbols are configuration objects and work well with autocasting. Useto keep discriminated union types narrow in TypeScript. See arcgis-core-maps skill for detailed guidance on autocasting.as const
typescript
const cimSymbol: __esri.CIMSymbolProperties = {
type: "cim",
data: {
type: "CIMSymbolReference",
symbol: {
type: "CIMPointSymbol",
symbolLayers: [{
type: "CIMVectorMarker",
enable: true,
size: 20,
// ... 剩余符号定义
}]
}
}
};注意: CIM符号是配置对象,可与autocasting完美配合。在TypeScript中使用可缩小判别联合类型的范围。有关autocasting的详细说明,请参阅arcgis-core-maps 技能。as const
Common Pitfalls
常见误区
-
Frame coordinates: Frame defines the coordinate space for marker graphics
-
Layer order: Symbol layers render bottom to top in the array
-
Primitive names: Must be unique within symbol for overrides to work
-
Color format: Always use [R, G, B, A] with values 0-255
-
Geometry rings: Rings must be closed (first point = last point)
-
帧坐标:帧用于定义标记图形的坐标空间
-
图层顺序:符号图层在数组中按照从下到上的顺序渲染
-
Primitive名称:符号内的Primitive名称必须唯一,否则覆盖设置无法生效
-
颜色格式:必须使用[R, G, B, A]格式,每个值范围0-255
-
几何图形环:环必须闭合(第一个点与最后一个点重合)