ansel0926
2022-05-18 f0efddd9e32b9c5dc828401c4092be004b4826cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
define([
    "ThirdParty/shapefile-js-3.3.2/shp",
    "ThirdParty/geojson-topojson/lib",
    'File'
], function (
    shp,
    topojson,
    FileExtend
) {
    /**
    * 提供shapefile格式矢量文件解析相关工具
    *@class  shp
    *@memberof MeteoLib.Util
    */
 
    /**
     *
     *@param {Array.<File>}files
     *@return {Object}
     * @method 
     * @name groupFiles
     * @static
     * @memberof MeteoLib.Util.shp
     */
    shp.groupFiles = function (files) {
        var shpFile, dbfFile, prjFile;
        var group = {};
        for (var i = 0; i < files.length; i++) {
            var name = Path.ChangeExtension(files[i].name, "");
            if (!group[name]) {
                group[name] = [];
            }
            group[name].push(files[i]);
        }
        return group;
    }
    /**
    *
    * @param {Array<File>}files
    * @param {Boolean}[toTopojson=false]
    * @method 
    * @name parseShpFiles
    * @static
    * @memberof MeteoLib.Util.shp
    */
 
    shp.parseShpFiles = function (files, toTopojson) {
        if (!files || files.length > 0) {
            var promise = Cesium.when.defer();
 
            var shpFile, dbfFile, prjFile;
            for (var i = 0; i < files.length; i++) {
                if (files[i].name.toLocaleLowerCase().indexOf(".shp") > 0) {
                    shpFile = files[i];
                }
                if (files[i].name.toLocaleLowerCase().indexOf(".prj") > 0) {
                    prjFile = files[i];
                }
                if (files[i].name.toLocaleLowerCase().indexOf(".dbf") > 0) {
                    dbfFile = files[i];
                }
            }
            if (!shpFile || !prjFile || !dbfFile) {
                throw new Error("打开文件失败,请通过ctrl+同时选择shp、prj、dbf三个文件");
                return;
            }
            var readPromises = [
                File.readAsArrayBuffer(shpFile),
                File.readAsText(prjFile),
                File.readAsArrayBuffer(dbfFile)
            ];
            Cesium.when.all(readPromises, function (buffers) {
                var shpBuffer = buffers[0];
                var prjBuffer = buffers[1];
                var dbfBuffer = buffers[2];
 
                var parsed = shp.combine([shp.parseShp(shpBuffer, prjBuffer), shp.parseDbf(dbfBuffer)]);
                parsed.fileName = shpFile.name.toLocaleLowerCase();
                if (toTopojson) {
                    parsed = topojson.topology({
                        collection: parsed
                    }, {
                        "property-transform": function (obj, name, value) {
                            obj[name] = value;
                            return obj;
                        }
                    });
                    parsed.fileName = shpFile.name.toLocaleLowerCase();
                }
                promise.resolve(parsed);
 
            }, function (err) {
                promise.reject(err);
            });
 
            return promise;
        } else {
            throw new Error("文件列表不能为空");
        }
    }
 
    return shp;
})