• ArcGIS开发篇(2)——如何将Graphics以shp格式输出到本地?


        在网页端实现将Graphics以shp格式输出到本地,有幸google到了一点思路:

    • 博客1:http://blog.roktech.net/blog/downloading-user-generated-graphics
    • 博客2:https://nordpil.com/blog/js2shapefile/
    • 讨论1:https://gis.stackexchange.com/questions/77109/json-to-shapefile-in-javascript

        分析:

    • 创建GP服务,属性字段是固定的,无法再添加;
    • js2shapefile是比较合适的,但网上直接下载的源码并不支持中文,且字段格式是用typeof确定,并不科学;
    • 最终决定对js2shapefile源码做适当修改。

        完善:

      (1)中文编码

        源代码中对字符串使用charCodeAt()方法,读取该字符的Unicode编码,使用setUint8写入1个字节。

                                if (dataType == "C" || dataType == "") {
                                    if (fieldLength == 0) {
                                        continue;
                                    }
                                    if (typeof(attValue) !== "string") {
                                        // just in case a rogue number has got in...
                                        attValue = attValue.toString();
                                    }
                                    if (attValue.length < fieldLength) {
                                        attValue = attValue.rpad(" ", fieldLength);
                                    }
                                    // doesn't matter if it's too long as we will only write fieldLength bytes
                                    for (var writeByte = 0; writeByte < fieldLength; writeByte++) {
                                        dbfDataView.setUint8(currentOffset, attValue.charCodeAt(writeByte));
                                        currentOffset += 1;
                                    }
                                }
    View Code

        charCodeAt()方法可以读取字符的 Unicode 编码,返回值是 0 - 65535 之间的整数,但setUint8明显是不合理的,对中文并不适用。

        此外,通过由ArcGIS保存的SHP中的dbf文件,通过小程序读取字节,发现在dbf中采用的是UTF-8。unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节。具体可参考http://www.cnblogs.com/yuguangchuan/p/4310952.html。

        参考http://www.jb51.net/article/87418.htm,最终修改如下:

                                        var index = 0;
                                        for (var writeByte = 0; writeByte < attValue.length; ) { 
                                            var result = writeUTF(attValue[index]); // => [0, 3, 228, 184, 173] 
                                            //currentOffset += result[1];
                                            for (var codeIndex = 0; codeIndex < result[1]; codeIndex++) {
                                                dbfDataView.setUint8(currentOffset, result[2 + codeIndex]);
                                                currentOffset += 1;
                                                writeByte++;
                                            }
                                            index++;
                                        }
                                    }
    View Code

      (2)字段类型

        修改switch (typeof (attvalue))部分,由用户自定义类型allAttributes。基本四种类型如下:

                // 遍历字段组合,构建dbf所需要的对象
                var allAttributes = {};
                $.each(me._fieldNames, function (index, field) {
                    var type = field.fieldType;
                    var attribute = field.fieldName;
                    switch (type) {
                        case "INT":
                            allAttributes[attribute] = {
                                type: 'N',
                                length: 18
                            }
                            break;
                        case "DOUBLE":
                            allAttributes[attribute] = {
                                type: 'N',
                                length: 18,
                                scale: 8
                            }
                            break;
                        case "DATE":
                            allAttributes[attribute] = {
                                type: 'D'
                            }
                            break;
                        case "STRING":
                            allAttributes[attribute] = {
                                type: "C",
                                length: 254
                            }
                            break;
                    };
                });
    View Code

      完善这两点后,基本可以得到想要的结果。

  • 相关阅读:
    java将文件夹md5为名的图片与数据库查询对应md5后导入相应图片到某分类下
    java 导入图片时忘了导入诊断报告,查询报告并将缺失的报告插入对应分类图片中
    安装nginx
    python,opencv,8位图转24位图
    python 笔记
    python,opencv图像增强
    问卷星的使用教程
    考研数据结构复习随笔-基本概念(一)
    按字寻址 按字节寻址
    在数据结构中用顺序栈解决括号匹配问题
  • 原文地址:https://www.cnblogs.com/mcwym/p/7219222.html
Copyright © 2020-2023  润新知