iD学习 - 问题

问题

问题是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;
}

问题属性

  1. type
    required - name of rule that created the issue (e.g. ‘missing_tag’)
    问题类型,自定义,需要在字典中使用。
  2. subtype
    optional - category of the issue within the type (e.g. ‘relation_type’ under ‘missing_tag’)
    问题子类型,自定义,如果有在字典中使用。
  3. severity
    required - ‘warning’ or ‘error’
    问题级别,分为warning和error两个级别。warning为警告可以忽略继续保存,error为错误,无法保存。
  4. message
    required - function returning localized string
    显示错误信息,需要在字典中使用。显示位置如图:
    message显示位置
  5. reference
    optional - function(selection) to render reference information
    参考信息,点击信息按钮时显示的错误描述。如图:
    错误参考信息
  6. entityIds
    optional - array of IDs of entities involved in the issue
    问题涉及的要素ID数组
  7. loc
    optional - [lon, lat] to zoom in on to see the issue
    查看问题是坐标定位
  8. data
    optional - object containing extra data for the fixes
    具体用法有待调查
  9. 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} 有一个警告错误的关系"
                }
            }
  1. title
    问题检查名称
    title
  2. tip
    问题检查描述
    tip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值