问题
问题是iD编辑器中新加入的功能,负责对制作的要素进行输入检查。检查可以是针对几何也可以是针对属性。检查代码通过js实现,并没有调用后台数据,因此只能在页面加载范围内进行检查。新版本中引入KeepRight和ImproveOSM处理后台质检,在这里不做叙述。
如何添加问题
问题检查项目录为modules/validations
如添加新的检查内容可新建js文件放在此目录中并添加到index.js
export { validationWarning } from './test_warning';
export { validationError } from './test_error';
问题代码结构
export function validationXXXX(context) {
var validation = function checkXXXX(entity, graph) {
// 检查要素,生成检查结果
};
validation.type = 'test_warning';
return validation;
}
问题属性
- type
required - name of rule that created the issue (e.g. ‘missing_tag’)
问题类型,自定义,需要在字典中使用。 - subtype
optional - category of the issue within the type (e.g. ‘relation_type’ under ‘missing_tag’)
问题子类型,自定义,如果有在字典中使用。 - severity
required - ‘warning’ or ‘error’
问题级别,分为warning和error两个级别。warning为警告可以忽略继续保存,error为错误,无法保存。 - message
required - function returning localized string
显示错误信息,需要在字典中使用。显示位置如图:
- reference
optional - function(selection) to render reference information
参考信息,点击信息按钮时显示的错误描述。如图:
- entityIds
optional - array of IDs of entities involved in the issue
问题涉及的要素ID数组 - loc
optional - [lon, lat] to zoom in on to see the issue
查看问题是坐标定位 - data
optional - object containing extra data for the fixes
具体用法有待调查 - dynamicFixes
optional - function(context) returning fixes
修复问题方法。warning默认带有忽略方法。如图:
代码示例
// 这是一段问题检查示例
export function validationWarning(context) {
var validation = function checkWarning(entity, graph) {
// 在这里进行数据检查,如果没有问题则返回空数组(return [])
if (entity.type === 'node') return [];
// 如果检查有问题则返回问题数组,数组对象为validationIssue
return [new validationIssue({
type: 'test_warning', // 自定义问题类型
subtype: 'any', // 自定义问题子类型
severity: 'warning', // 错误级别【warning 或 error】
message: function(context) {
var entity = context.hasEntity(this.entityIds[0]);
return entity ? t('issues.test_warning.any.message', {
feature: utilDisplayLabel(entity, context)
}) : ''; // 【issues.test_warning.any.message】在字典中替换本地化文字,feature替换参数。
},
reference: showReference, // 错误描述
entityIds: [entity.id], // 涉及的要素id
dynamicFixes: function(context) {
var fixes = []; // 修复方法数组
// 选择要素类型
fixes.push(new validationIssueFix({
icon: 'iD-icon-search',
title: t('issues.fix.select_preset.title'),
onClick: function(context) {
context.ui().sidebar.showPresetList();
}
}));
// 删除此要素
// 直接使用了删除要素operation
var deleteOnClick;
var id = this.entityIds[0];
var operation = operationDelete([id], context);
var disabledReasonID = operation.disabled();
if (!disabledReasonID) {
deleteOnClick = function(context) {
var id = this.issue.entityIds[0];
var operation = operationDelete([id], context);
if (!operation.disabled()) {
operation();
}
};
}
fixes.push(
new validationIssueFix({
icon: 'iD-operation-delete',
title: t('issues.fix.delete_feature.title'),
disabledReason: disabledReasonID ? t('operations.delete.' + disabledReasonID + '.single') : undefined,
onClick: deleteOnClick
})
);
return fixes;
}
})];
function showReference(selection) {
selection.selectAll('.issue-reference')
.data([0])
.enter()
.append('div')
.attr('class', 'issue-reference')
.text(t('issues.test_warning.reference')); // 【issues.test_warning.reference】在字典中替换本地化文字
}
};
// 自定义问题类型
validation.type = 'test_warning';
return validation;
}
字典
"test_warning": {
"title": "警告错误",
"tip": "测试警告错误用法",
"reference": "道路有一个警告错误。",
"any": {
"message": "{feature} 有一个警告错误any"
},
"descriptive": {
"message": "{feature} 有一个警告错误descriptive"
},
"relation_type": {
"message": "{feature} 有一个警告错误的关系"
}
}
- title
问题检查名称
- tip
问题检查描述