免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 1223|回复: 5
收起左侧

【WalkLan】隐去GIS成果中的敏感信息——一种简捷有效的方法

[复制链接]

185

主题

2898

铜板

13

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2398
发表于 2012-7-31 09:29 | 显示全部楼层 |阅读模式
在GIS成果演示样例(如图件、ppt、数据样例)中,对文字或属性加随机噪声,隐去敏感信息。如,宗地图中的权利人。
这里给出的脚本例子采用随机产生常用字,隔字替换。使得加了噪声的Walk的文字标注看起来有些意义,又不同于原来的意义。这样在发布成果(如图片)时,上面的文字便隐去了敏感信息。
//112个常用姓氏
string FstNames = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔\
曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳\
酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平\
黄和穆萧尹姚邵堪汪祁毛禹狄米贝明臧";
string RandWord()
{
        int k = random() % (FstNames.getLength()/2);
        return FstNames.mid(k*2, 2);
}
void ResetText(string &t)
{
        for (int rp=0, i=0; i<t.getLength(); i++)
        {
                int i0 = ord(t.mid(i, 1));
                if (i0>127 || i0<0)//汉字
                {
                        if ((rp%2)==0)//隔个汉字进行替换
                                t=t.left(i)+RandWord()+t.mid(i+2);
                        i++; rp++;
                }
        }
}
//对可编层的文字进行处理
void main()
{
        wkGeoset geoset;
        wkLayer layer = geoset.getEditableLayer();
        randomize();
        int ac = layer.getAnnotationCount();
        for (int a=0; a<ac; a++)
        {
                wkAnnotation an = layer.getAnnotationAt(a);
                if (an.isDib())
                        continue;
                string text = an.getText();
                ResetText(text);
                an.setText(text);
                an.setModified(true);
        }
}
下面是测试例子(一个测试用 main() 函数)
void main()
{
        randomize();
        string text = "中国浙江省杭州市浙江大学";
        ResetText(text);
        message(text); //加了随机噪声后,text可能是:"于国褚江吴杭姜市章江卫学"
}

185

主题

2898

铜板

13

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2398
 楼主| 发表于 2012-7-31 09:29 | 显示全部楼层
若要求只处理某一类文字(如仅处理式样为宗地权利人的文字,下例中的"2006010200"),void main() 函数,以及附加函数如下:

array GetStyleIds(wkLayer layer, string styleName)
{
        array ids;
        for (int i=0; i<layer.getStyleCount(); i++)
        {
                wkStyle style = layer.getStyleAt(i);
                if (style.getName().find(styleName)>=0)
                        ids.add(style.getId());
        }
}
bool InArray(int id, array &ids)
{
        for (int ii=0; ii<ids.getSize(); ii++)
                if (id == ids[ii])
                        return true;
        return false;
}
void main()
{
        randomize();
        wkGeoset geoset;
        wkView view;
        wkLayer layer = geoset.getEditableLayer();
        if (0==layer.handle())
        {
                message("请置去文字信息化的层为可编");
                return;
        }
        //==== 按式样过滤文字
        string keepStyle = "2006010200";
        array ids = GetStyleIds(layer, keepStyle);
        //====
        int ac = layer.getAnnotationCount();
        for (int a=0; a<ac; a++)
        {
                wkAnnotation an = layer.getAnnotationAt(a);
                if (an.isDib())
                        continue;
                //==== 按式样过滤文字
                if (ids.getSize() && !InArray(an.getStyleId(), ids))
                        continue;
                //====
                string text = an.getText();
                ResetText(text);
                an.setText(text);
                an.setModified(true);
        }
}

回复 支持 反对

使用道具 举报

2

主题

1934

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
291
发表于 2012-7-31 14:52 | 显示全部楼层
多谢共享,学习了
回复 支持 反对

使用道具 举报

185

主题

2898

铜板

13

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2398
 楼主| 发表于 2012-7-31 15:13 | 显示全部楼层
风云大叔 发表于 2012-7-31 14:52
多谢共享,学习了

多谢支持哦!!!
回复 支持 反对

使用道具 举报

6

主题

1万

铜板

20

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2988
发表于 2021-5-16 10:39 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

6

主题

1万

铜板

20

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2988
发表于 2021-5-16 10:40 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表