工程 JSON

工程通常需要在 ArcGIS QuickCapture 设计器中使用图形界面进行配置,但您也可以更改工程的 JSON 代码。

在编辑工程的 JSON 时,可以修改以下属性:

  • basemap - 在查看数据时显示的地图。
  • dataSources - 可列出工程中由按钮使用的要素图层。
  • preferences - 适用于工程中捕获的所有记录。
  • templateGroups - 表示一组按钮。
  • templates - 表示一个按钮。
    • cameraInfo - 为记录捕获照片和视频的方式。
    • captureInfo - 选择某按钮时捕获数据的方式。 配置为捕获后显示地图(用于位置编辑)并自定义出现在地图页面上的显示文本和提示。
    • displayInfo - 按钮的外观。
    • fieldInfos - 将为记录捕获的属性值。
  • tracking - 表示工程使用的位置共享图层。
  • userInput - 用户提供的字符串,可用于填充记录的属性。

其中一些属性是其他属性的数组。 以下几个小节将描述属性数组的详细信息。

底图

默认情况下,新工程的地图将与组织的默认底图匹配。 使用组织账户登录应用程序后,用户可以在该工程中查看当前默认组织底图。 如果用户已退出应用程序,则将显示 Esri 世界地形图。

以下属性用于标识要在工程中使用的地图:

属性描述字段类型
type

WebMap、MMPK、VTPK 或 TPK。 如果为 null,则将使用 Esri 世界地形图。

字符串

itemId

地图的项目 ID。

字符串

useDefaultBasemap

True(默认)或 False。

布尔

工程作者可以通过选择自己选择的在线或离线地图来覆盖默认行为。 如果将 useDefaultBasemap 设置为 false 并且 itemId 为 null,则该工程将使用 Esri 世界地形图。

以下示例显示了一个必需的 Web 地图,该地图仅可供下载它的用户使用:

{
   "basemap":{
      "type":"WebMap",
      "itemId":fae788aa91e54244b161b59725dcbb2a,
      "useDefaultBasemap":false,
      "required":true,
      "zoomLevel":null
   }
}

要向用户显示工程中地图上先前提交的数据,可以配置一个包含工程数据的 web 地图,并将其命名为底图。

  • Web 地图至少应包含与工程相同的图层。 也可以包括其他图层。
  • Web 地图中所定义的符号系统将用于符号化已发送的要素。
  • 在设备上捕获的尚未发送的数据将使用默认 QuickCapture 符号系统来进行符号化。 例如,点将使用蓝色标记进行符号化。

注:

仅支持使用 Web 墨卡托空间参考的地图。

数据源

以下属性用于标识工程中的要素图层:

属性描述字段类型
dataSourceId

QuickCapture 分配至此工程的唯一编号,用于标识数组中的此图层。 这不是要素服务中图层的索引。 一个工程可具有来自不同要素服务的多个图层。

整型

featureServiceItemId

包含此图层的要素服务的项目 ID。

字符串

URL

要素图层 REST 端点的 URL (…/FeatureServer/0)。 该 URL 必须包括指向图层索引的完整 URL。

字符串

可以在 dataSource 属性中列出一个或多个数据源。 以下示例中列出了来自不同要素服务的两个图层:

{
   "basemap":{

   },
   "dataSources":[
      {
         "featureServiceItemId":"1f683747c06c4a7e9843a477b2ab41e0",
         "dataSourceId":0,
         "url":"https://services1.arcgis.com/e7dVfn25KpfE6dDd/arcgis/rest/services/LayerOne/FeatureServer/0"
      },
      {
         "featureServiceItemId":"2b313747c06c4a7e9843a477b2ab41e0",
         "dataSourceId":1,
         "url":"https://services1.arcgis.com/b45KpfE6dEf121/arcgis/rest/services/LayerTwo/FeatureServer/1"
      }
   ],
   "itemId":"",
   "preferences":{

   },
   "templateGroups":[

   ],
   "userInputs":[

   ],
   "version":""
}

首选项

以下属性适用于工程或工程中捕获的所有记录:

属性描述字段类型
backgroundColor

将背景颜色投影以 HTML 十六进制值表示。

字符串

splitScreen

并排显示按钮和地图。

布尔

horizontalAccuracyWarning

用于定义建议阈值的十进制值(以米为单位),超过该阈值即表示水平精度不再足够。 可将其用于更改工程页面上的水平精度显示颜色。 此属性可接受的最大值为 999 米。

十进制

horizontalAccuracyError

用于定义所需阈值的十进制值(以米为单位),超过该阈值即表示水平精度不再足够。 可将其用于防止用户在未达到阈值的情况下捕获记录或折点。 此属性可接受的最大值为 999 米。

十进制

allowEditLocation

在捕获后的有限时间内允许更新点的位置。

布尔

distanceThreshold

在可以捕获新的折点或点之前,与捕获的最后一个折点或点之间的最小移动距离(以米为单位)。 默认距离为 10 米。

十进制

undoThreshold

捕获完成后可用于删除记录或更新记录位置的时间(以秒为单位)。

十进制

adminEmail

指定由移动应用程序生成的数据恢复文件的接收者。

字符串

coordinateNotationFormat

设置在移动应用程序中显示的工程坐标记法格式。支持的值包括 UTM、USNG、MGRS、DD、DDM 和 DMS。 默认值为 DD。

双精度

尽管可以为 horizontalAccuracyWarninghorizontalAccuracyError 设置阈值,但 horizontalAccuracyWarning 值必须始终小于误差。 例如,如果将建议水平精度设置为 10 米,并将所需水平精度设置为 30 米,则在设备返回 20 米的精度时,系统会发出警告。 如果设备返回的精度为 40 米,您将无法捕获记录。

以下示例将显示设置为灰色背景、建议水平精度为 10 米、没有距离阈值且管理员电子邮件地址为 quickcapture@esri.com 的首选项:

{
   "basemap":{

   },
   "dataSources":[

   ],
   "itemId":"",
   "preferences":{
      "splitScreen":false,
      "backgroundColor":"#f3f3f4",
      "horizontalAccuracyError":null,
      "horizontalAccuracyWarning":10,
      "distanceThreshold":null,
      "undoThreshold":10,
      "adminEmail":"quickcapture@esri.com"
   },
   "templateGroups":[

   ],
   "userInputs":[

   ],
   "version":""
}
注:

十进制值必须使用句点作为小数分隔符,并且不应使用千位分隔符。 JSON 编辑器不接受逗号。

模板组

以下属性用于定义如何在工程中显示一组按钮。 每组按钮可以使用不同的属性。

属性描述字段类型
name

组的名称。

字符串

label

工程中为该组显示的标注。

字符串

columns

组中的列数。

整型

columnSpacing

列之间的间距。

十进制

rowSpacing

行之间的间距。

十进制

backgroundColor

组的背景颜色,以 HTML 十六进制值表示。

字符串

outlineColor

组的轮廓颜色,以 HTML 十六进制值表示。

字符串

expanded

默认值为 true。

布尔

labelColor

组标注的颜色,以 HTML 十六进制值表示。

字符串

模板

以下属性用于标识与按钮相关的要素图层:

属性描述字段类型
id

按钮的 UUID。

文本

dataSourceId

引用存储数据的目标图层。 该 ID 将引用数据源数组中的数据源。

整型

captureInfo

以下属性描述了如何捕获数据:

属性描述字段类型
exclusivityGroup

用于定义专属组的值。 具有相同值的所有模板都将被分组,且专属属性设置为 true。 完成设置后,一次只有一个具有该值的按钮可以处于活动状态。

文本

type

esriGeometryPoint、esriGeometryPolyline 或 esriGeometryPolygon。

字符串

continuous

线和面始终为 true。

布尔

editMap

编辑地图的选项。 选择捕获后显示(默认值为 false)、自定义地图标题(默认值为 null)或自定义地图提示(默认值为 null)。

字符串

displayInfo

以下属性用于描述按钮的外观:

属性描述字段类型
label

按钮上的标注。

字符串

shape

矩形、圆角矩形或圆形。

字符串

size

小、中、大、特大、超大。

字符串

color

按钮背景的颜色,以 HTML 十六进制值表示。

字符串

outlineColor

按钮轮廓的颜色,以 HTML 十六进制值表示。

字符串

outlineWidth

按钮轮廓的宽度。

十进制

labelColor

按钮标注的颜色,以 HTML 十六进制值表示。

字符串

labelFontSize

按钮标注的字号。

整型

labelFontWeight

Bold 或 regular。

字符串

shadowColor

如果未提供任何值,则该应用程序将使用与组相同的 backgroundColor 值。 这意味着阴影将不可见。

字符串

image

将随按钮显示的 PNG、JPG 或 SVG 格式的图像。 所有图像都将作为项目的资源存储在图像文件夹中。

字符串

fieldInfos

以下属性用于描述将在点击按钮时输入到要素服务中的属性信息。 通常,工程作者将使用预定义的文本或字段变量来填充所采集记录的字段。

属性描述字段类型
fieldName

字段的名称。

字符串

value

可以包含本主题中列出的任何属性。

字符串

cameraInfo

以下属性用于描述如何在工程中捕获和保存照片或视频。 默认情况下,如果启用了按钮捕获照片功能,则始终需要提供照片。 可通过将 required 属性设置为 false 并将 minMedia 更改为 0,将照片捕获设置为可选。 还可以通过更改 imageSize 属性指定照片质量。 (视频默认最大长度为 10 秒。)

属性描述字段类型
mode

无(默认)- 没有照片或视频与该要素关联。

自动 - 选择按钮后,系统无需用户确认即可立即拍摄照片。

手动 - 将显示相机预览,且用户将控制照片的捕获。

字符串

imageSize

小(最长边 320 像素)、中(最长边 640 像素)、大(默认值,最长边 1280 像素)或无限制(无大小限制)。 如果通过应用程序调整图像大小,则将保持所捕获图像的纵横比。

字符串

required

True(默认)或 False。

布尔

captureVideo

True 或 False(默认)。

布尔

capturePhoto

True(默认)或 False。

布尔

maxMedia

一个按钮捕获的最大照片或视频数。 对于照片,上限为 5,对于视频,则为 1。

整型

minMedia

一个按钮捕获的最小照片或视频数。

整型

在以下示例中,无需预览确认即可拍摄无大小限制的可选照片。

{
   "cameraInfo": {
      "mode": "automatic",
      "imageSize": "unrestricted",
      "required": false,
      "captureVideo": false,
      "capturePhoto": true,
      "maxMedia": 1,
      "minMedia": 0
   },

notificationsInfo

以下属性用于在工程内配置通知。 当前,唯一受支持的通知是 webhook。

属性描述字段类型
id

Webhook 唯一 ID(在工程内)。

字符串

name

Webhook 名称。

字符串

active

True 或 False(默认)。

布尔

created

创建 webhook 的日期和时间。

日期

modified

上次修改 webhook 时的日期和时间。

日期

events

触发 webhook 的事件类型。 仅支持 addData 事件。

字符串

targetLayerUrl

已配置 webhook 的要素服务图层(包括图层索引)。 对此图层的更新将触发 addData 事件。

字符串

webhookUrl

负载将发送至此 webhook URL。

字符串

includePortalInfo

True(默认)或 False。

布尔

includeProjectInfo

True(默认)或 False。

布尔

includeServiceRequest

True(默认)或 False。

布尔

includeServiceResponse

True(默认)或 False。

布尔

在以下示例中,显示了单个 webhook,但是在单个工程中可以配置多个:

 "notificationsInfo": {
    "webhooks": [
      {
        "active": true,
        "created": 1502880915000,
        "events": [
          "addData"
        ],
        "id": "ByCjvHpPz",
        "includePortalInfo": true,
        "includeProjectInfo": true,
        "includeServiceRequest": true,
        "includeServiceResponse": true,
        "includeUserInfo": true,
        "modified": 1502881754000,
        "name": "Display name",
        "targetLayerUrl": "https://<serviceurl including layer index>",
        "webhookUrl": "https://<webhookserviceurl>"
      }
    ]
  }

字段变量

在 JSON 编辑器中使用这些变量时,必须按照 ${variable_name} 格式输入变量名称。 在以下示例中,将 username 变量分配至名为 NameOfUser 的字段:

"fieldInfos": [
 {
   "fieldName": "NameOfUser",
   "value": "${username}"
 },

用户输入变量

userInput 变量值将由应用程序用户填充,且可以应用于工程中的一个或多个按钮。 尽管将由应用程序用户输入该值;但是,工程作者必须对变量将应用到的按钮和字段进行定义。

在工程 JSON 中,用户输入先在 userInputs 数组中定义,然后通过 id 属性被 "fieldInfos" 引用。

属性描述字段类型
Id

用户输入的唯一 ID。

字符串

label

标注将显示在移动应用程序中,用于描述最终用户的预期输入值。 例如,标注可以是 RouteNo、CostCenter 或 RouteNo-CostCenter。

字符串

fieldType

可以写入用户输入值的字段类型。 选项限制为 esriFieldTypeStringesriFieldTypeDoubleesriFieldTypeInteger

字符串

required

指定在按下按钮之前(工程名称)或之后(按钮模式),是否必须由移动应用程序的最终用户来提供用户输入值。

布尔

domain

用于控制用户输入,且仅限于数值范围(范围)、预定义值 (codedValue) 列表或文本输入(还可选择使用输入掩码 (userDefined))。

字符串

mode

用于控制在启动工程(工程)或按下按钮(按钮)时系统是否提示用户输入。

字符串

multiline

允许输入多行文本。 仅当 domain 为 userDefined 时适用。

布尔

autoCompleteMaxEntries

指定为工程用户输入缓存的用户输入值的数量。

整型

showEvent

控制按钮用户输入对话框是在记录捕获的开始还是结束时显示。 选项包括 onStart 和 onEnd。 默认设置为 onEnd。 仅当 domain 为 userDefined 时适用。

字符串

showScanner

控制条形码扫描仪是否显示在用户输入中。 默认为 false。 仅当 domain 为 userDefined 时适用。

布尔

dateTime

控制日期和时间的输入。 仅当 domain 为 userDefined 时适用。 可以应用以下约束:defaultValue、displayTime、maxValue 和 minValue。

日期

要了解各种模式何时使用,请参阅工程用户输入变量按钮用户输入变量

建议在要素服务中管理属性域。 Web 设计器可直接从要素服务中读取属性域信息,用于创建用户输入。 属性域信息不会自动写入工程 JSON。

移动应用程序将直接从要素服务中读取属性域信息,并将其存储到本地设备上。 如果您在要素服务中添加或修改了属性域值,则需要在重新保存工程后,方可提示用户更新工程和查看更改。

警告:

工程作者可以选择直接使用工程 JSON 手动定义属性域信息。 此举将覆盖从要素服务读取的所有内容。 作者有责任确保所定义的任何值均在要素服务中定义的值的限制范围内。 例如,如果要从要素服务中更长的列表中定义工程中的编码值子集,则可以选择执行此操作。

以下示例显示了如何定义 range 属性域用户输入以将数据输入限制为 1 到 100 之间的数字:

{
   "userInputs":[
      {
         "autoCompleteMaxEntries":5,
         "id":"001",
         "label":"Enter route number",
         "fieldType":"esriFieldTypeInteger",
         "required":true,
         "mode":"project",
         "domain":{
            "type":"range",
            "name":"route no",
            "range":[
               1,
               100
            ]
         }
      }
   ]
}

以下示例显示了如何定义 codedValue 属性域用户输入以将数据输入限制为选择三个值之一:

{
   "userInputs":[
      {
         "autoCompleteMaxEntries":5,
         "id":"001",
         "label":"Enter class",
         "fieldType":"esriFieldTypeString",
         "required":true,
         "mode":"project",
         "domain":{
            "type":"codedValue",
            "name":"Class",
            "codedValues":[
               {
                  "name":"Principle",
                  "code":"Principle"
               },
               {
                  "name":"Classified (Non-principle)",
                  "code":"Classified"
               },
               {
                  "name":"Unclassified",
                  "code":"Unclassified"
               }
            ]
         }
      }
   ]
}

以下示例显示了如何定义 userDefined 属性域用户输入以允许在开始捕获行时扫描 QR 码:

{
   "userInputs":[
      {
         "id":"001",
         "label":"Scan QR code",
         "fieldType":"esriFieldTypeString",
         "required":true,
         "mode":"button",
         "domain":{
            "type":"userDefined",
            "name":"line identifier",
            "multiline":false,
            "showScanner":true,
            "showEvent":"onStart"
            "hint":"Scan QR code or type the identifier of the line to be captured"
         }
      }
   ]
}

以下示例显示了如何定义 userDefined 属性域用户输入以将日期数据输入限制为 2022 年 6 月到 12 月之间的日期:

{
   "userInputs":[
      {
         "id":"001",
         "label":"Enter date",
         "fieldType":"esriFieldTypeDate",
         "required":true,
         "mode":"button",
         "domain":{
            "type":"userDefined",
            "name":"followup date",
            "multiline":false,
            "hint":"Enter date between June and December 2022",
            "dateTime": {
               "defaultValue": "${captureTime}",
               "displayTime": true,
               "maxValue": "2022-06-01T00:00:00.000Z",
               "minValue": "2022-12-31T24:59:00.000Z"
            }
         }
      }
   ]
}

以下示例显示了如何定义 userDefined 属性域用户输入以将数据输入限制为四位数的路径 ID:

{
   "userInputs":[
      {
         "id":"001",
         "label":"Enter route number",
         "fieldType":"esriFieldTypeString",
         "required":true,
         "mode":"button",
         "domain":{
            "type":"userDefined",
            "name":"route no",
            "inputMask":"9999",
            "multiline":false,
            "hint":"Enter a four digit route id"
         }
      }
   ]
}

一旦定义了 userInput,工程作者即可将其分配为在字段中使用。 以下显示了 ID 为 001 的 userInput,用于填充名为 routeNo 的字段:

{
   "fieldInfos":[
      {
         "fieldName":"routeNo",
         "value":"${userInput:001}"
      }
   ]
}

输入掩码

输入掩膜通过将字符和符号用作用户输入变量的一部分来定义数据输入的格式。 如果将输入掩膜应用到用户输入变量,则用户输入的值必须遵照由输入掩膜定义的特定模式。

要将输入掩膜应用到用户输入变量,需要在 userInputs.domain.inputMask 属性中定义掩膜。

有关可应用于用户输入变量的所有掩码和示例的列表,请参阅输入掩码

位置共享

以下属性用于标识位置共享图层:

属性描述字段类型
enabled

为工程启用追踪。 默认为 false。

布尔

required

使用此工程需要启用追踪。 默认为 false。

布尔

lastKnownLocationsUpdateInterval

更新最后已知位置图层的频率(以秒为单位)。 默认值为 60 秒。 最小值为 5 秒。

十进制

tracksUploadInterval

更新轨迹图层的频率(以秒为单位)。 默认值为 -1(关闭)。 或者,可以将其设置为 600 秒。

十进制

tracksCategory

定义要写入轨迹图层的类别字段的值。 它可以是工程名称、固定值或工程用户输入的值。 默认设置为工程名称。

文本

lastKnownLocationsCategory

定义要写入最后已知位置图层的类别字段的值 它可以是工程名称、固定值或工程用户输入的值。 默认设置为工程名称。

文本

以下示例显示已启用位置共享,但位置共享并非使用工程所必需的选项。 最后已知位置每 60 秒更新一次,轨迹每 600 秒更新一次。 工程名称将写入最后已知位置图层和轨迹图层的类别字段。

{
   "tracking": {
      "enabled": true,
      "required": false,
      "lastKnownLocationsUpdateInterval": 60,
      "tracksUploadInterval": 600,
      "tracksCategory": "${projectName}",
      "lastKnownLocationsCategory": "${projectName}"
   }
}