├── .gitignore ├── LICENSE ├── README.md ├── configs ├── tsconfigDev.json ├── tsconfigProd.json ├── typedoc.js ├── webpack.config.dev.js ├── webpack.config.js └── webpack.config.prod.js ├── dist ├── assets │ └── data │ │ └── mall.1.json ├── index.html ├── main.js └── main.js.map ├── docs ├── assets │ ├── css │ │ ├── main.css │ │ └── main.css.map │ ├── images │ │ ├── icons.png │ │ ├── icons@2x.png │ │ ├── widgets.png │ │ └── widgets@2x.png │ └── js │ │ ├── main.js │ │ └── search.js ├── classes │ ├── _base_floor_.floor.html │ ├── _base_indoormap3d_.indoormap3d.html │ ├── _base_indoormap_.indoormap.html │ ├── _base_label_.label.html │ ├── _base_mall_.mall.html │ ├── _base_rect_.rect.html │ ├── _base_room_.room.html │ ├── _base_system_.system.html │ ├── _base_theme_.theme.html │ ├── _data_geojson_.geojson.html │ ├── _data_geometry_.geometry.html │ ├── _data_properties_.properties.html │ ├── _theme_default2dtheme_.default2dtheme.html │ ├── _theme_default3dtheme_.default3dtheme.html │ ├── _utils_dataparse_.dataparse.html │ ├── _utils_detector_.detector.html │ ├── _utils_domutil_.domutil.html │ ├── _utils_geomutil_.geomutil.html │ ├── _utils_indoormaploader_.indoormaploader.html │ └── _utils_parsemodel_.parsemodel.html ├── enums │ └── _data_type_.type.html ├── globals.html ├── index.html └── modules │ ├── _base_floor_.html │ ├── _base_indoormap3d_.html │ ├── _base_indoormap_.html │ ├── _base_label_.html │ ├── _base_mall_.html │ ├── _base_rect_.html │ ├── _base_room_.html │ ├── _base_system_.html │ ├── _base_theme_.html │ ├── _data_data_.html │ ├── _data_geojson_.html │ ├── _data_geometry_.html │ ├── _data_parsegeojson_.html │ ├── _data_properties_.html │ ├── _data_type_.html │ ├── _index_.html │ ├── _theme_default2dtheme_.html │ ├── _theme_default3dtheme_.html │ ├── _utils_browser_.html │ ├── _utils_dataparse_.html │ ├── _utils_detector_.html │ ├── _utils_domutil_.html │ ├── _utils_geomutil_.html │ ├── _utils_indoormaploader_.html │ └── _utils_parsemodel_.html ├── geojson ├── test.json └── 备份.json ├── package.json ├── src ├── GeoJson │ ├── DrawGeoJson.ts │ ├── Feature.ts │ ├── GeoJSON.ts │ ├── Geometry.ts │ ├── ParseGeoJson.ts │ ├── Properties.ts │ └── TYPE.ts ├── assets │ ├── css │ │ └── indoor3D.css │ ├── data │ │ ├── mall.json │ │ ├── testMapData.json │ │ ├── 北京-7-侨福芳草地购物中心.json │ │ └── 深圳-437-港隆城购物中心.json │ └── img │ │ ├── ATM.png │ │ ├── default-point.png │ │ ├── entry.png │ │ ├── escalator.png │ │ ├── indoor_floor_normal.png │ │ ├── lift.png │ │ ├── marker.png │ │ ├── stair.png │ │ └── toilet.png ├── base │ ├── Box.ts │ ├── ImParam.ts │ ├── IndoorMap.ts │ ├── IndoorScence.ts │ ├── Mall.ts │ └── Room.ts ├── index.html ├── index.ts ├── themes │ └── DefaultTheme.ts ├── three │ └── OrbitControls.js └── utils │ ├── Browser.ts │ ├── DataParse.ts │ ├── Detector.ts │ ├── DomUtil.ts │ ├── GeomUtil.ts │ └── System.ts └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | /.git/ 2 | /node_modules/ 3 | /package-lock.json 4 | ./structure.vsdx -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 我是孙悟空 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 项目没有继续维护了,感兴趣的同学可以关注公众号,或者私信作者添加协作成员,一起贡献代码。作者可以提供技术指导!!! 2 | ![qrcode_for_gh_3695c3ae18f4_258](https://user-images.githubusercontent.com/16789187/223009954-4e0214b8-0c10-4dde-8171-3ff5435d5004.jpg) 3 | 4 | # Indoor-Map 5 | 6 | 7 | 8 | 使用[Indoor-Map-Draw](https://github.com/WoShiSunWuKong/Indoor-Map-Draw) 这个工具来绘制楼宇房屋的坐标,坐标文件用geojson格式来保存 9 | 10 | ### 用法 11 | 把代码拉下来 12 | ``` 13 | 执行npm install 安装依赖文件 14 | ``` 15 | 16 | ``` 17 | 安装好之后,运行 npm start 18 | ``` 19 | 20 | ``` 21 | 编译好后,浏览器会自动打开demo 22 | ``` 23 | -------------------------------------------------------------------------------- /configs/tsconfigDev.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "../types/", 4 | "module": "es6", 5 | "target": "es5", 6 | "noImplicitAny": true, 7 | "allowJs": true, 8 | "experimentalDecorators": true, 9 | "strictNullChecks": true, 10 | "stripInternal": true, 11 | "sourceMap": true, 12 | "lib": [ 13 | "es2015", 14 | "es2015.iterable", 15 | "dom" 16 | ], 17 | "typeRoots": [ 18 | "./node_modules/@types", 19 | "./src/custom-typings" 20 | ] 21 | }, 22 | "files": [ 23 | "../src/index.ts" 24 | ], 25 | "exclude": [ 26 | "node_modules", 27 | "dist", 28 | "karma.conf.js", 29 | "webpack.config.js" 30 | ] 31 | } -------------------------------------------------------------------------------- /configs/tsconfigProd.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "../types/", 4 | "module": "es6", 5 | "target": "es5", 6 | "noImplicitAny": true, 7 | "allowJs": true, 8 | "experimentalDecorators": true, 9 | "strictNullChecks": true, 10 | "stripInternal": true, 11 | "sourceMap": true, 12 | "lib": [ 13 | "es2015", 14 | "es2015.iterable", 15 | "dom" 16 | ], 17 | "typeRoots": [ 18 | "./node_modules/@types", 19 | "./src/custom-typings" 20 | ] 21 | }, 22 | "files": [ 23 | "../src/index.ts" 24 | ], 25 | "exclude": [ 26 | "node_modules", 27 | "dist", 28 | "karma.conf.js", 29 | "webpack.config.js" 30 | ] 31 | } -------------------------------------------------------------------------------- /configs/typedoc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | mode: 'modules', 3 | out: '../docs', 4 | excludes: [ 5 | '**/*.spec.ts' 6 | ], 7 | theme: 'minimal', 8 | ignoreCompilerErrors: true, 9 | excludePrivate: true, 10 | excludeNotExported: true, 11 | target: 'ES5', 12 | hideGenerator: true, 13 | moduleResolution: 'node', 14 | preserveConstEnums: true, 15 | stripInternal: true, 16 | suppressExcessPropertyErrors: true, 17 | suppressImplicitAnyIndexErrors: true, 18 | module: 'commonjs' 19 | }; -------------------------------------------------------------------------------- /configs/webpack.config.dev.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const path = require('path'); 3 | const basePath = path.resolve(__dirname, '..'); 4 | var webpackMerge = require("webpack-merge"); 5 | const baseConfig = require('./webpack.config'); 6 | 7 | module.exports = webpackMerge(baseConfig, { 8 | devtool: 'inline-source-map', 9 | module: { 10 | rules: [{ 11 | test: /\.ts$/, 12 | loader: "ts-loader", 13 | exclude: /node_modules/, 14 | options: { 15 | configFile: path.resolve(__dirname, '../configs/tsconfigDev.json'), 16 | } 17 | }, 18 | { 19 | test: /\.html$/, 20 | use: [{ 21 | loader: "html-loader", 22 | options: { 23 | minimize: false 24 | } 25 | }] 26 | } 27 | ] 28 | }, 29 | plugins: [ 30 | new webpack.HotModuleReplacementPlugin() 31 | ], 32 | devServer: { 33 | contentBase: basePath + '/dist', 34 | hot: true, 35 | compress: true, 36 | port: 4200, 37 | host: "127.0.0.1", 38 | } 39 | }); -------------------------------------------------------------------------------- /configs/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const basePath = path.resolve(__dirname, '..'); 3 | const HtmlWebPackPlugin = require("html-webpack-plugin"); 4 | 5 | module.exports = { 6 | entry: basePath + '/src/index.ts', 7 | output: { 8 | filename: "[name].js", 9 | path: basePath + '/dist/' 10 | }, 11 | module: { 12 | rules: [{ 13 | test: /\.css$/, 14 | use: ['style-loader', 'css-loader'], 15 | exclude: /node_modules/ 16 | }] 17 | }, 18 | resolve: { 19 | extensions: [".ts", ".js", ".css"] 20 | }, 21 | externals: [{ 22 | IndoorMap: 'IndoorMap', 23 | IndoorMapLoader: 'IndoorMapLoader' 24 | }], 25 | plugins: [ 26 | new HtmlWebPackPlugin({ 27 | template: basePath + '/src/index.html', 28 | filename: "./index.html" 29 | }) 30 | ] 31 | }; -------------------------------------------------------------------------------- /configs/webpack.config.prod.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | var webpackMerge = require("webpack-merge"); 3 | const baseConfig = require('./webpack.config'); 4 | 5 | module.exports = webpackMerge(baseConfig, { 6 | devtool: 'cheap-source-map', 7 | module: { 8 | rules: [{ 9 | test: /\.ts$/, 10 | loader: "ts-loader", 11 | exclude: /node_modules/, 12 | options: { 13 | configFile: path.resolve(__dirname, '../configs/tsconfigProd.json'), 14 | } 15 | }, 16 | { 17 | test: /\.html$/, 18 | use: [{ 19 | loader: "html-loader", 20 | options: { 21 | minimize: true 22 | } 23 | }] 24 | } 25 | ] 26 | } 27 | }); 28 | // var HtmlWebpackPlugin = require('html-webpack-plugin'); 29 | 30 | // module.exports = { 31 | // devtool: 'cheap-source-map', 32 | // entry: { 33 | // "index": "./src/index.ts" // 入口文件可以多个 34 | // }, 35 | // output: { 36 | // filename: "[name].js", // 这里会自动生成index.js 37 | // path: __dirname + "/build" // 输出到哪个文件夹 38 | // }, 39 | // resolve: { 40 | // extensions: [".ts", ".js", ".css"] // 自动补全,很重要 41 | // }, 42 | // module: { 43 | // loaders: [{ 44 | // test: /\.css$/, 45 | // loader: ['style-loader', 'css-loader'] 46 | // }, { 47 | // test: /\.ts$/, 48 | // loader: "ts-loader" 49 | // }] 50 | // }, 51 | // plugins: [ 52 | // new HtmlWebpackPlugin({ 53 | // template: './src/index.html' 54 | // }), 55 | // ], 56 | // externals: [{ 57 | // IndoorMap: 'IndoorMap', 58 | // IndoorMapLoader: 'IndoorMapLoader' 59 | // }], 60 | // devServer: { 61 | // contentBase: path.join(__dirname, "build") 62 | // } 63 | // }; -------------------------------------------------------------------------------- /dist/assets/data/mall.1.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [{ 4 | "type": "Feature", 5 | "geometry": { 6 | "type": "Polygon", 7 | "coordinates": [ 8 | [ 9 | [11854824.066615963, 3452164.3987673763], 10 | [11854819.88646598, 3452063.7765856106], 11 | [11854939.170031605, 3452061.089346335], 12 | [11854941.110815525, 3452164.1001852346], 13 | [11854824.066615963, 3452164.3987673763] 14 | ] 15 | ] 16 | }, 17 | "properties": { 18 | "floor": 0, 19 | "type": "floor", 20 | "floors": 7, 21 | "center": [11854850.028897347, 3452100.152127042], 22 | "id": "LEF6UaVf97wNbgA74mie7IHEKCZQrKYn" 23 | } 24 | }, { 25 | "type": "Feature", 26 | "geometry": { 27 | "type": "Polygon", 28 | "coordinates": [ 29 | [ 30 | [11854857.955689052, 3452131.704022856], 31 | [11854856.910651555, 3452104.98092117], 32 | [11854823.917324893, 3452103.338719391], 33 | [11854825.858108815, 3452131.8533139266], 34 | [11854857.955689052, 3452131.704022856] 35 | ] 36 | ] 37 | }, 38 | "properties": { 39 | "id": "LDw0JvSktKLb4olwCOtLmzvGRlkBxLgd", 40 | "floor": 1, 41 | "type": "3C" 42 | } 43 | }, { 44 | "type": "Feature", 45 | "geometry": { 46 | "type": "Polygon", 47 | "coordinates": [ 48 | [ 49 | [11854825.858108815, 3452131.8533139266], 50 | [11854827.351019524, 3452159.9200352505], 51 | [11854857.209233698, 3452159.024288825], 52 | [11854857.955689052, 3452131.704022856], 53 | [11854825.858108815, 3452131.8533139266] 54 | ] 55 | ] 56 | }, 57 | "properties": { 58 | "id": "ta157k02AL7XBgV5XVGKSQ5B2CpPdZFb", 59 | "floor": 1, 60 | "type": "Boutique" 61 | } 62 | }, { 63 | "type": "Feature", 64 | "geometry": { 65 | "type": "Polygon", 66 | "coordinates": [ 67 | [ 68 | [11854876.019908627, 3452106.7724140207], 69 | [11854876.318490768, 3452075.869162351], 70 | [11854900.951517463, 3452075.570580209], 71 | [11854901.399390675, 3452106.3245408083], 72 | [11854876.019908627, 3452106.7724140207] 73 | ] 74 | ] 75 | }, 76 | "properties": { 77 | "id": "dqDYdW7GjMZ1H1VwLtBeJhzeZMwpVydh", 78 | "floor": 1, 79 | "type": "3C" 80 | } 81 | }, { 82 | "type": "Feature", 83 | "geometry": { 84 | "type": "Polygon", 85 | "coordinates": [ 86 | [ 87 | [11854876.019908627, 3452106.7724140207], 88 | [11854874.97487113, 3452131.2561496436], 89 | [11854899.757188896, 3452130.65898536], 90 | [11854901.399390675, 3452106.3245408083], 91 | [11854876.019908627, 3452106.7724140207] 92 | ] 93 | ] 94 | }, 95 | "properties": { 96 | "id": "3UnRBMkmfONf5v3hpdjclhYZ9ZPs69AQ", 97 | "floor": 1, 98 | "type": "3C" 99 | } 100 | }, { 101 | "type": "Feature", 102 | "geometry": { 103 | "type": "Polygon", 104 | "coordinates": [ 105 | [ 106 | [11854899.757188896, 3452130.65898536], 107 | [11854930.212567352, 3452130.211112147], 108 | [11854930.063276282, 3452159.4721620376], 109 | [11854899.160024611, 3452159.173579896], 110 | [11854899.757188896, 3452130.65898536] 111 | ] 112 | ] 113 | }, 114 | "properties": { 115 | "id": "m5JHPqbr79n2f4RAdFZqPPH9m6iJRrO4", 116 | "floor": 1, 117 | "type": "Boutique" 118 | } 119 | }, { 120 | "type": "Feature", 121 | "geometry": { 122 | "type": "Polygon", 123 | "coordinates": [ 124 | [ 125 | [11854873.780542564, 3452157.0835049036], 126 | [11854869.152519366, 3452156.0384674077], 127 | [11854866.16669795, 3452150.8132799272], 128 | [11854864.972369382, 3452146.0359656597], 129 | [11854866.614571162, 3452140.5121960375], 130 | [11854874.079124706, 3452138.1235389034], 131 | [11854882.588715745, 3452137.377083549], 132 | [11854887.515321087, 3452140.2136138957], 133 | [11854889.90397822, 3452143.7965995963], 134 | [11854890.949015714, 3452150.066824573], 135 | [11854890.650433572, 3452155.2920120535], 136 | [11854885.574537164, 3452157.3820870453], 137 | [11854881.245096108, 3452159.4721620376], 138 | [11854877.96069255, 3452159.024288825], 139 | [11854873.780542564, 3452157.0835049036] 140 | ] 141 | ] 142 | }, 143 | "properties": { 144 | "id": "wSYQ6dQKRfwwjsgQUFtDy2hVA32axolg", 145 | "floor": 1, 146 | "type": "3C" 147 | } 148 | }, { 149 | "type": "Feature", 150 | "geometry": { 151 | "type": "Polygon", 152 | "coordinates": [ 153 | [ 154 | [11854839.592887336, 3452091.2461426505], 155 | [11854838.39855877, 3452074.376251642], 156 | [11854860.045764044, 3452073.6297962875], 157 | [11854860.195055116, 3452091.5447247922], 158 | [11854839.592887336, 3452091.2461426505] 159 | ] 160 | ] 161 | }, 162 | "properties": { 163 | "id": "O3t7ypJDggTtb1QioAWsrnuz9AIWC5cE", 164 | "floor": 1, 165 | "type": "Boutique" 166 | } 167 | }, { 168 | "type": "Feature", 169 | "geometry": { 170 | "type": "Polygon", 171 | "coordinates": [ 172 | [ 173 | [11854917.522826329, 3452122.298685391], 174 | [11854916.477788834, 3452069.748228445], 175 | [11854931.257604849, 3452069.0017730906], 176 | [11854931.108313778, 3452121.253647895], 177 | [11854917.522826329, 3452122.298685391] 178 | ] 179 | ] 180 | }, 181 | "properties": { 182 | "id": "WnwpxlOIyIBc1J2HM1Pkm32JSNoTFTbF", 183 | "floor": 1, 184 | "type": "3C" 185 | } 186 | }, { 187 | "type": "Feature", 188 | "geometry": { 189 | "type": "Polygon", 190 | "coordinates": [ 191 | [ 192 | [11854850.192553367, 3452155.441303124], 193 | [11854850.043262297, 3452149.0217870767], 194 | [11854835.114155209, 3452148.5739138643], 195 | [11854835.41273735, 3452126.7774175173], 196 | [11854868.10748187, 3452127.075999659], 197 | [11854867.510317588, 3452154.3962656283], 198 | [11854878.259274691, 3452154.3962656283], 199 | [11854879.304312186, 3452115.1327139894], 200 | [11854824.81307132, 3452114.8341318476], 201 | [11854827.201728454, 3452156.0384674077], 202 | [11854850.192553367, 3452155.441303124] 203 | ] 204 | ] 205 | }, 206 | "properties": { 207 | "id": "89fix3BI6B7P7xkNXQyHHdGROBWlrs7a", 208 | "floor": 2, 209 | "type": "clothing" 210 | } 211 | }, { 212 | "type": "Feature", 213 | "geometry": { 214 | "type": "Polygon", 215 | "coordinates": [ 216 | [ 217 | [11854850.192553367, 3452155.441303124], 218 | [11854850.49113551, 3452161.412945959], 219 | [11854867.659608658, 3452160.517199534], 220 | [11854867.510317588, 3452154.3962656283], 221 | [11854850.192553367, 3452155.441303124] 222 | ] 223 | ] 224 | }, 225 | "properties": { 226 | "id": "aCiVQ7SJhG56am3gGn0u74xGT4tRDx33", 227 | "floor": 2, 228 | "type": "Boutique" 229 | } 230 | }, { 231 | "type": "Feature", 232 | "geometry": { 233 | "type": "Polygon", 234 | "coordinates": [ 235 | [ 236 | [11854909.461108502, 3452141.5572335334], 237 | [11854909.461108502, 3452136.7799192653], 238 | [11854905.280958518, 3452136.4813371236], 239 | [11854901.697972817, 3452134.9884264152], 240 | [11854899.906479968, 3452132.599769281], 241 | [11854898.562860329, 3452129.4646567926], 242 | [11854897.816404974, 3452123.7915960997], 243 | [11854899.309315683, 3452119.163572903], 244 | [11854903.78804781, 3452116.92420684], 245 | [11854909.461108502, 3452116.476333627], 246 | [11854915.432751337, 3452116.92420684], 247 | [11854918.866445968, 3452118.2678264775], 248 | [11854921.852267385, 3452122.447976462], 249 | [11854923.494469166, 3452127.822455013], 250 | [11854923.046595953, 3452132.1518960684], 251 | [11854919.762192395, 3452134.988426415], 252 | [11854914.537004914, 3452135.88417284], 253 | [11854911.401892425, 3452136.7799192653], 254 | [11854911.551183496, 3452142.0051067458], 255 | [11854917.224244189, 3452141.706524604], 256 | [11854923.046595952, 3452138.720703187], 257 | [11854926.629581653, 3452136.332046053], 258 | [11854929.316820929, 3452129.6139478637], 259 | [11854928.868947716, 3452124.0901782415], 260 | [11854927.226745937, 3452118.7156996904], 261 | [11854922.001558457, 3452113.9383854223], 262 | [11854914.984878125, 3452112.8933479264], 263 | [11854900.503644248, 3452114.386258635], 264 | [11854893.188381776, 3452116.1777514857], 265 | [11854891.99405321, 3452121.7015211075], 266 | [11854891.695471069, 3452128.121037155], 267 | [11854891.396888927, 3452135.88417284], 268 | [11854894.382710343, 3452139.019285328], 269 | [11854898.413569259, 3452140.8107781787], 270 | [11854909.461108502, 3452141.5572335334] 271 | ] 272 | ] 273 | }, 274 | "properties": { 275 | "id": "KXL2hHZ4EaG0myNfTyRAz189vGTe4Ves", 276 | "floor": 2, 277 | "type": "3C" 278 | } 279 | }, { 280 | "type": "Feature", 281 | "geometry": { 282 | "type": "Polygon", 283 | "coordinates": [ 284 | [ 285 | [11854909.461108502, 3452141.5572335334], 286 | [11854908.863944218, 3452157.3820870453], 287 | [11854915.88062455, 3452157.8299602577], 288 | [11854911.551183496, 3452142.0051067458], 289 | [11854909.461108502, 3452141.5572335334] 290 | ] 291 | ] 292 | }, 293 | "properties": { 294 | "id": "k41oEAh38iXOArRO1U7JiHzdwTSWRj24", 295 | "floor": 2, 296 | "type": "SM" 297 | } 298 | }, { 299 | "type": "Feature", 300 | "geometry": { 301 | "type": "Polygon", 302 | "coordinates": [ 303 | [ 304 | [11854843.325164106, 3452106.62312295], 305 | [11854862.583712248, 3452106.175249737], 306 | [11854862.285130106, 3452096.6206212016], 307 | [11854852.28262836, 3452097.217785485], 308 | [11854854.074121209, 3452080.198603406], 309 | [11854871.093303287, 3452080.198603406], 310 | [11854871.39188543, 3452094.829128351], 311 | [11854867.062444374, 3452095.4262926346], 312 | [11854866.913153304, 3452105.8766675955], 313 | [11854878.25927469, 3452105.8766675955], 314 | [11854877.064946122, 3452074.674833784], 315 | [11854844.220910532, 3452076.764908776], 316 | [11854843.325164106, 3452106.62312295] 317 | ] 318 | ] 319 | }, 320 | "properties": { 321 | "id": "kdO7OV12frEISbhYowSxQISuokbM8P3f", 322 | "floor": 2, 323 | "type": "3C" 324 | } 325 | }, { 326 | "type": "Feature", 327 | "geometry": { 328 | "type": "Polygon", 329 | "coordinates": [ 330 | [ 331 | [11854896.622076407, 3452104.6823390285], 332 | [11854895.42774784, 3452068.4046088075], 333 | [11854920.210065603, 3452068.553899878], 334 | [11854929.018238787, 3452104.085174745], 335 | [11854896.622076407, 3452104.6823390285] 336 | ] 337 | ] 338 | }, 339 | "properties": { 340 | "id": "ZCgSqdEPkC17upcZKNJMgQ1aVfJEHrE5", 341 | "floor": 2, 342 | "type": "Boutique" 343 | } 344 | }, { 345 | "type": "Feature", 346 | "geometry": { 347 | "type": "Polygon", 348 | "coordinates": [ 349 | [ 350 | [11854831.829751654, 3452158.4271245413], 351 | [11854830.784714157, 3452124.9859246667], 352 | [11854836.905648062, 3452123.045140745], 353 | [11854846.161694456, 3452125.4337978796], 354 | [11854851.984046217, 3452128.4196192967], 355 | [11854857.80639798, 3452131.8533139266], 356 | [11854864.67378724, 3452139.0192853287], 357 | [11854867.211735446, 3452146.6331299427], 358 | [11854870.197556863, 3452155.1427209824], 359 | [11854870.197556863, 3452159.024288825], 360 | [11854831.829751654, 3452158.4271245413] 361 | ] 362 | ] 363 | }, 364 | "properties": { 365 | "id": "msavfU29eLMPB0mp1PXxFdSmE5w0VuKT", 366 | "floor": 3, 367 | "type": "SM" 368 | } 369 | }, { 370 | "type": "Feature", 371 | "geometry": { 372 | "type": "Polygon", 373 | "coordinates": [ 374 | [ 375 | [11854933.49697091, 3452158.7257066835], 376 | [11854900.055771036, 3452158.5764156124], 377 | [11854898.562860329, 3452151.7090263525], 378 | [11854901.399390675, 3452144.543054951], 379 | [11854906.176704945, 3452137.227792478], 380 | [11854916.02991562, 3452131.405440714], 381 | [11854930.361858424, 3452127.9717460843], 382 | [11854933.0490977, 3452127.9717460843], 383 | [11854933.49697091, 3452158.7257066835] 384 | ] 385 | ] 386 | }, 387 | "properties": { 388 | "id": "NZqWlaXJsFDepcbgZvxXmesDtQwp6uuR", 389 | "floor": 3, 390 | "type": "3C" 391 | } 392 | }, { 393 | "type": "Feature", 394 | "geometry": { 395 | "type": "Polygon", 396 | "coordinates": [ 397 | [ 398 | [11854832.128333792, 3452110.803272934], 399 | [11854829.291803446, 3452071.091848083], 400 | [11854866.614571163, 3452068.85248202], 401 | [11854873.481960423, 3452074.226960571], 402 | [11854874.82558006, 3452081.691514115], 403 | [11854873.780542564, 3452089.305358729], 404 | [11854870.794721147, 3452095.8741658474], 405 | [11854866.614571163, 3452101.099353328], 406 | [11854860.344346186, 3452107.3695783042], 407 | [11854851.088299792, 3452111.251146147], 408 | [11854844.220910532, 3452113.7890943517], 409 | [11854836.607065918, 3452114.386258635], 410 | [11854833.024080217, 3452115.1327139894], 411 | [11854832.128333792, 3452110.803272934] 412 | ] 413 | ] 414 | }, 415 | "properties": { 416 | "id": "JDPE4AJjNwEiSbuB8kf8kdDsMK0cKjoq", 417 | "floor": 3, 418 | "type": "clothing" 419 | } 420 | }, { 421 | "type": "Feature", 422 | "geometry": { 423 | "type": "Polygon", 424 | "coordinates": [ 425 | [ 426 | [11854891.546179999, 3452072.5847587916], 427 | [11854892.591217494, 3452079.9000212643], 428 | [11854894.233419273, 3452085.7223730283], 429 | [11854897.219240692, 3452091.5447247922], 430 | [11854901.697972817, 3452095.874165847], 431 | [11854907.818906723, 3452100.0543158315], 432 | [11854916.328497762, 3452102.2936818944], 433 | [11854923.643760236, 3452103.4880104614], 434 | [11854929.167529859, 3452104.3837568867], 435 | [11854932.004060205, 3452103.338719391], 436 | [11854932.004060205, 3452067.658153453], 437 | [11854891.546179999, 3452072.5847587916] 438 | ] 439 | ] 440 | }, 441 | "properties": { 442 | "id": "n4bnlUWUeO9M6MwcQ0OQERsl59mIoBRj", 443 | "floor": 3, 444 | "type": "3C" 445 | } 446 | }, { 447 | "type": "Feature", 448 | "geometry": { 449 | "type": "Polygon", 450 | "coordinates": [ 451 | [ 452 | [11854884.380208598, 3452107.668160446], 453 | [11854873.780542566, 3452112.5947657847], 454 | [11854873.332669351, 3452119.910028257], 455 | [11854876.46778184, 3452126.4788353755], 456 | [11854883.3351711, 3452128.270328226], 457 | [11854893.188381776, 3452128.4196192967], 458 | [11854899.309315681, 3452123.0451407456], 459 | [11854901.100808533, 3452114.535549706], 460 | [11854899.010733541, 3452109.1610711548], 461 | [11854892.889799634, 3452105.428794383], 462 | [11854888.112485368, 3452106.0259586666], 463 | [11854884.380208598, 3452107.668160446] 464 | ] 465 | ] 466 | }, 467 | "properties": { 468 | "id": "GZ5C0aIRyvHdPBp1d6xSleVXNscwEXoL", 469 | "floor": 3, 470 | "type": "3C" 471 | } 472 | }, { 473 | "type": "Feature", 474 | "geometry": { 475 | "type": "Polygon", 476 | "coordinates": [ 477 | [ 478 | [11854876.169199698, 3452158.2778334706], 479 | [11854874.82558006, 3452127.9717460843], 480 | [11854836.607065916, 3452127.2252907297], 481 | [11854836.607065916, 3452105.279503312], 482 | [11854872.287631854, 3452105.428794383], 483 | [11854871.839758642, 3452072.136885579], 484 | [11854893.039090706, 3452071.3904302246], 485 | [11854893.93483713, 3452102.2936818944], 486 | [11854927.525328077, 3452100.950062257], 487 | [11854930.511149494, 3452123.642305029], 488 | [11854898.114987114, 3452125.5830889503], 489 | [11854896.472785335, 3452157.5313781165], 490 | [11854876.169199698, 3452158.2778334706] 491 | ] 492 | ] 493 | }, 494 | "properties": { 495 | "id": "jhIDgelPKf112Nsa5Az6nRh5eVe67HEw", 496 | "floor": 4, 497 | "type": "Boutique" 498 | } 499 | }, { 500 | "type": "Feature", 501 | "geometry": { 502 | "type": "Polygon", 503 | "coordinates": [ 504 | [ 505 | [11854839.145014122, 3452156.934213833], 506 | [11854837.502812343, 3452137.377083549], 507 | [11854859.747181904, 3452135.287008557], 508 | [11854865.718824737, 3452155.739885266], 509 | [11854839.145014122, 3452156.934213833] 510 | ] 511 | ] 512 | }, 513 | "properties": { 514 | "id": "yv8eXfF7jSfTapM2oYPmSuc5dmYwARZL", 515 | "floor": 4, 516 | "type": "3C" 517 | } 518 | }, { 519 | "type": "Feature", 520 | "geometry": { 521 | "type": "Polygon", 522 | "coordinates": [ 523 | [ 524 | [11854911.999056706, 3452154.8441388407], 525 | [11854913.044094203, 3452134.5405532024], 526 | [11854932.302642347, 3452131.256149643], 527 | [11854932.75051556, 3452154.8441388407], 528 | [11854911.999056706, 3452154.8441388407] 529 | ] 530 | ] 531 | }, 532 | "properties": { 533 | "id": "0y2EfxViBZZyG4gpdtY0WQpFma9NJo8I", 534 | "floor": 4, 535 | "type": "3C" 536 | } 537 | }, { 538 | "type": "Feature", 539 | "geometry": { 540 | "type": "Polygon", 541 | "coordinates": [ 542 | [ 543 | [11854835.114155212, 3452096.769912272], 544 | [11854856.761360487, 3452096.172747989], 545 | [11854854.223412283, 3452072.5847587916], 546 | [11854832.576207006, 3452073.3312141458], 547 | [11854835.114155212, 3452096.769912272] 548 | ] 549 | ] 550 | }, 551 | "properties": { 552 | "id": "VktJi6Wr2FrfbaUdnzBS18BDXE4JxNcs", 553 | "floor": 4, 554 | "type": "SM" 555 | } 556 | }, { 557 | "type": "Feature", 558 | "geometry": { 559 | "type": "Polygon", 560 | "coordinates": [ 561 | [ 562 | [11854905.579540662, 3452095.277001564], 563 | [11854904.534503166, 3452074.674833784], 564 | [11854928.122492364, 3452073.3312141458], 565 | [11854927.823910221, 3452093.784090855], 566 | [11854905.579540662, 3452095.277001564] 567 | ] 568 | ] 569 | }, 570 | "properties": { 571 | "id": "rxLI5yuFNNjQzoEBdingb4q12GpHF6q3", 572 | "floor": 4, 573 | "type": "3C" 574 | } 575 | }, { 576 | "type": "Feature", 577 | "geometry": { 578 | "type": "Polygon", 579 | "coordinates": [ 580 | [ 581 | [11854833.47195343, 3452117.2227889816], 582 | [11854834.218408784, 3452155.739885266], 583 | [11854869.74968365, 3452155.5905941953], 584 | [11854869.003228296, 3452141.109360321], 585 | [11854852.43191943, 3452141.109360321], 586 | [11854850.78971765, 3452118.4171175486], 587 | [11854833.47195343, 3452117.2227889816] 588 | ] 589 | ] 590 | }, 591 | "properties": { 592 | "id": "Hr4pHoVbrLjKFF3KcWISeQyFSawEsUmd", 593 | "floor": 5, 594 | "type": "3C" 595 | } 596 | }, { 597 | "type": "Feature", 598 | "geometry": { 599 | "type": "Polygon", 600 | "coordinates": [ 601 | [ 602 | [11854870.197556863, 3452133.047642494], 603 | [11854859.15001762, 3452133.4955157065], 604 | [11854857.65710691, 3452117.3720800527], 605 | [11854895.129165698, 3452116.774915769], 606 | [11854897.368531762, 3452156.187758479], 607 | [11854877.512819335, 3452156.3370495494], 608 | [11854876.61707291, 3452132.898351423], 609 | [11854870.197556863, 3452133.047642494] 610 | ] 611 | ] 612 | }, 613 | "properties": { 614 | "id": "l81fa7W6VK9FNa3eIkgtg7AX0aZ2HCiU", 615 | "floor": 5, 616 | "type": "SM" 617 | } 618 | }, { 619 | "type": "Feature", 620 | "geometry": { 621 | "type": "Polygon", 622 | "coordinates": [ 623 | [ 624 | [11854835.263446279, 3452107.668160446], 625 | [11854892.740508564, 3452107.9667425877], 626 | [11854889.903978217, 3452076.1677444926], 627 | [11854831.531169508, 3452076.1677444926], 628 | [11854835.263446279, 3452107.668160446] 629 | ] 630 | ] 631 | }, 632 | "properties": { 633 | "id": "ldnmMjq2l4Nkr5CNAXpAaf5DUoYzspnM", 634 | "floor": 5, 635 | "type": "3C" 636 | } 637 | }, { 638 | "type": "Feature", 639 | "geometry": { 640 | "type": "Polygon", 641 | "coordinates": [ 642 | [ 643 | [11854906.773869226, 3452154.545556699], 644 | [11854899.010733541, 3452075.2719980674], 645 | [11854933.646261983, 3452071.3904302246], 646 | [11854933.944844125, 3452154.69484777], 647 | [11854906.773869226, 3452154.545556699] 648 | ] 649 | ] 650 | }, 651 | "properties": { 652 | "id": "sAxGiOtxHeqrDCRmA3jPGeZY5BlsFxYF", 653 | "floor": 5, 654 | "type": "Boutique" 655 | } 656 | }, { 657 | "type": "Feature", 658 | "geometry": { 659 | "type": "Polygon", 660 | "coordinates": [ 661 | [ 662 | [11854878.557856832, 3452124.090178242], 663 | [11854861.240092611, 3452124.836633596], 664 | [11854879.005730044, 3452111.6990193594], 665 | [11854862.285130108, 3452090.0518140835], 666 | [11854891.098306784, 3452104.8316300996], 667 | [11854904.534503164, 3452087.961739091], 668 | [11854899.309315683, 3452114.386258635], 669 | [11854921.10581203, 3452126.329544305], 670 | [11854893.63625499, 3452126.030962163], 671 | [11854894.233419273, 3452151.7090263525], 672 | [11854878.557856832, 3452124.090178242] 673 | ] 674 | ] 675 | }, 676 | "properties": { 677 | "id": "EYHy2gkZXA9U9aXsF9ItIufCDBGYdLyw", 678 | "floor": 6, 679 | "type": "3C" 680 | } 681 | }, { 682 | "type": "Feature", 683 | "geometry": { 684 | "type": "Polygon", 685 | "coordinates": [ 686 | [ 687 | [11854836.308483776, 3452157.5313781165], 688 | [11854835.711319493, 3452130.211112147], 689 | [11854859.15001762, 3452130.8082764307], 690 | [11854859.597890832, 3452158.277833471], 691 | [11854836.308483776, 3452157.5313781165] 692 | ] 693 | ] 694 | }, 695 | "properties": { 696 | "id": "na5czm4rFnwqI2iEYq9078ZzVA1xAY1s", 697 | "floor": 6, 698 | "type": "SM" 699 | } 700 | }, { 701 | "type": "Feature", 702 | "geometry": { 703 | "type": "Polygon", 704 | "coordinates": [ 705 | [ 706 | [11854834.666281996, 3452111.549728289], 707 | [11854831.97904272, 3452075.1227069967], 708 | [11854854.969867634, 3452074.2269605715], 709 | [11854857.50781584, 3452111.4004372177], 710 | [11854834.666281996, 3452111.549728289] 711 | ] 712 | ] 713 | }, 714 | "properties": { 715 | "id": "StL7BS9pZauRegc0dohz2S3fCiVcXXv8", 716 | "floor": 6, 717 | "type": "3C" 718 | } 719 | }, { 720 | "type": "Feature", 721 | "geometry": { 722 | "type": "Polygon", 723 | "coordinates": [ 724 | [ 725 | [11854918.119990611, 3452155.441303124], 726 | [11854917.672117399, 3452132.7490603523], 727 | [11854934.69129948, 3452132.7490603523], 728 | [11854936.221532958, 3452156.299726782], 729 | [11854918.119990611, 3452155.441303124] 730 | ] 731 | ] 732 | }, 733 | "properties": { 734 | "id": "jwJ7XHV5C72PmNv9uxg7SK0UlRf9J3DP", 735 | "floor": 6, 736 | "type": "SM" 737 | } 738 | }, { 739 | "type": "Feature", 740 | "geometry": { 741 | "type": "Polygon", 742 | "coordinates": [ 743 | [ 744 | [11854915.656687943, 3452107.4442238393], 745 | [11854915.059523659, 3452073.1072775396], 746 | [11854932.675870022, 3452071.9129489725], 747 | [11854934.467362873, 3452106.847059556], 748 | [11854915.656687943, 3452107.4442238393] 749 | ] 750 | ] 751 | }, 752 | "properties": { 753 | "id": "wqI0SRoUQzcBSLcVe95R8c2BteEcTnHf", 754 | "floor": 6, 755 | "type": "3C" 756 | } 757 | }, { 758 | "type": "Feature", 759 | "geometry": { 760 | "type": "Polygon", 761 | "coordinates": [ 762 | [ 763 | [11854885.873119308, 3452132.749060352], 764 | [11854881.09580504, 3452131.704022856], 765 | [11854879.005730048, 3452127.075999659], 766 | [11854879.7521854, 3452120.805774682], 767 | [11854886.47028359, 3452119.4621550445], 768 | [11854892.740508564, 3452122.000103249], 769 | [11854895.42774784, 3452124.3887603832], 770 | [11854895.27845677, 3452128.867492509], 771 | [11854894.382710343, 3452132.0026049977], 772 | [11854891.247597856, 3452132.898351423], 773 | [11854885.873119308, 3452132.749060352] 774 | ] 775 | ] 776 | }, 777 | "properties": { 778 | "id": "JixjBO0SkoytLtwt6de7h82ebvY60TO1", 779 | "floor": 7, 780 | "type": "Boutique" 781 | } 782 | }, { 783 | "type": "Feature", 784 | "geometry": { 785 | "type": "Polygon", 786 | "coordinates": [ 787 | [ 788 | [11854894.830583556, 3452148.872496006], 789 | [11854912.297638848, 3452146.035965659], 790 | [11854915.432751337, 3452156.784922762], 791 | [11854896.92065855, 3452155.1427209824], 792 | [11854894.830583556, 3452148.872496006] 793 | ] 794 | ] 795 | }, 796 | "properties": { 797 | "id": "Sa4fmR1CysqrQQwDI4ART9CpKk20yp1f", 798 | "floor": 7, 799 | "type": "3C" 800 | } 801 | }, { 802 | "type": "Feature", 803 | "geometry": { 804 | "type": "Polygon", 805 | "coordinates": [ 806 | [ 807 | [11854915.432751337, 3452156.784922762], 808 | [11854931.705478061, 3452156.3370495494], 809 | [11854932.302642345, 3452125.4337978796], 810 | [11854910.207563857, 3452126.0309621627], 811 | [11854912.297638848, 3452146.035965659], 812 | [11854915.432751337, 3452156.784922762] 813 | ] 814 | ] 815 | }, 816 | "properties": { 817 | "id": "WzquKOX2oH4GubimIQlUCynN3MSvTiDf", 818 | "floor": 7, 819 | "type": "SM" 820 | } 821 | }, { 822 | "type": "Feature", 823 | "geometry": { 824 | "type": "Polygon", 825 | "coordinates": [ 826 | [ 827 | [11854878.856438974, 3452156.1877584783], 828 | [11854896.92065855, 3452155.1427209824], 829 | [11854894.830583556, 3452148.872496006], 830 | [11854877.214237195, 3452147.976749581], 831 | [11854878.856438974, 3452156.1877584783] 832 | ] 833 | ] 834 | }, 835 | "properties": { 836 | "id": "1s3334", 837 | "floor": 7, 838 | "type": "3C" 839 | } 840 | }, { 841 | "type": "Feature", 842 | "geometry": { 843 | "type": "Polygon", 844 | "coordinates": [ 845 | [ 846 | [11854844.071619462, 3452090.9475605083], 847 | [11854868.256772941, 3452089.4546498], 848 | [11854881.394387178, 3452090.499687296], 849 | [11854893.486963918, 3452094.829128351], 850 | [11854902.593719242, 3452100.2036069026], 851 | [11854908.863944218, 3452107.668160446], 852 | [11854911.999056706, 3452113.49051221], 853 | [11854913.491967415, 3452118.118535407], 854 | [11854931.854769131, 3452118.5664086193], 855 | [11854932.451933416, 3452106.62312295], 856 | [11854928.27178343, 3452096.7699122727], 857 | [11854922.74801381, 3452087.065992666], 858 | [11854915.88062455, 3452079.004274839], 859 | [11854906.773869226, 3452074.0776695004], 860 | [11854890.35185143, 3452071.241139154], 861 | [11854854.521994423, 3452070.793265941], 862 | [11854841.832253398, 3452072.5847587916], 863 | [11854831.381878437, 3452073.480505217], 864 | [11854832.128333792, 3452091.843306934], 865 | [11854844.071619462, 3452090.9475605083] 866 | ] 867 | ] 868 | }, 869 | "properties": { 870 | "id": "a7V1iDAHxNLxrws8pfgSTFSj3q5iNL30", 871 | "floor": 7, 872 | "type": "Boutique" 873 | } 874 | }, { 875 | "type": "Feature", 876 | "geometry": { 877 | "type": "Polygon", 878 | "coordinates": [ 879 | [ 880 | [11854834.218408784, 3452157.680669187], 881 | [11854832.725498075, 3452131.8533139266], 882 | [11854863.778040815, 3452133.1969335647], 883 | [11854863.778040815, 3452156.48634062], 884 | [11854834.218408784, 3452157.680669187] 885 | ] 886 | ] 887 | }, 888 | "properties": { 889 | "id": "83bqw7THz9w23zAZYn2Uauq6FMlDV7yo", 890 | "floor": 7, 891 | "type": "clothing" 892 | } 893 | }, { 894 | "type": "Feature", 895 | "geometry": { 896 | "type": "Polygon", 897 | "coordinates": [ 898 | [ 899 | [11854839.100779602, 3452132.1291674543], 900 | [11854838.099976625, 3452097.516367627], 901 | [11854863.927331887, 3452097.8149497686], 902 | [11854863.778040815, 3452133.1969335647], 903 | [11854839.100779602, 3452132.1291674543] 904 | ] 905 | ] 906 | }, 907 | "properties": { 908 | "id": "EfI3shVcSUuSqEbiR0nOzntz8iCE4kWG", 909 | "floor": 7, 910 | "type": "SM" 911 | } 912 | }, { 913 | "type": "Feature", 914 | "geometry": { 915 | "type": "Polygon", 916 | "coordinates": [ 917 | [ 918 | [11854863.778040815, 3452148.1260406515], 919 | [11854877.214237195, 3452147.976749581], 920 | [11854878.856438974, 3452156.1877584783], 921 | [11854863.778040815, 3452156.48634062], 922 | [11854863.778040815, 3452148.1260406515] 923 | ] 924 | ] 925 | }, 926 | "properties": { 927 | "id": "dRU0MuJgSFDaZyEJ64n8I7vplSgKnQ6G", 928 | "floor": 7, 929 | "type": "3C" 930 | } 931 | }, { 932 | "type": "Feature", 933 | "geometry": { 934 | "type": "Polygon", 935 | "coordinates": [ 936 | [ 937 | [11854872.287631854, 3452110.3553997213], 938 | [11854880.050767541, 3452109.758235438], 939 | [11854888.560358582, 3452110.2061086507], 940 | [11854894.084128203, 3452111.8483104305], 941 | [11854872.287631854, 3452110.3553997213] 942 | ] 943 | ] 944 | }, 945 | "properties": { 946 | "id": "ZqKoQ7zZ0VowdQtgtZLg3vWtMuj6svV0", 947 | "floor": 7, 948 | "type": "clothing" 949 | } 950 | }] 951 | } -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | Indoor-Map

Indoor-Map

-------------------------------------------------------------------------------- /docs/assets/css/main.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "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", 4 | "sources": ["../../../../src/default/assets/css/vendors/_normalize.sass","../../../../src/default/assets/css/vendors/_highlight.js.sass","../../../../src/default/assets/css/setup/_mixins.sass","../../../../src/default/assets/css/setup/_grid.sass","../../../../src/default/assets/css/setup/_icons.scss","../../../../src/default/assets/css/setup/_animations.sass","../../../../src/default/assets/css/setup/_typography.sass","../../../../src/default/assets/css/_constants.sass","../../../../src/default/assets/css/layouts/_default.sass","../../../../src/default/assets/css/layouts/_minimal.sass","../../../../src/default/assets/css/elements/_comment.sass","../../../../src/default/assets/css/elements/_filter.sass","../../../../src/default/assets/css/elements/_footer.sass","../../../../src/default/assets/css/elements/_hierarchy.sass","../../../../src/default/assets/css/elements/_index.sass","../../../../src/default/assets/css/elements/_member.sass","../../../../src/default/assets/css/elements/_navigation.sass","../../../../src/default/assets/css/elements/_panel.sass","../../../../src/default/assets/css/elements/_search.sass","../../../../src/default/assets/css/elements/_signatures.sass","../../../../src/default/assets/css/elements/_sources.sass","../../../../src/default/assets/css/elements/_toolbar.sass","../../../../src/default/assets/css/elements/_images.sass"], 5 | "names": [], 6 | "file": "main.css" 7 | } 8 | -------------------------------------------------------------------------------- /docs/assets/images/icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/docs/assets/images/icons.png -------------------------------------------------------------------------------- /docs/assets/images/icons@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/docs/assets/images/icons@2x.png -------------------------------------------------------------------------------- /docs/assets/images/widgets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/docs/assets/images/widgets.png -------------------------------------------------------------------------------- /docs/assets/images/widgets@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/docs/assets/images/widgets@2x.png -------------------------------------------------------------------------------- /geojson/test.json: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection", "features": [ 2 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553900.178484669,4319018.871518089],[553908.178484669,4319018.871518089],[553908.178484669,4319011.871518091],[553900.178484669,4319011.871518091],[553900.178484669,4319018.871518089]]]},"properties":{"height":3,"name":"百货大厦1楼","type":"floor","floor":1,"id":"123qwe"}}, 3 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553904.178484669,4319018.8715180885],[553905.178484669,4319018.8715180885],[553905.178484669,4319017.871518087],[553904.178484669,4319017.871518087],[553904.178484669,4319018.8715180885]]]},"properties":{"height":3,"name":"电梯3","type":"elev","floor":1,"id":"123asd"}}, 4 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553905.178484669,4319018.8715180885],[553908.178484669,4319018.8715180885],[553908.178484669,4319016.8715180885],[553905.178484669,4319016.8715180885],[553905.178484669,4319018.8715180885]]]},"properties":{"height":3,"name":"Dior","type":"Boutique","floor":1,"id":"123zxc"}}, 5 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553904.178484669,4319017.871518087],[553903.178484669,4319017.871518087],[553903.178484669,4319018.8715180885],[553904.178484669,4319018.8715180885],[553904.178484669,4319017.871518087]]]},"properties":{"height":3,"name":"电梯2","type":"elev","floor":1,"id":"123qaz"}}, 6 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553903.178484669,4319018.8715180885],[553903.178484669,4319017.87151809],[553902.178484669,4319017.87151809],[553902.178484669,4319018.8715180885],[553903.178484669,4319018.8715180885]]]},"properties":{"height":3,"name":"电梯1","type":"elev","floor":1,"id":"123wsx"}}, 7 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553902.178484669,4319018.8715180885],[553902.178484669,4319015.87151809],[553900.178484669,4319015.87151809],[553900.178484669,4319018.8715180885],[553902.178484669,4319018.8715180885]]]},"properties":{"height":3,"name":"移动手机","type":"3C","floor":1,"id":"123edc"}}, 8 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553905.178484669,4319016.8715180885],[553908.178484669,4319016.8715180885],[553908.178484669,4319014.8715180885],[553905.178484669,4319014.8715180885],[553905.178484669,4319016.8715180885]]]},"properties":{"height":3,"name":"Lee","type":"clothing","floor":1,"id":"123qsc"}}, 9 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553905.178484669,4319011.87151809],[553905.178484669,4319014.8715180885],[553908.178484669,4319014.8715180885],[553908.178484669,4319011.87151809],[553905.178484669,4319011.87151809]]]},"properties":{"height":3,"name":"Apple","type":"3C","floor":1,"id":"123esz"}}, 10 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553905.178484669,4319011.87151809],[553900.178484669,4319011.87151809],[553900.178484669,4319014.8715180885],[553905.178484669,4319014.8715180885],[553905.178484669,4319011.87151809]]]},"properties":{"height":3,"name":"永辉","type":"SM","floor":1,"id":"123qsz"}}, 11 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553900.178484669,4319018.871518089],[553908.178484669,4319018.871518089],[553908.178484669,4319011.871518091],[553900.178484669,4319011.871518091],[553900.178484669,4319018.871518089]]]},"properties":{"height":3,"name":"百货大厦2楼","type":"floor","floor":2,"id":"456rty"}}, 12 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553905.178484669,4319011.87151809],[553905.178484669,4319014.8715180885],[553908.178484669,4319014.8715180885],[553908.178484669,4319011.87151809],[553905.178484669,4319011.87151809]]]},"properties":{"height":3,"name":"HUAWEI","type":"3C","floor":2,"id":"456fgh"}}, 13 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553905.178484669,4319011.87151809],[553900.178484669,4319011.87151809],[553900.178484669,4319014.8715180885],[553905.178484669,4319014.8715180885],[553905.178484669,4319011.87151809]]]},"properties":{"height":3,"name":"重百","type":"SM","floor":2,"id":"456vbn"}}, 14 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553903.178484669,4319018.8715180885],[553903.178484669,4319017.87151809],[553902.178484669,4319017.87151809],[553902.178484669,4319018.8715180885],[553903.178484669,4319018.8715180885]]]},"properties":{"height":3,"name":"电梯A","type":"elev","floor":2,"id":"456rfv"}}, 15 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553904.178484669,4319017.871518087],[553903.178484669,4319017.871518087],[553903.178484669,4319018.8715180885],[553904.178484669,4319018.8715180885],[553904.178484669,4319017.871518087]]]},"properties":{"height":3,"name":"电梯B","type":"elev","floor":2,"id":"456tgb"}}, 16 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553904.178484669,4319018.8715180885],[553905.178484669,4319018.8715180885],[553905.178484669,4319017.871518087],[553904.178484669,4319017.871518087],[553904.178484669,4319018.8715180885]]]},"properties":{"height":3,"name":"电梯C","type":"elev","floor":2,"id":"456yhn"}}, 17 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553905.178484669,4319018.8715180885],[553908.178484669,4319018.8715180885],[553908.178484669,4319016.8715180885],[553905.178484669,4319016.8715180885],[553905.178484669,4319018.8715180885]]]},"properties":{"height":3,"name":"ZARA","type":"clothing","floor":2,"id":"456thm"}}, 18 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553902.178484669,4319018.8715180885],[553902.178484669,4319015.87151809],[553900.178484669,4319015.87151809],[553900.178484669,4319018.8715180885],[553902.178484669,4319018.8715180885]]]},"properties":{"height":3,"name":"电信手机","type":"3C","floor":2,"id":"567thb"}}, 19 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553905.178484669,4319016.8715180885],[553908.178484669,4319016.8715180885],[553908.178484669,4319014.8715180885],[553905.178484669,4319014.8715180885],[553905.178484669,4319016.8715180885]]]},"properties":{"height":3,"name":"LV","type":"Boutique","floor":2,"id":"567uhm"}}, 20 | {"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[553900.1340584233,4319018.936900713],[553908.2169924229,4319018.946513377],[553908.2254739106,4319011.814744115],[553900.1425399072,4319011.80513145],[553900.1340584233,4319018.936900713]]]},"properties":{"height":7,"name":"百货大厦","type":"mall","floor":0,"id":"123456"}} 21 | ]} -------------------------------------------------------------------------------- /geojson/备份.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [{ 4 | "type": "Feature", 5 | "geometry": { 6 | "type": "Polygon", 7 | "coordinates": [ 8 | [ 9 | [8169589.583119638, 6251937.417501137], 10 | [8345700.496288683, 587036.3772301544], 11 | [15448840.660773542, 567468.4979891488], 12 | [15233593.989122486, 6476968.028772695], 13 | [8169589.583119638, 6251937.417501137] 14 | ] 15 | ] 16 | }, 17 | "properties": { 18 | "floor": 0, 19 | "floors": 10, 20 | "height": 5, 21 | "id": "B1KomHBHyutePj8cpbyAdOvL0XGSqmaR", 22 | "type": "floor" 23 | } 24 | }, { 25 | "type": "Feature", 26 | "geometry": { 27 | "type": "Polygon", 28 | "coordinates": [ 29 | [ 30 | [8169589.583119638, 6251937.417501137], 31 | [8244417.237308294, 3844981.2077660444], 32 | [10928660.55610136, 3903791.908580522], 33 | [11055416.642325236, 6343868.196395498], 34 | [8169589.583119638, 6251937.417501137] 35 | ] 36 | ] 37 | }, 38 | "properties": { 39 | "id": "FSVTGF8blIAwoEyu1kYJVPFazmcILlcD", 40 | "floor": 1, 41 | "height": 2, 42 | "type": "3C" 43 | } 44 | }, { 45 | "type": "Feature", 46 | "geometry": { 47 | "type": "Polygon", 48 | "coordinates": [ 49 | [ 50 | [10928660.55610136, 3903791.908580522], 51 | [13658379.710221574, 3884224.0293395165], 52 | [13617144.20710637, 6425474.476159994], 53 | [11055416.642325236, 6343868.196395498], 54 | [10928660.55610136, 3903791.908580522] 55 | ] 56 | ] 57 | }, 58 | "properties": { 59 | "id": "cdOEDQ1XEJL5kBeaHcoajGhKRPymBZNv", 60 | "floor": 1, 61 | "height": 2, 62 | "type": "3C" 63 | } 64 | }, { 65 | "type": "Feature", 66 | "geometry": { 67 | "type": "Polygon", 68 | "coordinates": [ 69 | [ 70 | [12200572.706766693, 2680799.456017702], 71 | [15366130.079608312, 2838249.9081618465], 72 | [15448840.660773542, 567468.4979891488], 73 | [12171110.997712892, 576498.0562895916], 74 | [12200572.706766693, 2680799.456017702] 75 | ] 76 | ] 77 | }, 78 | "properties": { 79 | "id": "bME3V4qp9szWJjOrmoifZeEAfkWCAgj9", 80 | "floor": 1, 81 | "height": 2, 82 | "type": "3C" 83 | } 84 | }, { 85 | "type": "Feature", 86 | "geometry": { 87 | "type": "Polygon", 88 | "coordinates": [ 89 | [ 90 | [12171110.997712892, 576498.0562895916], 91 | [9510169.14494317, 583828.474616781], 92 | [9461069.613025976, 2719935.214499712], 93 | [12200572.706766693, 2680799.456017702], 94 | [12171110.997712892, 576498.0562895916] 95 | ] 96 | ] 97 | }, 98 | "properties": { 99 | "id": "wXlZm5MzTImkCMhphTg3IiSr2JYBn78U", 100 | "floor": 1, 101 | "height": 2, 102 | "type": "3C" 103 | } 104 | }, { 105 | "type": "Feature", 106 | "geometry": { 107 | "type": "Polygon", 108 | "coordinates": [ 109 | [ 110 | [8169589.583119638, 6251937.417501137], 111 | [8229793.67858035, 4315372.3468482215], 112 | [10576438.729763268, 4295149.493400624], 113 | [10750242.468196722, 6334146.581430185], 114 | [8169589.583119638, 6251937.417501137] 115 | ] 116 | ] 117 | }, 118 | "properties": { 119 | "id": "jvgTSpncxUhrkI6HTMd9FdQpIUdIyTsH", 120 | "floor": 2, 121 | "height": 2, 122 | "type": "3C" 123 | } 124 | }, { 125 | "type": "Feature", 126 | "geometry": { 127 | "type": "Polygon", 128 | "coordinates": [ 129 | [ 130 | [12531605.162834655, 6390893.592478207], 131 | [12259276.344489709, 4383204.949985147], 132 | [15308015.24596035, 4433766.250133157], 133 | [15233593.989122486, 6476968.028772695], 134 | [12531605.162834655, 6390893.592478207] 135 | ] 136 | ] 137 | }, 138 | "properties": { 139 | "id": "oVX0tnsJOaR9xXN1yJaPeOvBvL7ehUqH", 140 | "floor": 2, 141 | "height": 2, 142 | "type": "3C" 143 | } 144 | }, { 145 | "type": "Feature", 146 | "geometry": { 147 | "type": "Polygon", 148 | "coordinates": [ 149 | [ 150 | [15359025.112822741, 3033313.541729292], 151 | [12347331.801074231, 2935181.886150769], 152 | [12132272.017000202, 576605.0507268166], 153 | [15448840.660773542, 567468.4979891488], 154 | [15359025.112822741, 3033313.541729292] 155 | ] 156 | ] 157 | }, 158 | "properties": { 159 | "id": "TqePvatcHasxNyWMBhHChv0ggnC2MtzA", 160 | "floor": 2, 161 | "height": 2, 162 | "type": "3C" 163 | } 164 | }, { 165 | "type": "Feature", 166 | "geometry": { 167 | "type": "Polygon", 168 | "coordinates": [ 169 | [ 170 | [10654773.582088117, 580675.294349164], 171 | [10860172.978757842, 3072157.040837805], 172 | [8269970.678108737, 3023012.1953517757], 173 | [8345700.496288683, 587036.3772301544], 174 | [10654773.582088117, 580675.294349164] 175 | ] 176 | ] 177 | }, 178 | "properties": { 179 | "id": "8x9XaqDHPF1QyKcpkYriNFfMTekJTAEa", 180 | "floor": 2, 181 | "height": 2, 182 | "type": "3C" 183 | } 184 | }, { 185 | "type": "Feature", 186 | "geometry": { 187 | "type": "Polygon", 188 | "coordinates": [ 189 | [ 190 | [11525480.872952016, 3972279.48592404], 191 | [11202610.865475431, 3845088.2708575064], 192 | [11437425.416367494, 3375459.1690733833], 193 | [11975542.095495133, 3551570.08224243], 194 | [11750511.484223574, 4040767.063267558], 195 | [11525480.872952016, 3972279.48592404] 196 | ] 197 | ] 198 | }, 199 | "properties": { 200 | "id": "hdB0aRbsyDEQkwGEvpHoCr9ZfsPi7Ar4", 201 | "floor": 2, 202 | "height": 2, 203 | "type": "3C" 204 | } 205 | }, { 206 | "type": "Feature", 207 | "geometry": { 208 | "type": "Polygon", 209 | "coordinates": [ 210 | [ 211 | [8169589.583119638, 6251937.417501137], 212 | [8225881.152370301, 4441225.273271478], 213 | [10449247.514696734, 4471260.406569671], 214 | [10467729.943692978, 6325146.874970924], 215 | [8169589.583119638, 6251937.417501137] 216 | ] 217 | ] 218 | }, 219 | "properties": { 220 | "id": "zeL2HG0qG281MnIwIFw5HlvL4DEEvLJo", 221 | "floor": 3, 222 | "height": 2, 223 | "type": "3C" 224 | } 225 | }, { 226 | "type": "Feature", 227 | "geometry": { 228 | "type": "Polygon", 229 | "coordinates": [ 230 | [ 231 | [10449738.705729228, 6324573.746891746], 232 | [12600334.6700897, 6393083.036615141], 233 | [12601714.231207298, 4520180.104672183], 234 | [10449247.514696734, 4471260.406569671], 235 | [10449738.705729228, 6324573.746891746] 236 | ] 237 | ] 238 | }, 239 | "properties": { 240 | "id": "YBWJbVwwYAq6nw20DEHnT7KkcwVI43FI", 241 | "floor": 3, 242 | "height": 2, 243 | "type": "3C" 244 | } 245 | }, { 246 | "type": "Feature", 247 | "geometry": { 248 | "type": "Polygon", 249 | "coordinates": [ 250 | [ 251 | [12601714.231207298, 4520180.104672183], 252 | [15302663.83541577, 4580686.794175249], 253 | [15233593.989122486, 6476968.028772695], 254 | [12600334.6700897, 6393083.036615141], 255 | [12601714.231207298, 4520180.104672183] 256 | ] 257 | ] 258 | }, 259 | "properties": { 260 | "id": "DU78emyUm3q7QmdU1m2pC40l07gLhtjF", 261 | "floor": 3, 262 | "height": 2, 263 | "type": "3C" 264 | } 265 | }, { 266 | "type": "Feature", 267 | "geometry": { 268 | "type": "Polygon", 269 | "coordinates": [ 270 | [ 271 | [13725864.773003658, 4545363.331964241], 272 | [13805138.804529112, 2025275.5014440306], 273 | [15394679.577924317, 2054436.4089405916], 274 | [15302663.83541577, 4580686.794175249], 275 | [13725864.773003658, 4545363.331964241] 276 | ] 277 | ] 278 | }, 279 | "properties": { 280 | "id": "ej2D1zMxmPW5U04GSYRJgO4BClyw1iay", 281 | "floor": 3, 282 | "height": 2, 283 | "type": "3C" 284 | } 285 | }, { 286 | "type": "Feature", 287 | "geometry": { 288 | "type": "Polygon", 289 | "coordinates": [ 290 | [ 291 | [8259088.029753058, 3373070.7174594416], 292 | [11124339.34851141, 3404810.987934891], 293 | [11329698.575860847, 578815.9968456578], 294 | [8345700.496288683, 587036.3772301544], 295 | [8259088.029753058, 3373070.7174594416] 296 | ] 297 | ] 298 | }, 299 | "properties": { 300 | "id": "D0RwXQqotXM5ECiqoaJv47BtOogFESNC", 301 | "floor": 3, 302 | "height": 2, 303 | "type": "3C" 304 | } 305 | }, { 306 | "type": "Feature", 307 | "geometry": { 308 | "type": "Polygon", 309 | "coordinates": [ 310 | [ 311 | [12327763.921833226, 3757032.814272984], 312 | [11701591.786121061, 3199348.2559043374], 313 | [12425603.318038251, 2475336.723987148], 314 | [12983287.876406897, 3003669.463494287], 315 | [12327763.921833226, 3757032.814272984] 316 | ] 317 | ] 318 | }, 319 | "properties": { 320 | "id": "EFTffBjfywjCgrsnFdthWfbGed1VvZ5T", 321 | "floor": 3, 322 | "height": 2, 323 | "type": "3C" 324 | } 325 | }, { 326 | "type": "Feature", 327 | "geometry": { 328 | "type": "Polygon", 329 | "coordinates": [ 330 | [ 331 | [12034082.976933349, 576875.5439501413], 332 | [11995109.97473614, 1311047.9091473436], 333 | [15420000.081549253, 1359273.4912377975], 334 | [15448840.660773542, 567468.4979891488], 335 | [12034082.976933349, 576875.5439501413] 336 | ] 337 | ] 338 | }, 339 | "properties": { 340 | "id": "Ak8G7TZVYElPhTlp0YoQJBwTAVHcPzMH", 341 | "floor": 3, 342 | "height": 2, 343 | "type": "3C" 344 | } 345 | }] 346 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "indoor-map", 3 | "version": "1.0.0", 4 | "description": "display indoor map by 3d", 5 | "main": "index.js", 6 | "scripts": { 7 | "doc": "rimraf ./docs && typedoc --out docs src --options ./configs/typedoc.js", 8 | "clean": "rimraf ./dist ./doc", 9 | "prod": "webpack --mode production --config ./configs/webpack.config.prod.js", 10 | "start": "webpack-dev-server --open --mode development --config ./configs/webpack.config.dev.js" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/tangerren/Indoor-Map.git" 15 | }, 16 | "keywords": [ 17 | "indoor", 18 | "indoor-map", 19 | "3d" 20 | ], 21 | "author": "", 22 | "license": "MIT", 23 | "bugs": { 24 | "url": "https://github.com/tangerren/Indoor-Map/issues" 25 | }, 26 | "homepage": "https://github.com/tangerren/Indoor-Map#readme", 27 | "dependencies": { 28 | "dat.gui": "^0.7.2", 29 | "stats.js": "^0.17.0", 30 | "three": "^0.93.0" 31 | }, 32 | "devDependencies": { 33 | "@types/stats.js": "^0.17.0", 34 | "@types/three": "^0.92.5", 35 | "css-loader": "^0.28.11", 36 | "html-loader": "^0.5.5", 37 | "html-webpack-plugin": "^3.2.0", 38 | "rimraf": "^2.6.2", 39 | "style-loader": "^0.21.0", 40 | "ts-loader": "^4.4.1", 41 | "typedoc": "^0.11.1", 42 | "typedoc-webpack-plugin": "^1.1.4", 43 | "typescript": "^2.9.2", 44 | "webpack": "^4.12.0", 45 | "webpack-cli": "^3.0.7", 46 | "webpack-dev-server": "^3.1.4", 47 | "webpack-merge": "^4.1.3" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/GeoJson/DrawGeoJson.ts: -------------------------------------------------------------------------------- 1 | 2 | import * as THREE from 'three'; 3 | import { IndoorScence } from '../base/IndoorScence'; 4 | 5 | import { DefaultTheme } from '../themes/DefaultTheme'; 6 | import { Vector3 } from 'three'; 7 | import { Box } from '../base/Box'; 8 | import { Mall } from '../base/Mall'; 9 | import { Room } from '../base/Room'; 10 | 11 | export class DrawGeoJson { 12 | 13 | /** 14 | * 建筑物高度 15 | */ 16 | static mallHeight: number; 17 | /** 18 | * 建筑物中心坐标 19 | */ 20 | static mallCenter: number[]; 21 | /** 22 | * 楼层高度 23 | */ 24 | static floorHeight: number; 25 | /** 26 | * 地板形状 27 | */ 28 | static floorShape: THREE.Shape; 29 | /** 30 | * 地板高度 31 | */ 32 | static baseHeight: number; 33 | /** 34 | * 房间高度 35 | */ 36 | static roomHeight: number; 37 | 38 | /** 39 | * 相机距离 40 | */ 41 | static cameraDistance: number; 42 | 43 | static indoorScence: IndoorScence; 44 | static theme: DefaultTheme; 45 | 46 | static draw(data: Box[], indoorScence: IndoorScence, isFloor?: boolean) { 47 | if (this.theme == undefined) { 48 | this.theme = new DefaultTheme(); 49 | } 50 | this.indoorScence = indoorScence; 51 | 52 | this.indoorScence.renderer.setClearColor(this.theme.background); 53 | this.indoorScence.selectedColor = this.theme.selectedColor; 54 | 55 | if (!isFloor) { 56 | let mall: Mall; 57 | mall = data[0] as Mall; 58 | this.mallCenter = mall.center; 59 | this.floorHeight = 10; 60 | this.mallHeight = this.floorHeight * (mall.floors + 1); 61 | this.roomHeight = 7; 62 | this.baseHeight = 0.2; 63 | this.cameraDistance = 150; 64 | this.floorShape = new THREE.Shape(mall.arrVector2); 65 | // 重置相机位置、视角、角度 66 | this.indoorScence.camera.position.set(this.mallCenter[0] - this.cameraDistance, 200, -this.mallCenter[1] + this.cameraDistance); 67 | this.indoorScence.controls.target = new Vector3(this.mallCenter[0], 20, -this.mallCenter[1]); 68 | } 69 | 70 | // data 为数据解析后的数组 71 | data.forEach(item => { 72 | // 数组中第一个为建筑物轮廓 73 | if (item.floor != 0) { 74 | item.type = 'Room'; 75 | } 76 | // mall+room 77 | let shape = new THREE.Shape(item.arrVector2); 78 | // mall room 79 | let extrudMallSettings = { 80 | amount: item.floor == 0 ? this.mallHeight : this.roomHeight, 81 | bevelEnabled: false 82 | }; 83 | // 地板 84 | let extrudeFloorSettings = { 85 | amount: this.baseHeight,//地板高度, 86 | bevelEnabled: false 87 | }; 88 | let boxGeometry = new THREE.ExtrudeGeometry(shape, extrudMallSettings); 89 | let floorGeometry = new THREE.ExtrudeGeometry(this.floorShape, extrudeFloorSettings); 90 | 91 | let boxMesh; 92 | if (item.type == "Room") { 93 | let roomMaterial = new THREE.MeshLambertMaterial(this.theme.room(item.roomType)); 94 | // let roomMaterial = new THREE.MeshLambertMaterial({ 95 | // color: new THREE.Color(Math.random(), Math.random(), Math.random()), 96 | // opacity: 0.8, 97 | // transparent: true 98 | // }); 99 | boxMesh = new Room(boxGeometry, roomMaterial); 100 | } else { 101 | let boxMaterial = new THREE.MeshLambertMaterial(this.theme.building); 102 | boxMesh = new THREE.Mesh(boxGeometry, boxMaterial); 103 | } 104 | 105 | let floorMaterial = new THREE.MeshLambertMaterial(this.theme.floor); 106 | let floorMesh = new THREE.Mesh(floorGeometry, floorMaterial); 107 | 108 | boxMesh.position.set(0, this.floorHeight * item.floor, 0); 109 | floorMesh.position.set(0, this.floorHeight * item.floor, 0); 110 | 111 | let boxGeometryL = new THREE.Geometry().setFromPoints(item.arrVector2); 112 | let boxWire = new THREE.Line(boxGeometryL, new THREE.LineBasicMaterial({ 113 | color: "#5C4433", 114 | opacity: 0.5, 115 | transparent: true, 116 | linewidth: 1 117 | })); 118 | boxWire.position.set(0, this.floorHeight * item.floor + this.roomHeight, 0); 119 | 120 | boxMesh.rotateOnAxis(new THREE.Vector3(1, 0, 0), -Math.PI / 2); 121 | floorMesh.rotateOnAxis(new THREE.Vector3(1, 0, 0), -Math.PI / 2); 122 | boxWire.rotateOnAxis(new THREE.Vector3(1, 0, 0), -Math.PI / 2); 123 | 124 | this.indoorScence.scene.add(boxWire); 125 | this.indoorScence.scene.add(boxMesh); 126 | this.indoorScence.scene.add(floorMesh); 127 | }) 128 | } 129 | } -------------------------------------------------------------------------------- /src/GeoJson/Feature.ts: -------------------------------------------------------------------------------- 1 | import { Properties } from './properties' 2 | import { Geometry } from './Geometry' 3 | 4 | /** 5 | * GeoJSON 中的 geometry 属性,包含要素类型、坐标点、属性字段信息 6 | */ 7 | export class Feature { 8 | /** 9 | * 要素类型("Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon") 10 | */ 11 | type: string; 12 | /** 13 | * 坐标信息(不同类型的要素,坐标点组织方式不同) 14 | */ 15 | geometry: Geometry; 16 | /** 17 | * 属性字段信息 18 | */ 19 | properties: Properties; 20 | } -------------------------------------------------------------------------------- /src/GeoJson/GeoJSON.ts: -------------------------------------------------------------------------------- 1 | import { Feature } from './Feature' 2 | 3 | export class GeoJSON { 4 | type: string; 5 | features: Array 6 | } -------------------------------------------------------------------------------- /src/GeoJson/Geometry.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * GeoJSON 中的 geometry 属性,包含要素类型、坐标点、属性字段信息 4 | */ 5 | export class Geometry { 6 | /** 7 | * 要素类型("Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon") 8 | */ 9 | type: string; 10 | /** 11 | * 坐标信息(不同类型的要素,坐标点组织方式不同) 12 | */ 13 | coordinates: Array>; 14 | } -------------------------------------------------------------------------------- /src/GeoJson/ParseGeoJson.ts: -------------------------------------------------------------------------------- 1 | import { GeoJSON } from './GeoJSON'; 2 | import { Box } from '../base/Box'; 3 | 4 | import * as THREE from 'three'; 5 | import { Mall } from '../base/Mall'; 6 | 7 | export class ParseGeoJson { 8 | 9 | 10 | constructor() { } 11 | 12 | parse(json: GeoJSON): Box[] { 13 | if (json.type !== 'FeatureCollection') { 14 | console.error('geojson type字段不符合要求!'); 15 | return []; 16 | } 17 | let mallData: Box[] = []; 18 | json.features.forEach(element => { 19 | // TODO: 类型处理(区分Room 和 Floor 以及其他) 20 | let tempBox = {} as Box; 21 | 22 | tempBox.floor = element.properties.floor; 23 | // 属性 24 | // if (element.properties.floor === 0) { 25 | tempBox.floors = element.properties.floors; 26 | tempBox.floorHeight = element.properties.floorHeight; 27 | tempBox.id = element.properties.id; 28 | tempBox.roomType = element.properties.type; 29 | tempBox.center = element.properties.center; 30 | // } 31 | tempBox.arrVector2 = []; 32 | element.geometry.coordinates.forEach((rings: Array) => { 33 | rings.forEach(point => { 34 | tempBox.arrVector2.push(new THREE.Vector2(point[0], point[1])); 35 | }); 36 | }); 37 | mallData.push(tempBox); 38 | }) 39 | return mallData; 40 | } 41 | 42 | } -------------------------------------------------------------------------------- /src/GeoJson/Properties.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 建筑物属性 3 | */ 4 | export class Properties { 5 | /** 6 | * 建筑物或者房间的中心点 7 | */ 8 | center: number[]; 9 | /** 10 | * 高度,房间高、楼层高或者建筑物高 11 | */ 12 | floorHeight?: number; 13 | /** 14 | * 名称,用于显示label 15 | */ 16 | name?: string; 17 | /** 18 | * 建筑物类型,可以是洗手间、超市、商店等 19 | */ 20 | type: string; 21 | /** 22 | * 楼层数,第几层 23 | */ 24 | floor: number; 25 | /** 26 | * 共几层 27 | */ 28 | floors?: number; 29 | /** 30 | * 建筑物的唯一标识ID 31 | */ 32 | id: string; 33 | } -------------------------------------------------------------------------------- /src/GeoJson/TYPE.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Room 类型 4 | */ 5 | export enum TYPE { 6 | /** 7 | * 第i楼层 8 | */ 9 | floor, 10 | 11 | /** 12 | * 电梯 13 | */ 14 | elev, 15 | 16 | /** 17 | * 专卖店 18 | */ 19 | Boutique, 20 | 21 | /** 22 | * 3C数码 23 | */ 24 | '3C', 25 | 26 | /** 27 | * 服装店 28 | */ 29 | clothing, 30 | 31 | /** 32 | * 超市 33 | */ 34 | SM, 35 | 36 | /** 37 | * 商场大楼 38 | */ 39 | mall, 40 | 41 | /** 42 | * 洗手间 43 | */ 44 | WC 45 | } -------------------------------------------------------------------------------- /src/assets/css/indoor3D.css: -------------------------------------------------------------------------------- 1 | /* .mapLabels { 2 | font-size: 10px; 3 | text-align: center; 4 | text-shadow: #ffffff 1px 0 0, #ffffff 0 1px 0, #ffffff -1px 0 0, #ffffff 0 -1px 0; 5 | } 6 | 7 | .mapLabels img { 8 | width: 15px; 9 | height: 15px; 10 | } 11 | 12 | @media screen { 13 | .mapLabels .pubPoints img { 14 | width: 25px; 15 | height: 25px; 16 | -webkit-border-radius: 25px; 17 | border: 2px #a72525 solid; 18 | } 19 | } */ 20 | 21 | html, 22 | body { 23 | width: 100%; 24 | height: 100%; 25 | margin: 0; 26 | padding: 0; 27 | } 28 | 29 | .ctr-btn { 30 | position: absolute; 31 | width: 55px; 32 | top: 20px; 33 | left: 20px; 34 | z-index: 1; 35 | padding: 0; 36 | } 37 | 38 | .ctr-btn ul { 39 | float: right; 40 | } 41 | 42 | .ctr-btn li { 43 | max-width: 100px; 44 | padding: 10px; 45 | background-color: #e8e8e8; 46 | border: 1px solid #bbbbbb; 47 | text-align: center; 48 | cursor: pointer; 49 | list-style-type: none; 50 | } 51 | 52 | .floors-ele { 53 | position: absolute; 54 | right: 10px; 55 | top: 5px; 56 | width: 45px; 57 | } 58 | 59 | .floors-ele li { 60 | max-width: 100px; 61 | padding: 10px; 62 | border: 1px solid #bbbbbb; 63 | text-align: center; 64 | cursor: pointer; 65 | list-style-type: none; 66 | } 67 | 68 | .floors-ele li:hover { 69 | font-weight: 600; 70 | } 71 | 72 | .floors-ele .selected { 73 | background-color: #4e5ccf !important; 74 | border: 1px solid #08104f; 75 | color: #FFF; 76 | } -------------------------------------------------------------------------------- /src/assets/data/mall.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [{ 4 | "type": "Feature", 5 | "geometry": { 6 | "type": "Polygon", 7 | "coordinates": [ 8 | [ 9 | [8169589.583119638, 6251937.417501137], 10 | [8345700.496288683, 587036.3772301544], 11 | [15448840.660773542, 567468.4979891488], 12 | [15233593.989122486, 6476968.028772695], 13 | [8169589.583119638, 6251937.417501137] 14 | ] 15 | ] 16 | }, 17 | "properties": { 18 | "floor": 0, 19 | "id": "B1KomHBHyutePj8cpbyAdOvL0XGSqmaR" 20 | } 21 | }, { 22 | "type": "Feature", 23 | "geometry": { 24 | "type": "Polygon", 25 | "coordinates": [ 26 | [ 27 | [8169589.583119638, 6251937.417501137], 28 | [8244417.237308294, 3844981.2077660444], 29 | [10928660.55610136, 3903791.908580522], 30 | [11055416.642325236, 6343868.196395498], 31 | [8169589.583119638, 6251937.417501137] 32 | ] 33 | ] 34 | }, 35 | "properties": { 36 | "id": "FSVTGF8blIAwoEyu1kYJVPFazmcILlcD", 37 | "floor": 1 38 | } 39 | }, { 40 | "type": "Feature", 41 | "geometry": { 42 | "type": "Polygon", 43 | "coordinates": [ 44 | [ 45 | [10928660.55610136, 3903791.908580522], 46 | [13658379.710221574, 3884224.0293395165], 47 | [13617144.20710637, 6425474.476159994], 48 | [11055416.642325236, 6343868.196395498], 49 | [10928660.55610136, 3903791.908580522] 50 | ] 51 | ] 52 | }, 53 | "properties": { 54 | "id": "cdOEDQ1XEJL5kBeaHcoajGhKRPymBZNv", 55 | "floor": 1 56 | } 57 | }, { 58 | "type": "Feature", 59 | "geometry": { 60 | "type": "Polygon", 61 | "coordinates": [ 62 | [ 63 | [12200572.706766693, 2680799.456017702], 64 | [15366130.079608312, 2838249.9081618465], 65 | [15448840.660773542, 567468.4979891488], 66 | [12171110.997712892, 576498.0562895916], 67 | [12200572.706766693, 2680799.456017702] 68 | ] 69 | ] 70 | }, 71 | "properties": { 72 | "id": "bME3V4qp9szWJjOrmoifZeEAfkWCAgj9", 73 | "floor": 1 74 | } 75 | }, { 76 | "type": "Feature", 77 | "geometry": { 78 | "type": "Polygon", 79 | "coordinates": [ 80 | [ 81 | [12171110.997712892, 576498.0562895916], 82 | [9510169.14494317, 583828.474616781], 83 | [9461069.613025976, 2719935.214499712], 84 | [12200572.706766693, 2680799.456017702], 85 | [12171110.997712892, 576498.0562895916] 86 | ] 87 | ] 88 | }, 89 | "properties": { 90 | "id": "wXlZm5MzTImkCMhphTg3IiSr2JYBn78U", 91 | "floor": 1 92 | } 93 | }, { 94 | "type": "Feature", 95 | "geometry": { 96 | "type": "Polygon", 97 | "coordinates": [ 98 | [ 99 | [8169589.583119638, 6251937.417501137], 100 | [8229793.67858035, 4315372.3468482215], 101 | [10576438.729763268, 4295149.493400624], 102 | [10750242.468196722, 6334146.581430185], 103 | [8169589.583119638, 6251937.417501137] 104 | ] 105 | ] 106 | }, 107 | "properties": { 108 | "id": "jvgTSpncxUhrkI6HTMd9FdQpIUdIyTsH", 109 | "floor": 2 110 | } 111 | }, { 112 | "type": "Feature", 113 | "geometry": { 114 | "type": "Polygon", 115 | "coordinates": [ 116 | [ 117 | [12531605.162834655, 6390893.592478207], 118 | [12259276.344489709, 4383204.949985147], 119 | [15308015.24596035, 4433766.250133157], 120 | [15233593.989122486, 6476968.028772695], 121 | [12531605.162834655, 6390893.592478207] 122 | ] 123 | ] 124 | }, 125 | "properties": { 126 | "id": "oVX0tnsJOaR9xXN1yJaPeOvBvL7ehUqH", 127 | "floor": 2 128 | } 129 | }, { 130 | "type": "Feature", 131 | "geometry": { 132 | "type": "Polygon", 133 | "coordinates": [ 134 | [ 135 | [15359025.112822741, 3033313.541729292], 136 | [12347331.801074231, 2935181.886150769], 137 | [12132272.017000202, 576605.0507268166], 138 | [15448840.660773542, 567468.4979891488], 139 | [15359025.112822741, 3033313.541729292] 140 | ] 141 | ] 142 | }, 143 | "properties": { 144 | "id": "TqePvatcHasxNyWMBhHChv0ggnC2MtzA", 145 | "floor": 2 146 | } 147 | }, { 148 | "type": "Feature", 149 | "geometry": { 150 | "type": "Polygon", 151 | "coordinates": [ 152 | [ 153 | [10654773.582088117, 580675.294349164], 154 | [10860172.978757842, 3072157.040837805], 155 | [8269970.678108737, 3023012.1953517757], 156 | [8345700.496288683, 587036.3772301544], 157 | [10654773.582088117, 580675.294349164] 158 | ] 159 | ] 160 | }, 161 | "properties": { 162 | "id": "8x9XaqDHPF1QyKcpkYriNFfMTekJTAEa", 163 | "floor": 2 164 | } 165 | }, { 166 | "type": "Feature", 167 | "geometry": { 168 | "type": "Polygon", 169 | "coordinates": [ 170 | [ 171 | [11525480.872952016, 3972279.48592404], 172 | [11202610.865475431, 3845088.2708575064], 173 | [11437425.416367494, 3375459.1690733833], 174 | [11975542.095495133, 3551570.08224243], 175 | [11750511.484223574, 4040767.063267558], 176 | [11525480.872952016, 3972279.48592404] 177 | ] 178 | ] 179 | }, 180 | "properties": { 181 | "id": "hdB0aRbsyDEQkwGEvpHoCr9ZfsPi7Ar4", 182 | "floor": 2 183 | } 184 | }, { 185 | "type": "Feature", 186 | "geometry": { 187 | "type": "Polygon", 188 | "coordinates": [ 189 | [ 190 | [8169589.583119638, 6251937.417501137], 191 | [8225881.152370301, 4441225.273271478], 192 | [10449247.514696734, 4471260.406569671], 193 | [10467729.943692978, 6325146.874970924], 194 | [8169589.583119638, 6251937.417501137] 195 | ] 196 | ] 197 | }, 198 | "properties": { 199 | "id": "zeL2HG0qG281MnIwIFw5HlvL4DEEvLJo", 200 | "floor": 3 201 | } 202 | }, { 203 | "type": "Feature", 204 | "geometry": { 205 | "type": "Polygon", 206 | "coordinates": [ 207 | [ 208 | [10449738.705729228, 6324573.746891746], 209 | [12600334.6700897, 6393083.036615141], 210 | [12601714.231207298, 4520180.104672183], 211 | [10449247.514696734, 4471260.406569671], 212 | [10449738.705729228, 6324573.746891746] 213 | ] 214 | ] 215 | }, 216 | "properties": { 217 | "id": "YBWJbVwwYAq6nw20DEHnT7KkcwVI43FI", 218 | "floor": 3 219 | } 220 | }, { 221 | "type": "Feature", 222 | "geometry": { 223 | "type": "Polygon", 224 | "coordinates": [ 225 | [ 226 | [12601714.231207298, 4520180.104672183], 227 | [15302663.83541577, 4580686.794175249], 228 | [15233593.989122486, 6476968.028772695], 229 | [12600334.6700897, 6393083.036615141], 230 | [12601714.231207298, 4520180.104672183] 231 | ] 232 | ] 233 | }, 234 | "properties": { 235 | "id": "DU78emyUm3q7QmdU1m2pC40l07gLhtjF", 236 | "floor": 3 237 | } 238 | }, { 239 | "type": "Feature", 240 | "geometry": { 241 | "type": "Polygon", 242 | "coordinates": [ 243 | [ 244 | [13725864.773003658, 4545363.331964241], 245 | [13805138.804529112, 2025275.5014440306], 246 | [15394679.577924317, 2054436.4089405916], 247 | [15302663.83541577, 4580686.794175249], 248 | [13725864.773003658, 4545363.331964241] 249 | ] 250 | ] 251 | }, 252 | "properties": { 253 | "id": "ej2D1zMxmPW5U04GSYRJgO4BClyw1iay", 254 | "floor": 3 255 | } 256 | }, { 257 | "type": "Feature", 258 | "geometry": { 259 | "type": "Polygon", 260 | "coordinates": [ 261 | [ 262 | [8259088.029753058, 3373070.7174594416], 263 | [11124339.34851141, 3404810.987934891], 264 | [11329698.575860847, 578815.9968456578], 265 | [8345700.496288683, 587036.3772301544], 266 | [8259088.029753058, 3373070.7174594416] 267 | ] 268 | ] 269 | }, 270 | "properties": { 271 | "id": "D0RwXQqotXM5ECiqoaJv47BtOogFESNC", 272 | "floor": 3 273 | } 274 | }, { 275 | "type": "Feature", 276 | "geometry": { 277 | "type": "Polygon", 278 | "coordinates": [ 279 | [ 280 | [12327763.921833226, 3757032.814272984], 281 | [11701591.786121061, 3199348.2559043374], 282 | [12425603.318038251, 2475336.723987148], 283 | [12983287.876406897, 3003669.463494287], 284 | [12327763.921833226, 3757032.814272984] 285 | ] 286 | ] 287 | }, 288 | "properties": { 289 | "id": "EFTffBjfywjCgrsnFdthWfbGed1VvZ5T", 290 | "floor": 3 291 | } 292 | }, { 293 | "type": "Feature", 294 | "geometry": { 295 | "type": "Polygon", 296 | "coordinates": [ 297 | [ 298 | [12034082.976933349, 576875.5439501413], 299 | [11995109.97473614, 1311047.9091473436], 300 | [15420000.081549253, 1359273.4912377975], 301 | [15448840.660773542, 567468.4979891488], 302 | [12034082.976933349, 576875.5439501413] 303 | ] 304 | ] 305 | }, 306 | "properties": { 307 | "id": "Ak8G7TZVYElPhTlp0YoQJBwTAVHcPzMH", 308 | "floor": 3 309 | } 310 | }] 311 | } -------------------------------------------------------------------------------- /src/assets/img/ATM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/ATM.png -------------------------------------------------------------------------------- /src/assets/img/default-point.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/default-point.png -------------------------------------------------------------------------------- /src/assets/img/entry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/entry.png -------------------------------------------------------------------------------- /src/assets/img/escalator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/escalator.png -------------------------------------------------------------------------------- /src/assets/img/indoor_floor_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/indoor_floor_normal.png -------------------------------------------------------------------------------- /src/assets/img/lift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/lift.png -------------------------------------------------------------------------------- /src/assets/img/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/marker.png -------------------------------------------------------------------------------- /src/assets/img/stair.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/stair.png -------------------------------------------------------------------------------- /src/assets/img/toilet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tangerren/Indoor-Map/8057115c60ae69188b67ca1aecc32ffa03f15fd5/src/assets/img/toilet.png -------------------------------------------------------------------------------- /src/base/Box.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Box 代表场景中绘制的所有立方体盒子 3 | */ 4 | 5 | export interface Box { 6 | type: string; // 地板 、楼层 Floor、房间 Room 7 | id: string; 8 | floor: number; 9 | floors?: number; 10 | floorHeight?: number; 11 | center: Array; 12 | roomType?: string; 13 | currentHex: number; 14 | arrVector2: Array; 15 | } -------------------------------------------------------------------------------- /src/base/ImParam.ts: -------------------------------------------------------------------------------- 1 | export interface ImParam { 2 | dataUrl: string; 3 | selectable: boolean; 4 | mapDiv: string; 5 | } -------------------------------------------------------------------------------- /src/base/IndoorMap.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * IndoorMap HTML元素 3 | */ 4 | 5 | import { Detector } from '../utils/Detector'; 6 | import { DomUtil } from '../utils/DomUtil'; 7 | import { IndoorScence } from './IndoorScence' 8 | import { Mall } from './Mall' 9 | import { ImParam } from './ImParam'; 10 | import '../assets/css/indoor3D.css' 11 | import { Box } from './Box'; 12 | 13 | export class IndoorMap { 14 | 15 | indoorScence: IndoorScence; 16 | /** 17 | * indoorMap的DOM根元素 18 | */ 19 | private rootEle: HTMLElement; 20 | 21 | /** 22 | * 绘制内容的Canvas元素 23 | */ 24 | private canvasEle: HTMLCanvasElement; 25 | 26 | /** 27 | * 楼层选择器 DOM 元素 28 | */ 29 | private floorEle: HTMLElement; 30 | 31 | /** 32 | * 当前选中的楼层选择器 DOM 元素 33 | */ 34 | private floorSelectedEle: HTMLElement; 35 | 36 | 37 | private mall: Mall; 38 | /** 39 | * 初始化IndoorMap 40 | * @param options IndoorMap初始化参数 41 | */ 42 | constructor(options: ImParam) { 43 | if (!Detector.webgl) { 44 | console.error("浏览器不支持WebGL 3D"); 45 | return; 46 | } 47 | console.info("浏览器支持WebGL 3D"); 48 | 49 | // 解析参数,创建绘制容器div 50 | if (options.mapDiv != '') { 51 | // 指定了绘制容器DOM 的 id 52 | this.rootEle = document.getElementById(options.mapDiv); 53 | this.rootEle.style.background = "#F2F2F2"; 54 | } else { 55 | this.rootEle = DomUtil.createRootEle(); 56 | } 57 | 58 | this.canvasEle = DomUtil.createCanvasEle(this.rootEle); 59 | 60 | this.indoorScence = new IndoorScence(this.rootEle, this.canvasEle); 61 | this.indoorScence.loadData(options.dataUrl, [this.creatFloorEle.bind(this)]); 62 | this.indoorScence.setSelectable(options.selectable); 63 | } 64 | 65 | /** 66 | * 创建楼层选择元素 67 | * @param boxs 当前geojson解析结果 68 | */ 69 | creatFloorEle(boxs: Box[]) { 70 | if (boxs == undefined || boxs.length == 0) { 71 | console.error('the data has not been loaded yet. please call this function in callback'); 72 | return null; 73 | } 74 | 75 | this.floorEle = document.createElement('ul'); 76 | this.floorEle.className = 'floors-ele'; 77 | let floors = (boxs[0] as Mall).floors; 78 | for (let i = 0; i <= floors; i++) { 79 | let li = document.createElement('li'); 80 | li.innerText = i === 0 ? 'All' : i.toString(); 81 | this.floorEle.appendChild(li); 82 | li.onclick = (e) => { this.indoorScence.drawFloor(i); this.updateFloorEle(e.target as HTMLElement) } 83 | } 84 | this.rootEle.appendChild(this.floorEle); 85 | } 86 | 87 | /** 88 | * 更新楼层选择元素的样式 89 | * @param target 当前选中的元素 90 | */ 91 | updateFloorEle(target: HTMLElement) { 92 | let floorsEle = document.getElementsByClassName('floors-ele')[0]; 93 | if (this.rootEle == null) { 94 | return; 95 | } 96 | 97 | for (let i = 0; i < floorsEle.children.length; i++) { 98 | floorsEle.children[i].className = ''; 99 | } 100 | 101 | target.className = 'selected'; 102 | } 103 | 104 | setSelectListen(callback: Function) { 105 | this.indoorScence.selectionListener = callback; 106 | } 107 | } -------------------------------------------------------------------------------- /src/base/IndoorScence.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Indoor-Map 场景 3 | */ 4 | 5 | import * as THREE from 'three'; 6 | // import { OrbitControls } from '../utils/OrbitControl'; 7 | import { OrbitControls } from '../THREE/OrbitControls.js'; 8 | import { Vector3 } from 'three'; 9 | import { ParseGeoJson } from '../GeoJson/ParseGeoJson'; 10 | import { DrawGeoJson } from '../GeoJson/DrawGeoJson'; 11 | 12 | import * as Stats from 'stats.js' 13 | import { Box } from './Box'; 14 | import { Room } from './Room'; 15 | 16 | export class IndoorScence { 17 | 18 | MuseXY = { X: 0, Y: 0 }; 19 | boxs: Box[]; 20 | private parseGeoJson: ParseGeoJson; 21 | stats: Stats; 22 | 23 | rootEle: HTMLElement; 24 | canvasEle: HTMLCanvasElement; 25 | canvasWidth: number; 26 | canvasWidthHalf: number; 27 | canvasHeight: number; 28 | canvasHeightHalf: number; 29 | 30 | scene: THREE.Scene; // 3d地图渲染场景 31 | renderer: THREE.WebGLRenderer; // 2、3d地图渲染场景渲染器 32 | camera: THREE.PerspectiveCamera; // 3d地图渲染场景视点相机 33 | controls: OrbitControls; // 3d 缩放旋转平移控制器 OrbitControls 34 | rayCaster: THREE.Raycaster; 35 | 36 | sceneChanged: boolean = true; // 场景是否改变 37 | showNames: boolean = true; // 是否显示房屋名称标注 38 | isShowPubPoints: boolean = true; // 是否显示公共设施标注 39 | selectionListener: Function | undefined; 40 | selectedObj: Room; 41 | selectedColor: string; 42 | // 初始化场景,相机,灯光 43 | constructor(rootEle: HTMLElement, canvasEle: HTMLCanvasElement) { 44 | this.rootEle = rootEle; 45 | this.canvasEle = canvasEle; 46 | this.canvasWidth = this.rootEle.clientWidth; 47 | this.canvasWidthHalf = this.canvasWidth / 2; 48 | this.canvasHeight = this.rootEle.clientHeight; 49 | this.canvasHeightHalf = this.canvasHeight / 2; 50 | 51 | // 渲染场景 52 | this.scene = new THREE.Scene(); 53 | 54 | // 渲染器 55 | this.renderer = new THREE.WebGLRenderer({ 56 | antialias: true, // 反锯齿 57 | canvas: this.canvasEle 58 | }); 59 | this.renderer.autoClear = true; 60 | this.renderer.setSize(this.rootEle.clientWidth, this.rootEle.clientHeight); 61 | // this.renderer.setClearColor("#F2F2F2"); // 由theme中指定 62 | 63 | // 相机 64 | this.camera = new THREE.PerspectiveCamera(50, this.canvasWidth / this.canvasHeight, 0.1, 2000); 65 | 66 | // 在屏幕中显示坐标 67 | var axes = new THREE.AxesHelper(1200); 68 | this.scene.add(axes); 69 | 70 | // controls 地图平移旋转缩放 操作工具 71 | this.controls = new OrbitControls(this.camera, this.canvasEle); 72 | this.controls.enableKeys = true; 73 | 74 | this.controls.addEventListener('change', () => { 75 | this.renderer.render(this.scene, this.camera); 76 | }); 77 | 78 | // 白色平行光源 左前上方 79 | var light = new THREE.DirectionalLight(0xffffff); 80 | light.position.set(-500, 500, -500); 81 | this.scene.add(light); 82 | 83 | // 白色平行光源 右后上方 84 | var light = new THREE.DirectionalLight(0xffffff); 85 | light.position.set(500, 500, 500); 86 | this.scene.add(light); 87 | 88 | this.stats = new Stats(); 89 | this.stats.showPanel(0); // 0: fps, 1: ms, 2: mb, 3+: custom 90 | document.body.appendChild(this.stats.dom); 91 | 92 | this.animate(); 93 | } 94 | 95 | // 定时更新场景 96 | animate() { 97 | this.stats.begin(); 98 | requestAnimationFrame(this.animate.bind(this)); 99 | if (this.sceneChanged) { 100 | this.controls.update(); 101 | this.renderer.clear(); 102 | this.renderer.render(this.scene, this.camera); 103 | // 更新labels 104 | if (this.showNames || this.isShowPubPoints) { 105 | // this.updateLabels(); 106 | } 107 | } 108 | this.sceneChanged = false; 109 | this.stats.end(); 110 | 111 | } 112 | 113 | // 加载json文件,并解析为特定格式,然后绘制 114 | loadData(url: string, callBacks?: Array) { 115 | var loader = new THREE.FileLoader(); 116 | loader.load(url, (geoJSON: string) => { 117 | this.parseGeoJson = new ParseGeoJson(); 118 | this.boxs = this.parseGeoJson.parse(JSON.parse(geoJSON)); 119 | DrawGeoJson.draw(this.boxs, this); 120 | this.reDraw(); 121 | if (callBacks) { 122 | callBacks.forEach(element => { 123 | element(this.boxs); 124 | }); 125 | } 126 | }, (xhr) => { 127 | console.log((xhr.loaded / xhr.total * 100) + '% loaded'); 128 | }, (err) => { 129 | console.log(err); 130 | }) 131 | } 132 | 133 | // 绘制指定楼层 134 | // TODO: 绘制的时候,请求服务器获取对应的属性信息(JSON文件中只存放了ID) 135 | drawFloor(floor: number) { 136 | this.reDraw(); 137 | this.clearObj(); 138 | if (floor === 0) { 139 | DrawGeoJson.draw(this.boxs, this); 140 | return; 141 | } 142 | let floorBoxs: Box[]; floorBoxs = []; 143 | this.boxs.forEach(ele => { 144 | if (floor === ele.floor) { 145 | floorBoxs.push(ele); 146 | } 147 | }); 148 | DrawGeoJson.draw(floorBoxs, this, floor === 0 ? false : true); 149 | } 150 | 151 | // 清空场景中绘制的对象 152 | clearObj() { 153 | let lights = []; 154 | while (this.scene.children.length) { 155 | if (this.scene.children[0].type === 'DirectionalLight') { 156 | lights.push(this.scene.children[0]); 157 | } 158 | this.scene.remove(this.scene.children[0]); 159 | } 160 | lights.forEach(element => { 161 | this.scene.add(element); 162 | }); 163 | } 164 | 165 | //set if the objects are selectable 设置场景中的对象是否可以被选中 166 | setSelectable(selectable: boolean) { 167 | if (selectable) { 168 | this.rayCaster = new THREE.Raycaster(); 169 | this.rootEle.addEventListener('mousedown', this.remenberXY.bind(this), false); 170 | this.rootEle.addEventListener('mouseup', this.onSelectObject.bind(this), false); 171 | this.rootEle.addEventListener('touchstart', this.onSelectObject.bind(this), false); 172 | } else { 173 | this.rootEle.removeEventListener('mousedown', this.remenberXY.bind(this), false); 174 | this.rootEle.removeEventListener('mouseup', this.onSelectObject.bind(this), false); 175 | this.rootEle.removeEventListener('touchstart', this.onSelectObject.bind(this), false); 176 | } 177 | return this; 178 | } 179 | 180 | // 记录鼠标初始位置 181 | remenberXY(event: MouseEvent) { 182 | if (event.button != 0) 183 | return; 184 | else { 185 | this.MuseXY.X = event.screenX; 186 | this.MuseXY.Y = event.screenY; 187 | } 188 | } 189 | 190 | // 当场景元素设置为“可选”。鼠标点击或者触摸屏点击时执行函数,来处理xxxxxxxxxx选中 191 | onSelectObject(event: MouseEvent) { 192 | if (event.button != 0) 193 | return; 194 | if (event.screenX !== this.MuseXY.X || event.screenY !== this.MuseXY.Y) 195 | return; 196 | this.reDraw(); 197 | // 查找相交的对象 198 | event.preventDefault(); 199 | var mouse = new THREE.Vector2(); 200 | 201 | // TODO: 触屏交互 202 | // mouse.x = ((event).touches[0].clientX / this.canvasEle.clientWidth) * 2 - 1; 203 | // mouse.y = -((event).touches[0].clientY / this.canvasEle.clientHeight) * 2 + 1; 204 | mouse.x = ((event).clientX / this.canvasEle.clientWidth) * 2 - 1; 205 | mouse.y = -((event).clientY / this.canvasEle.clientHeight) * 2 + 1; 206 | 207 | var vector = new THREE.Vector3(mouse.x, mouse.y, 1); 208 | vector.unproject(this.camera); 209 | 210 | this.rayCaster.set(this.camera.position, vector.sub(this.camera.position).normalize()); 211 | 212 | let intersects = this.rayCaster.intersectObjects(this.scene.children); 213 | 214 | // 有可选中的obj 215 | if (intersects.length > 0) { 216 | for (var i = 0; i < intersects.length; i++) { 217 | let selectedObj = intersects[i].object; 218 | if (selectedObj instanceof Room) { 219 | // 恢复为以前的颜色 220 | if (this.selectedObj) { 221 | this.selectedObj.material.color.setHex(this.selectedObj.currentHex); 222 | } 223 | this.selectedObj = selectedObj as Room; 224 | this.selectedObj = intersects[i].object as Room; 225 | // 存储当前颜色 226 | this.selectedObj.currentHex = this.selectedObj.material.color.getHex(); 227 | // 设置新的选中颜色 228 | this.selectedObj.material.color = new THREE.Color(this.selectedColor); 229 | if (this.selectionListener) { 230 | this.selectionListener(this.selectedObj.id); //notify the listener 231 | } 232 | break; 233 | } 234 | } 235 | } 236 | } 237 | 238 | /** 239 | * 标识重新场景改变,出发animate重新绘制 240 | */ 241 | reDraw() { 242 | this.sceneChanged = true; 243 | } 244 | } -------------------------------------------------------------------------------- /src/base/Mall.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from "three"; 2 | import { Box } from './Box' 3 | /** 4 | * 建筑物(集市、商场等),包括多层 [[Floor]] 5 | */ 6 | export interface Mall extends Box { 7 | arrVector2: Array; 8 | floor: number; 9 | floors: number; 10 | center: Array; 11 | } -------------------------------------------------------------------------------- /src/base/Room.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three' 2 | 3 | export class Room extends THREE.Mesh { 4 | roomId: number; 5 | roomType: string; 6 | currentHex: number; 7 | material: THREE.MeshLambertMaterial; 8 | constructor(geom: THREE.ExtrudeGeometry, material: THREE.MeshLambertMaterial) { 9 | super(geom, material); 10 | } 11 | } -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Indoor-Map 8 | 9 | 10 | 11 |

Loading...

12 | 13 | 14 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { IndoorMap } from "./base/IndoorMap"; 2 | import './assets/css/indoor3D.css'; 3 | // import { IndoorMap } from "./base/IndoorMap"; 4 | 5 | var indoorMap = new IndoorMap({ 6 | dataUrl: 'assets/data/mall.1.json', 7 | // dataUrl: 'assets/data/testMapData.json', 8 | selectable: true, 9 | mapDiv: "" 10 | }); 11 | 12 | indoorMap.setSelectListen(function (obj: any) { 13 | console.log(obj); 14 | }) 15 | 16 | console.log('start compile !') -------------------------------------------------------------------------------- /src/themes/DefaultTheme.ts: -------------------------------------------------------------------------------- 1 | import { System } from '../utils/System' 2 | import { TYPE } from '../GeoJson/type'; 3 | 4 | export class DefaultTheme { 5 | 6 | 7 | // 样式名称 8 | name = "default"; 9 | 10 | // 场景背景色 11 | background = "#F2F2F2"; 12 | 13 | // 房间被选中的样式 14 | selectedColor = "#39FAFA"; 15 | 16 | // 建筑物样式 17 | building = { 18 | color: "#000000", 19 | opacity: 0.1, 20 | transparent: true, 21 | depthTest: false 22 | } 23 | 24 | // 楼层样式 25 | floor = { 26 | color: "#E0E0E0", 27 | opacity: 1, 28 | transparent: false 29 | } 30 | 31 | 32 | // 房间结构线样式 33 | strokeStyle = { 34 | color: "#5C4433", 35 | opacity: 0.5, 36 | transparent: true, 37 | linewidth: 1 38 | } 39 | 40 | // 字体样式 41 | fontStyle = { 42 | color: "#231815", 43 | fontsize: 40, 44 | fontface: "Helvetica, MicrosoftYaHei " 45 | } 46 | 47 | room(type?: string) { 48 | let style; 49 | 50 | switch (type) { 51 | case TYPE[0]: 52 | // floor 53 | style = { 54 | color: "#4274BB", 55 | opacity: 0.7, 56 | transparent: true 57 | }; 58 | break; 59 | case TYPE[1]: 60 | // 电梯 61 | style = { 62 | color: "#E60045", 63 | opacity: 0.7, 64 | transparent: true 65 | }; 66 | break; 67 | case TYPE[2]: 68 | // 专卖店 69 | style = { 70 | color: "#A40282", 71 | opacity: 0.7, 72 | transparent: true 73 | }; 74 | break; 75 | case TYPE[3]: 76 | // 3C数码 77 | style = { 78 | color: "#AA5C40", 79 | opacity: 0.7, 80 | transparent: true 81 | }; 82 | break; 83 | case TYPE[4]: 84 | // 服装店 85 | style = { 86 | color: "#67C567", 87 | opacity: 0.7, 88 | transparent: true 89 | }; 90 | break; 91 | case TYPE[5]: 92 | // 超市 93 | style = { 94 | color: "#FF8400", 95 | opacity: 0.7, 96 | transparent: true 97 | }; 98 | break; 99 | case TYPE[6]: 100 | // 商场大楼 101 | style = { 102 | color: "#8156FA", 103 | opacity: 0.7, 104 | transparent: true 105 | }; 106 | break; 107 | case TYPE[7]: 108 | // 洗手间 109 | style = { 110 | color: "#FF84C6", 111 | opacity: 0.7, 112 | transparent: true 113 | }; 114 | break; 115 | default: 116 | style = { 117 | color: "#AAAAAA", 118 | opacity: 0.7, 119 | transparent: true 120 | }; 121 | break; 122 | } 123 | return style; 124 | } 125 | 126 | // 图标路径 127 | pubPointImg = { 128 | "11001": System.imgPath + "/toilet.png", 129 | "11002": System.imgPath + "/ATM.png", 130 | "21001": System.imgPath + "/stair.png", 131 | "22006": System.imgPath + "/entry.png", 132 | "21002": System.imgPath + "/escalator.png", 133 | "21003": System.imgPath + "/lift.png" 134 | } 135 | } -------------------------------------------------------------------------------- /src/three/OrbitControls.js: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | 3 | /** 4 | * OrbitControls for mouse and keyboard controls. 5 | * Changes to turn it into a three.js module for bundling. 6 | * @author qiao / https://github.com/qiao 7 | * @author mrdoob / http://mrdoob.com 8 | * @author alteredq / http://alteredqualia.com/ 9 | * @author WestLangley / http://github.com/WestLangley 10 | * @author erich666 / http://erichaines.com 11 | * @author danrossi / https://www.electroteque.org 12 | */ 13 | 14 | // This set of controls performs orbiting, dollying (zooming), and panning. 15 | // Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). 16 | // 17 | // Orbit - left mouse / touch: one finger move 18 | // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish 19 | // Pan - right mouse, or arrow keys / touch: three finter swipe 20 | 21 | 22 | const EPS = 0.000001, 23 | STATE = { 24 | NONE: -1, 25 | ROTATE: 0, 26 | DOLLY: 1, 27 | PAN: 2, 28 | TOUCH_ROTATE: 3, 29 | TOUCH_DOLLY: 4, 30 | TOUCH_PAN: 5 31 | }; 32 | 33 | class OrbitControls extends THREE.EventDispatcher { 34 | constructor(object, domElement) { 35 | 36 | super(); 37 | 38 | this.object = object, 39 | this.domElement = (domElement !== undefined) ? domElement : document, 40 | // Set to false to disable this control 41 | this.enabled = true; 42 | // "target" sets the location of focus, where the object orbits around 43 | this.target = new THREE.Vector3(), 44 | // How far you can dolly in and out ( PerspectiveCamera only ) 45 | this.minDistance = 0, 46 | this.maxDistance = Infinity, 47 | // How far you can zoom in and out ( OrthographicCamera only ) 48 | this.minZoom = 0, 49 | this.maxZoom = Infinity, 50 | // How far you can orbit vertically, upper and lower limits. 51 | // Range is 0 to Math.PI radians. 52 | this.minPolarAngle = 0, // radians 53 | this.maxPolarAngle = Math.PI, // radians 54 | // How far you can orbit horizontally, upper and lower limits. 55 | // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. 56 | this.minAzimuthAngle = -Infinity, // radians 57 | this.maxAzimuthAngle = Infinity, // radians 58 | // Set to true to enable damping (inertia) 59 | // If damping is enabled, you must call controls.update() in your animation loop 60 | this.enableDamping = false, 61 | this.dampingFactor = 0.25, 62 | //the damping factor for key controls. This needs a more smoother response. 63 | this.keyDampingFactor = 0.10, 64 | // This option actually enables dollying in and out; left as "zoom" for backwards compatibility. 65 | // Set to false to disable zooming 66 | this.enableZoom = true, 67 | this.zoomSpeed = 1.0, 68 | // Set to false to disable rotating 69 | this.enableRotate = true, 70 | this.rotateSpeed = 1.0, 71 | 72 | // Set to false to disable panning 73 | this.enablePan = true, 74 | this.keyPanSpeed = 7.0, // pixels moved per arrow key push 75 | 76 | // Set to true to automatically rotate around the target 77 | // If auto-rotate is enabled, you must call controls.update() in your animation loop 78 | //this.autoRotate = false, 79 | //this.autoRotateSpeed = 2.0, // 30 seconds per round when fps is 60 80 | 81 | // Set to false to disable use of the keys 82 | this.enableKeys = true, 83 | 84 | // The four arrow keys 85 | this.keys = { 86 | left: 37, 87 | up: 38, 88 | right: 39, 89 | bottom: 40 90 | }, 91 | 92 | // Mouse buttons 93 | this.mouseButtons = { 94 | ORBIT: THREE.MOUSE.LEFT, 95 | ZOOM: THREE.MOUSE.MIDDLE, 96 | PAN: THREE.MOUSE.RIGHT 97 | }, 98 | 99 | // for reset 100 | this.target0 = this.target.clone(), 101 | this.position0 = this.object.position.clone(), 102 | this.zoom0 = this.object.zoom, 103 | this.state = STATE.NONE, 104 | // current position in spherical coordinates 105 | this.spherical = new THREE.Spherical(), 106 | this.sphericalDelta = new THREE.Spherical(), 107 | 108 | this.scale = 1, 109 | this.panOffset = new THREE.Vector3(), 110 | this.zoomChanged = false, 111 | 112 | this.rotateStart = new THREE.Vector2(), 113 | this.rotateEnd = new THREE.Vector2(), 114 | this.rotateDelta = new THREE.Vector2(), 115 | 116 | this.panStart = new THREE.Vector2(), 117 | this.panEnd = new THREE.Vector2(), 118 | this.panDelta = new THREE.Vector2(), 119 | 120 | this.dollyStart = new THREE.Vector2(), 121 | this.dollyEnd = new THREE.Vector2(), 122 | this.dollyDelta = new THREE.Vector2(); 123 | 124 | this.connect(); 125 | 126 | // force an update at start 127 | this.update(); 128 | } 129 | 130 | getPolarAngle() { 131 | return this.spherical.phi; 132 | } 133 | 134 | getAzimuthalAngle() { 135 | return this.spherical.theta; 136 | } 137 | 138 | 139 | getAutoRotationAngle() { 140 | return 2 * Math.PI / 60 / 60 * this.autoRotateSpeed; 141 | } 142 | 143 | getZoomScale() { 144 | return Math.pow(0.95, this.zoomSpeed); 145 | } 146 | 147 | rotateLeft(angle) { 148 | this.sphericalDelta.theta -= angle; 149 | } 150 | 151 | rotateUp(angle) { 152 | this.sphericalDelta.phi -= angle; 153 | } 154 | 155 | panLeft(distance, objectMatrix) { 156 | 157 | const v = new THREE.Vector3(); 158 | 159 | v.setFromMatrixColumn(objectMatrix, 0); // get X column of objectMatrix 160 | v.multiplyScalar(-distance); 161 | 162 | this.panOffset.add(v); 163 | } 164 | 165 | panUp(distance, objectMatrix) { 166 | 167 | const v = new THREE.Vector3(); 168 | 169 | v.setFromMatrixColumn(objectMatrix, 1); // get Y column of objectMatrix 170 | v.multiplyScalar(distance); 171 | 172 | this.panOffset.add(v); 173 | } 174 | 175 | // deltaX and deltaY are in pixels; right and down are positive 176 | pan(deltaX, deltaY) { 177 | 178 | const offset = new THREE.Vector3(); 179 | 180 | const element = this.domElement === document ? this.domElement.body : this.domElement; 181 | 182 | if (this.object instanceof THREE.PerspectiveCamera) { 183 | 184 | // perspective 185 | const position = this.object.position; 186 | offset.copy(position).sub(this.target); 187 | let targetDistance = offset.length(); 188 | 189 | // half of the fov is center to top of screen 190 | targetDistance *= Math.tan((this.object.fov / 2) * Math.PI / 180.0); 191 | 192 | // we actually don't use screenWidth, since perspective camera is fixed to screen height 193 | this.panLeft(2 * deltaX * targetDistance / element.clientHeight, this.object.matrix); 194 | this.panUp(2 * deltaY * targetDistance / element.clientHeight, this.object.matrix); 195 | 196 | } else if (this.object instanceof THREE.OrthographicCamera) { 197 | 198 | // orthographic 199 | this.panLeft(deltaX * (this.object.right - this.object.left) / this.object.zoom / element.clientWidth, this.object.matrix); 200 | this.panUp(deltaY * (this.object.top - this.object.bottom) / this.object.zoom / element.clientHeight, this.object.matrix); 201 | 202 | } else { 203 | 204 | // camera neither orthographic nor perspective 205 | //console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' ); 206 | this.enablePan = false; 207 | 208 | } 209 | 210 | 211 | } 212 | 213 | dollyIn(dollyScale) { 214 | 215 | if (this.object instanceof THREE.PerspectiveCamera) { 216 | 217 | this.scale /= dollyScale; 218 | 219 | } else if (this.object instanceof THREE.OrthographicCamera) { 220 | 221 | this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom * dollyScale)); 222 | this.object.updateProjectionMatrix(); 223 | this.zoomChanged = true; 224 | 225 | } else { 226 | 227 | //console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); 228 | this.enableZoom = false; 229 | 230 | } 231 | 232 | } 233 | 234 | dollyOut(dollyScale) { 235 | 236 | if (this.object instanceof THREE.PerspectiveCamera) { 237 | 238 | this.scale *= dollyScale; 239 | 240 | } else if (this.object instanceof THREE.OrthographicCamera) { 241 | 242 | this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / dollyScale)); 243 | this.object.updateProjectionMatrix(); 244 | this.zoomChanged = true; 245 | 246 | } else { 247 | 248 | //console.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' ); 249 | this.enableZoom = false; 250 | 251 | } 252 | 253 | } 254 | 255 | 256 | /** 257 | * Vertical auto rotation 258 | * @param speed 259 | */ 260 | rotateVertical(speed) { 261 | this.rotateUp(THREE.Math.degToRad(speed)); 262 | this.update(); 263 | } 264 | 265 | /** 266 | * Horizontal audo rotation 267 | * @param speed 268 | */ 269 | rotateHorizontal(speed) { 270 | this.rotateLeft(THREE.Math.degToRad(speed)); 271 | this.update(); 272 | } 273 | 274 | setKeyDampingFactor() { 275 | this.dampingFactor = this.keyDampingFactor; 276 | } 277 | 278 | 279 | /** 280 | * Rotate left api 281 | */ 282 | moveLeft() { 283 | this.setKeyDampingFactor(); 284 | this.rotateHorizontal(this.rotateSpeed); 285 | } 286 | 287 | /** 288 | * Rotate right api 289 | */ 290 | moveRight() { 291 | this.setKeyDampingFactor(); 292 | this.rotateHorizontal(-this.rotateSpeed); 293 | } 294 | 295 | /** 296 | * Rotate down api 297 | */ 298 | moveDown() { 299 | this.setKeyDampingFactor(); 300 | this.rotateVertical(-this.rotateSpeed); 301 | } 302 | 303 | /** 304 | * Rotate up api 305 | */ 306 | moveUp() { 307 | this.setKeyDampingFactor(); 308 | this.rotateVertical(this.rotateSpeed); 309 | } 310 | 311 | 312 | 313 | 314 | /** 315 | * Keyboard controls with auto rotation 316 | * @param event 317 | */ 318 | handleKeyDown(event) { 319 | 320 | //for video textures we want to rotate not pan 321 | 322 | 323 | switch (event.keyCode) { 324 | 325 | case this.keys.up: 326 | this.moveUp(); 327 | break; 328 | 329 | case this.keys.bottom: 330 | this.moveDown(); 331 | break; 332 | 333 | case this.keys.left: 334 | this.moveLeft(); 335 | break; 336 | 337 | case this.keys.right: 338 | this.moveRight(); 339 | break; 340 | 341 | } 342 | } 343 | 344 | 345 | handleTouchStartRotate(event) { 346 | //console.log( 'handleTouchStartRotate' ); 347 | this.rotateStart.set(event.touches[0].pageX, event.touches[0].pageY); 348 | } 349 | 350 | handleTouchStartDolly(event) { 351 | //console.log( 'handleTouchStartDolly' ); 352 | const dx = event.touches[0].pageX - event.touches[1].pageX, 353 | dy = event.touches[0].pageY - event.touches[1].pageY, 354 | distance = Math.sqrt(dx * dx + dy * dy); 355 | 356 | this.dollyStart.set(0, distance); 357 | } 358 | 359 | handleTouchStartPan(event) { 360 | //console.log( 'handleTouchStartPan' ); 361 | this.panStart.set(event.touches[0].pageX, event.touches[0].pageY); 362 | 363 | } 364 | 365 | handleTouchMoveRotate(event) { 366 | //console.log( 'handleTouchMoveRotate' ); 367 | this.rotateEnd.set(event.touches[0].pageX, event.touches[0].pageY); 368 | this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart); 369 | 370 | const element = this.domElement === document ? this.domElement.body : this.domElement; 371 | 372 | // rotating across whole screen goes 360 degrees around 373 | this.rotateLeft(2 * Math.PI * this.rotateDelta.x / element.clientWidth * this.rotateSpeed); 374 | 375 | // rotating up and down along whole screen attempts to go 360, but limited to 180 376 | this.rotateUp(2 * Math.PI * this.rotateDelta.y / element.clientHeight * this.rotateSpeed); 377 | 378 | this.rotateStart.copy(this.rotateEnd); 379 | 380 | this.update(); 381 | } 382 | 383 | handleTouchMoveDolly(event) { 384 | 385 | //console.log( 'handleTouchMoveDolly' ); 386 | 387 | const dx = event.touches[0].pageX - event.touches[1].pageX, 388 | dy = event.touches[0].pageY - event.touches[1].pageY, 389 | distance = Math.sqrt(dx * dx + dy * dy); 390 | 391 | this.dollyEnd.set(0, distance); 392 | 393 | this.dollyDelta.subVectors(this.dollyEnd, this.dollyStart); 394 | 395 | if (this.dollyDelta.y > 0) { 396 | 397 | this.dollyOut(this.getZoomScale()); 398 | 399 | } else if (this.dollyDelta.y < 0) { 400 | 401 | this.dollyIn(this.getZoomScale()); 402 | 403 | } 404 | 405 | this.dollyStart.copy(this.dollyEnd); 406 | 407 | this.update(); 408 | 409 | } 410 | 411 | handleTouchMovePan(event) { 412 | 413 | //console.log( 'handleTouchMovePan' ); 414 | 415 | this.panEnd.set(event.touches[0].pageX, event.touches[0].pageY); 416 | 417 | this.panDelta.subVectors(this.panEnd, this.panStart); 418 | 419 | this.pan(this.panDelta.x, this.panDelta.y); 420 | 421 | this.panStart.copy(this.panEnd); 422 | 423 | this.update(); 424 | } 425 | 426 | handleTouchEnd(event) { 427 | 428 | //console.log( 'handleTouchEnd' ); 429 | 430 | } 431 | 432 | 433 | onTouchStart(event) { 434 | 435 | if (this.enabled === false) return; 436 | 437 | switch (event.touches.length) { 438 | 439 | case 1: // one-fingered touch: rotate 440 | 441 | if (this.enableRotate === false) return; 442 | 443 | this.handleTouchStartRotate(event); 444 | 445 | this.state = STATE.TOUCH_ROTATE; 446 | 447 | break; 448 | 449 | case 2: // two-fingered touch: dolly 450 | 451 | if (this.enableZoom === false) return; 452 | 453 | this.handleTouchStartDolly(event); 454 | 455 | this.state = STATE.TOUCH_DOLLY; 456 | 457 | break; 458 | 459 | case 3: // three-fingered touch: pan 460 | 461 | if (this.enablePan === false) return; 462 | 463 | this.handleTouchStartPan(event); 464 | 465 | this.state = STATE.TOUCH_PAN; 466 | 467 | break; 468 | 469 | default: 470 | 471 | this.state = STATE.NONE; 472 | 473 | } 474 | 475 | if (this.state !== STATE.NONE) { 476 | 477 | const onTouchMoveCheck = () => { 478 | this.domElement.removeEventListener('touchmove', onTouchMoveCheck); 479 | this.dispatchStart(); 480 | }; 481 | 482 | this.domElement.addEventListener('touchmove', onTouchMoveCheck); 483 | } 484 | 485 | } 486 | 487 | onTouchMove(event) { 488 | 489 | if (this.enabled === false) return; 490 | 491 | event.preventDefault(); 492 | event.stopPropagation(); 493 | 494 | switch (event.touches.length) { 495 | 496 | case 1: // one-fingered touch: rotate 497 | 498 | if (this.enableRotate === false) return; 499 | //if ( this.state !== STATE.TOUCH_ROTATE ) return; // is this needed?... 500 | 501 | 502 | //console.log("HANDLE ROTATE"); 503 | 504 | this.handleTouchMoveRotate(event); 505 | 506 | break; 507 | 508 | case 2: // two-fingered touch: dolly 509 | 510 | //console.log("HANDLE DOLLY"); 511 | 512 | if (this.enableZoom === false) return; 513 | //if ( this.state !== STATE.TOUCH_DOLLY ) return; // is this needed?... 514 | 515 | this.handleTouchMoveDolly(event); 516 | 517 | break; 518 | 519 | case 3: // three-fingered touch: pan 520 | 521 | if (this.enablePan === false) return; 522 | //if ( this.state !== STATE.TOUCH_PAN ) return; // is this needed?... 523 | 524 | this.handleTouchMovePan(event); 525 | 526 | break; 527 | 528 | default: 529 | 530 | this.state = STATE.NONE; 531 | 532 | } 533 | 534 | } 535 | 536 | onTouchEnd(event) { 537 | 538 | if (this.enabled === false) return; 539 | 540 | this.handleTouchEnd(event); 541 | 542 | this.dispatchEnd(); 543 | 544 | this.state = STATE.NONE; 545 | 546 | } 547 | 548 | 549 | handleMouseDownRotate(event) { 550 | 551 | //console.log( 'handleMouseDownRotate' ); 552 | 553 | this.rotateStart.set(event.clientX, event.clientY); 554 | 555 | } 556 | 557 | handleMouseDownDolly(event) { 558 | 559 | //console.log( 'handleMouseDownDolly' ); 560 | 561 | this.dollyStart.set(event.clientX, event.clientY); 562 | 563 | } 564 | 565 | handleMouseDownPan(event) { 566 | 567 | //console.log( 'handleMouseDownPan' ); 568 | 569 | this.panStart.set(event.clientX, event.clientY); 570 | } 571 | 572 | handleMouseMoveRotate(event) { 573 | 574 | //console.log( 'handleMouseMoveRotate' ); 575 | 576 | this.rotateEnd.set(event.clientX, event.clientY); 577 | this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart); 578 | 579 | //const element = this.domElement === document ? this.domElement.body : this.domElement; 580 | 581 | //use the mouse target not the renderer element. 582 | const element = this.domElement === document ? this.domElement.body : event.target; 583 | 584 | // rotating across whole screen goes 360 degrees around 585 | this.rotateLeft(2 * Math.PI * this.rotateDelta.x / element.clientWidth * this.rotateSpeed); 586 | 587 | // rotating up and down along whole screen attempts to go 360, but limited to 180 588 | this.rotateUp(2 * Math.PI * this.rotateDelta.y / element.clientHeight * this.rotateSpeed); 589 | 590 | this.rotateStart.copy(this.rotateEnd); 591 | 592 | this.update(); 593 | 594 | } 595 | 596 | handleMouseMoveDolly(event) { 597 | 598 | //console.log( 'handleMouseMoveDolly' ); 599 | 600 | this.dollyEnd.set(event.clientX, event.clientY); 601 | 602 | this.dollyDelta.subVectors(this.dollyEnd, this.dollyStart); 603 | 604 | if (this.dollyDelta.y > 0) { 605 | 606 | this.dollyIn(this.getZoomScale()); 607 | 608 | } else if (this.dollyDelta.y < 0) { 609 | 610 | this.dollyOut(this.getZoomScale()); 611 | 612 | } 613 | 614 | this.dollyStart.copy(this.dollyEnd); 615 | 616 | this.update(); 617 | 618 | } 619 | 620 | handleMouseMovePan(event) { 621 | 622 | //console.log( 'handleMouseMovePan' ); 623 | 624 | this.panEnd.set(event.clientX, event.clientY); 625 | 626 | this.panDelta.subVectors(this.panEnd, this.panStart); 627 | 628 | this.pan(this.panDelta.x, this.panDelta.y); 629 | 630 | this.panStart.copy(this.panEnd); 631 | 632 | this.update(); 633 | 634 | } 635 | 636 | 637 | handleMouseUp(event) { 638 | 639 | //console.log( 'handleMouseUp' ); 640 | 641 | } 642 | 643 | handleMouseWheel(event) { 644 | 645 | //console.log( 'handleMouseWheel' ); 646 | 647 | let delta = 0; 648 | 649 | if (event.wheelDelta !== undefined) { 650 | 651 | // WebKit / Opera / Explorer 9 652 | 653 | delta = event.wheelDelta; 654 | 655 | } else if (event.detail !== undefined) { 656 | 657 | // Firefox 658 | 659 | delta = -event.detail; 660 | 661 | } 662 | 663 | if (delta > 0) { 664 | 665 | this.dollyOut(this.getZoomScale()); 666 | 667 | } else if (delta < 0) { 668 | 669 | this.dollyIn(this.getZoomScale()); 670 | 671 | } 672 | 673 | this.update(); 674 | 675 | } 676 | 677 | // 678 | // event handlers - FSM: listen for events and reset state 679 | // 680 | /* 681 | onElemMouseDown(event) { 682 | 683 | if (event.target !== this.domElement) return; 684 | this.onMouseDown(event); 685 | }*/ 686 | 687 | onMouseDown(event) { 688 | 689 | if (this.enabled === false) return; 690 | 691 | //disable events when triggered by overlayed elements. 692 | if (this.domElement !== event.target) return; 693 | 694 | event.preventDefault(); 695 | 696 | //reset the damping factor for mouse controls 697 | this.dampingFactor = this.mouseDampingFactor; 698 | 699 | this.activeElement = event.target; 700 | 701 | 702 | switch (event.button) { 703 | case this.mouseButtons.ORBIT: 704 | if (this.enableRotate === false) return; 705 | 706 | this.handleMouseDownRotate(event); 707 | 708 | this.state = STATE.ROTATE; 709 | break; 710 | case this.mouseButtons.ZOOM: 711 | if (this.enableZoom === false) return; 712 | 713 | this.handleMouseDownDolly(event); 714 | 715 | this.state = STATE.DOLLY; 716 | break; 717 | case this.mouseButtons.PAN: 718 | if (this.enablePan === false) return; 719 | 720 | this.handleMouseDownPan(event); 721 | 722 | this.state = STATE.PAN; 723 | break; 724 | } 725 | 726 | if (this.state !== STATE.NONE) { 727 | 728 | const onMoveCheck = () => { 729 | this.dispatchStart(); 730 | document.removeEventListener('mousemove', onMoveCheck); 731 | }; 732 | 733 | document.addEventListener('mousemove', onMoveCheck, false); 734 | 735 | document.addEventListener('mousemove', this.onMouseMoveRef, false); 736 | document.addEventListener('mouseup', this.onMouseUpRef, false); 737 | document.addEventListener('mouseout', this.onMouseUpRef, false); 738 | } 739 | 740 | } 741 | 742 | onMouseMove(event) { 743 | 744 | if (this.enabled === false) return; 745 | 746 | event.preventDefault(); 747 | 748 | if (this.state === STATE.ROTATE) { 749 | 750 | if (this.enableRotate === false) return; 751 | 752 | this.handleMouseMoveRotate(event); 753 | 754 | } else if (this.state === STATE.DOLLY) { 755 | 756 | if (this.enableZoom === false) return; 757 | 758 | this.handleMouseMoveDolly(event); 759 | 760 | } else if (this.state === STATE.PAN) { 761 | 762 | if (this.enablePan === false) return; 763 | 764 | this.handleMouseMovePan(event); 765 | 766 | } 767 | 768 | } 769 | 770 | onMouseUp(event) { 771 | 772 | if (this.enabled === false) return; 773 | 774 | this.handleMouseUp(event); 775 | 776 | document.removeEventListener('mousemove', this.onMouseMoveRef, false); 777 | document.removeEventListener('mouseup', this.onMouseUpRef, false); 778 | document.removeEventListener('mouseout', this.onMouseUpRef, false); 779 | 780 | this.dispatchEnd(); 781 | 782 | this.state = STATE.NONE; 783 | 784 | //cancel the active element 785 | this.activeElement = null; 786 | 787 | } 788 | 789 | 790 | onMouseWheel(event) { 791 | 792 | if (this.enabled === false || this.enableZoom === false || (this.state !== STATE.NONE && this.state !== STATE.ROTATE)) return; 793 | 794 | event.preventDefault(); 795 | event.stopPropagation(); 796 | 797 | this.handleMouseWheel(event); 798 | 799 | this.dispatchStart(); 800 | this.dispatchEnd(); 801 | 802 | } 803 | 804 | onKeyDown(event) { 805 | 806 | if (this.enabled === false || this.enableKeys === false) return; 807 | 808 | //set the damping factor for key controls which needs more sensitivity. 809 | this.dampingFactor = this.keyDampingFactor; 810 | 811 | this.handleKeyDown(event); 812 | 813 | } 814 | 815 | onContextMenu(event) { 816 | event.preventDefault(); 817 | } 818 | 819 | connect() { 820 | 821 | this.enabled = true; 822 | 823 | //reset the controls for when switching out of VRControls 824 | this.reset(); 825 | 826 | this.domElement.addEventListener('contextmenu', this.onContextMenu, false); 827 | 828 | this.onMouseDownRef = (event) => this.onMouseDown(event), 829 | this.onMouseWheelRef = (event) => this.onMouseWheel(event), 830 | this.onMouseWheelRef = (event) => this.onMouseWheel(event), 831 | this.onMouseMoveRef = (event) => this.onMouseMove(event), 832 | this.onMouseUpRef = (event) => this.onMouseUp(event), 833 | this.onTouchStartRef = (event) => this.onTouchStart(event), 834 | this.onTouchEndRef = (event) => this.onTouchEnd(event), 835 | this.onTouchMoveRef = (event) => this.onTouchMove(event), 836 | this.onKeyDownRef = (event) => this.onKeyDown(event); 837 | 838 | this.domElement.addEventListener('mousedown', this.onMouseDownRef, false); 839 | this.domElement.addEventListener('mousewheel', this.onMouseWheelRef, false); 840 | this.domElement.addEventListener('MozMousePixelScroll', this.onMouseWheelRef, false); // firefox 841 | this.domElement.addEventListener('touchstart', this.onTouchStartRef, false); 842 | this.domElement.addEventListener('touchend', this.onTouchEndRef, false); 843 | this.domElement.addEventListener('touchmove', this.onTouchMoveRef, false); 844 | 845 | window.addEventListener('keydown', this.onKeyDownRef, false); 846 | 847 | } 848 | 849 | disconnect() { 850 | 851 | this.enabled = false; 852 | 853 | //reset the controls for when switching to VRControls 854 | this.reset(); 855 | 856 | this.domElement.removeEventListener('contextmenu', this.onContextMenu, false); 857 | this.domElement.removeEventListener('mousedown', this.onMouseDownRef, false); 858 | this.domElement.removeEventListener('mousewheel', this.onMouseWheelRef, false); 859 | this.domElement.removeEventListener('MozMousePixelScroll', this.onMouseWheelRef, false); // firefox 860 | 861 | this.domElement.removeEventListener('touchstart', this.onTouchStartRef, false); 862 | this.domElement.removeEventListener('touchend', this.onTouchEndRef, false); 863 | this.domElement.removeEventListener('touchmove', this.onTouchMoveRef, false); 864 | 865 | document.removeEventListener('mousemove', this.onMouseMove, false); 866 | document.removeEventListener('mouseup', this.onMouseUp, false); 867 | 868 | window.removeEventListener('keydown', this.onKeyDown, false); 869 | 870 | //this.dispatchEvent( { type: 'dispose' } ); // should this be added here? 871 | 872 | } 873 | 874 | saveState() { 875 | 876 | this.target0.copy(this.target); 877 | this.position0.copy(this.object.position); 878 | this.zoom0 = this.object.zoom; 879 | 880 | } 881 | 882 | reset() { 883 | 884 | this.target.copy(this.target0); 885 | this.object.position.copy(this.position0); 886 | this.object.zoom = this.zoom0; 887 | 888 | this.object.updateProjectionMatrix(); 889 | this.dispatchChange(); 890 | 891 | this.update(); 892 | 893 | this.state = STATE.NONE; 894 | 895 | } 896 | 897 | // this method is exposed, but perhaps it would be better if we can make it private... 898 | update() { 899 | 900 | const offset = new THREE.Vector3(), 901 | 902 | // so camera.up is the orbit axis 903 | quat = new THREE.Quaternion().setFromUnitVectors(this.object.up, new THREE.Vector3(0, 1, 0)), 904 | quatInverse = quat.clone().inverse(), 905 | lastPosition = new THREE.Vector3(), 906 | lastQuaternion = new THREE.Quaternion(), 907 | position = this.object.position; 908 | 909 | offset.copy(position).sub(this.target); 910 | 911 | // rotate offset to "y-axis-is-up" space 912 | offset.applyQuaternion(quat); 913 | 914 | // angle from z-axis around y-axis 915 | this.spherical.setFromVector3(offset); 916 | 917 | /*if ( this.autoRotate && this.state === STATE.NONE ) { 918 | 919 | rotateLeft( getAutoRotationAngle() ); 920 | 921 | }*/ 922 | 923 | this.spherical.theta += this.sphericalDelta.theta; 924 | this.spherical.phi += this.sphericalDelta.phi; 925 | 926 | // restrict theta to be between desired limits 927 | this.spherical.theta = Math.max(this.minAzimuthAngle, Math.min(this.maxAzimuthAngle, this.spherical.theta)); 928 | 929 | // restrict phi to be between desired limits 930 | this.spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this.spherical.phi)); 931 | 932 | this.spherical.makeSafe(); 933 | 934 | 935 | this.spherical.radius *= this.scale; 936 | 937 | // restrict radius to be between desired limits 938 | this.spherical.radius = Math.max(this.minDistance, Math.min(this.maxDistance, this.spherical.radius)); 939 | 940 | // move target to panned location 941 | this.target.add(this.panOffset); 942 | 943 | offset.setFromSpherical(this.spherical); 944 | 945 | // rotate offset back to "camera-up-vector-is-up" space 946 | offset.applyQuaternion(quatInverse); 947 | 948 | position.copy(this.target).add(offset); 949 | 950 | this.object.lookAt(this.target); 951 | 952 | if (this.enableDamping === true) { 953 | 954 | this.sphericalDelta.theta *= (1 - this.dampingFactor); 955 | this.sphericalDelta.phi *= (1 - this.dampingFactor); 956 | 957 | } else { 958 | 959 | this.sphericalDelta.set(0, 0, 0); 960 | 961 | } 962 | 963 | this.scale = 1; 964 | this.panOffset.set(0, 0, 0); 965 | 966 | // update condition is: 967 | // min(camera displacement, camera rotation in radians)^2 > EPS 968 | // using small-angle approximation cos(x/2) = 1 - x^2 / 8 969 | 970 | if (this.zoomChanged || 971 | lastPosition.distanceToSquared(this.object.position) > EPS || 972 | 8 * (1 - lastQuaternion.dot(this.object.quaternion)) > EPS) { 973 | 974 | this.dispatchChange(); 975 | 976 | lastPosition.copy(this.object.position); 977 | lastQuaternion.copy(this.object.quaternion); 978 | this.zoomChanged = false; 979 | 980 | return true; 981 | 982 | } 983 | 984 | return false; 985 | 986 | } 987 | 988 | dispatchStart() { 989 | this.dispatchEvent({ 990 | type: "start" 991 | }); 992 | } 993 | 994 | dispatchChange() { 995 | this.dispatchEvent({ 996 | type: "change" 997 | }); 998 | } 999 | 1000 | dispatchEnd() { 1001 | this.dispatchEvent({ 1002 | type: "end" 1003 | }); 1004 | } 1005 | 1006 | } 1007 | 1008 | export { 1009 | OrbitControls 1010 | }; -------------------------------------------------------------------------------- /src/utils/Browser.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface Window { opera: any; } 3 | interface Window { PointerEvent: any; } 4 | interface Window { L_DISABLE_3D: any; } 5 | interface Window { L_NO_TOUCH: any; } 6 | interface Window { WebKitCSSMatrix: any; } 7 | } 8 | 9 | window.opera = window.opera || null; 10 | window.PointerEvent = window.PointerEvent || null; 11 | window.L_DISABLE_3D = window.L_DISABLE_3D || null; 12 | window.L_NO_TOUCH = window.L_NO_TOUCH || null; 13 | window.WebKitCSSMatrix = window.WebKitCSSMatrix || null; 14 | 15 | let browser; 16 | // 浏览器版本及3d支持检测 17 | (function () { 18 | var a = "ActiveXObject" in window, 19 | c = a && !document.addEventListener, 20 | e = navigator.userAgent.toLowerCase(), 21 | f = -1 !== e.indexOf("webkit"), 22 | m = -1 !== e.indexOf("chrome"), 23 | p = -1 !== e.indexOf("phantom"), 24 | isAndroid = -1 !== e.indexOf("android"), 25 | r = -1 !== e.search("android [23]"), 26 | gecko = -1 !== e.indexOf("gecko"), 27 | isIphone = -1 !== e.indexOf("iphone"), 28 | isSymbianOS = -1 !== e.indexOf("symbianos"), 29 | isWinPhone = -1 !== e.indexOf("windows phone"), 30 | isIpad = -1 !== e.indexOf("ipad"), 31 | k = isIphone || isWinPhone || isSymbianOS || isAndroid || isIpad, 32 | q = window.navigator && window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints && !window.PointerEvent, 33 | t = window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints || q, 34 | y = "devicePixelRatio" in window && 1 < window.devicePixelRatio || "matchMedia" in window && window.matchMedia("(min-resolution:144dppi)") && 35 | window.matchMedia("(min-resolution:144dppi)").matches, 36 | l = document.documentElement, 37 | A = a && "transition" in l.style, 38 | x = "WebKitCSSMatrix" in window && "m11" in new window.WebKitCSSMatrix && !r, 39 | B = "MozPerspective" in l.style, 40 | z = "OTransition" in l.style, 41 | G = !window.L_DISABLE_3D && (A || x || B || z) && !p, 42 | p = !window.L_NO_TOUCH && !p && function () { 43 | if (t || "ontouchstart" in l) return !0; 44 | var a = document.createElement("div"), 45 | c = !1; 46 | if (!a.setAttribute) return !1; 47 | a.setAttribute("ontouchstart", "return;"); 48 | "function" === typeof a.ontouchstart && (c = !0); 49 | a.removeAttribute("ontouchstart"); 50 | return c 51 | }(); 52 | browser = { 53 | ie: a, 54 | ielt9: c, 55 | webkit: f, 56 | gecko: gecko && !f && !window.opera && !a, 57 | android: isAndroid, 58 | android23: r, 59 | iphone: isIphone, 60 | ipad: isIpad, 61 | symbian: isSymbianOS, 62 | winphone: isWinPhone, 63 | chrome: m, 64 | ie3d: A, 65 | webkit3d: x, 66 | gecko3d: B, 67 | opera3d: z, 68 | any3d: G, 69 | mobile: k, 70 | mobileWebkit: k && f, 71 | mobileWebkit3d: k && x, 72 | mobileOpera: k && window.opera, 73 | touch: p, 74 | msPointer: q, 75 | pointer: t, 76 | retina: y 77 | } 78 | }()); 79 | 80 | export const Browser = browser; -------------------------------------------------------------------------------- /src/utils/DataParse.ts: -------------------------------------------------------------------------------- 1 | import * as THREE from 'three'; 2 | 3 | export class DataParse { 4 | // 把json中的坐标数组转换为 THREE.Vector2 5 | static parsePoints(pointArray: Array): Array { 6 | 7 | let shapePoints: Array = []; 8 | for (var i = 0; i < pointArray.length; i += 2) { 9 | var point = new THREE.Vector2(pointArray[i], pointArray[i + 1]); 10 | if (i > 0) { 11 | var lastpoint = shapePoints[shapePoints.length - 1]; 12 | // 去除重复点 13 | if (point.x != lastpoint.x || point.y != lastpoint.y) { 14 | shapePoints.push(point); 15 | } 16 | } else { 17 | shapePoints.push(point); 18 | } 19 | } 20 | return shapePoints; 21 | } 22 | } -------------------------------------------------------------------------------- /src/utils/Detector.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface Window { CanvasRenderingContext2D: any; } 3 | interface Window { WebGLRenderingContext: any; } 4 | interface Window { Worker: any; } 5 | interface Window { File: any; } 6 | interface Window { FileReader: any; } 7 | interface Window { FileList: any; } 8 | } 9 | 10 | window.CanvasRenderingContext2D = window.CanvasRenderingContext2D || null; 11 | window.WebGLRenderingContext = window.WebGLRenderingContext || null; 12 | window.Worker = window.Worker || null; 13 | window.File = window.File || null; 14 | window.FileReader = window.FileReader || null; 15 | window.FileList = window.FileList || null; 16 | 17 | export class Detector { 18 | 19 | static webgl: boolean = Detector.isWebGL(); 20 | canvas: boolean = !!window.CanvasRenderingContext2D; 21 | workers: boolean = !!window.Worker; 22 | fileapi: boolean = !!(window.File && window.FileReader && window.FileList && window.Blob); 23 | 24 | static isWebGL(): boolean { 25 | try { 26 | return !!window.WebGLRenderingContext && !!document.createElement('canvas').getContext('experimental-webgl'); 27 | } catch (e) { 28 | return false; 29 | } 30 | } 31 | 32 | 33 | getWebGLErrorMessage() { 34 | 35 | var element = document.createElement('div'); 36 | element.id = 'webgl-error-message'; 37 | element.style.fontFamily = 'monospace'; 38 | element.style.fontSize = '13px'; 39 | element.style.fontWeight = 'normal'; 40 | element.style.textAlign = 'center'; 41 | element.style.background = '#fff'; 42 | element.style.color = '#000'; 43 | element.style.padding = '1.5em'; 44 | element.style.width = '400px'; 45 | element.style.margin = '5em auto 0'; 46 | 47 | if (!Detector.webgl) { 48 | element.innerHTML = window.WebGLRenderingContext ? [ 49 | 'Your graphics card does not seem to support WebGL.
', 50 | 'Find out how to get it here.' 51 | ].join('\n') : [ 52 | 'Your browser does not seem to support WebGL.
', 53 | 'Find out how to get it here.' 54 | ].join('\n'); 55 | 56 | } 57 | 58 | return element; 59 | 60 | } 61 | 62 | addGetWebGLMessage(parameters: any) { 63 | 64 | var parent, id, element; 65 | 66 | parameters = parameters || {}; 67 | 68 | parent = parameters.parent !== undefined ? parameters.parent : document.body; 69 | id = parameters.id !== undefined ? parameters.id : 'oldie'; 70 | 71 | element = this.getWebGLErrorMessage(); 72 | element.id = id; 73 | 74 | parent.appendChild(element); 75 | 76 | } 77 | 78 | } 79 | -------------------------------------------------------------------------------- /src/utils/DomUtil.ts: -------------------------------------------------------------------------------- 1 | import { Browser } from './Browser'; 2 | 3 | export class DomUtil { 4 | 5 | // CSS3 transform 转换结果 6 | TRANSFORM = this.testProp(["transform", "WebkitTransform", "OTransform", "MozTransform", "msTransform"]); 7 | // CSS3 transition 变换过程 8 | TRANSITION = this.testProp(["webkitTransition", "transition", "OTransition", "MozTransition", "msTransition"]); 9 | TRANSITION_END = "webkitTransition" === this.TRANSITION || "OTransition" === this.TRANSITION ? this.TRANSITION + "End" : "transitionend"; 10 | 11 | // 根据 [width,height] 创建根元素 12 | // TODO: 后续优化为 创建任意指定属性、类型的元素 13 | static createRootEle(): HTMLElement { 14 | let rootEle = document.createElement('div'); 15 | rootEle.style.width = '100%'; 16 | rootEle.style.height = '100%'; 17 | rootEle.style.top = '0px'; 18 | rootEle.style.left = '0px'; 19 | rootEle.style.position = 'absolute'; 20 | rootEle.style.overflow = "hidden" 21 | rootEle.id = 'indoor3d'; 22 | document.body.appendChild(rootEle); 23 | document.body.style.margin = '0'; 24 | return rootEle; 25 | } 26 | 27 | // 根据 [width,height] 创建根元素 28 | // TODO: 后续优化为 创建任意指定属性、类型的元素 29 | static createCanvasEle(pEle: HTMLElement): HTMLCanvasElement { 30 | let canvasEle = document.createElement('canvas'); 31 | canvasEle.style.width = '100%'; 32 | canvasEle.style.height = '100%'; 33 | pEle.appendChild(canvasEle); 34 | 35 | createLogoEle(pEle); 36 | 37 | return canvasEle; 38 | 39 | function createLogoEle(pEle: HTMLElement): HTMLElement { 40 | let logoEle = document.createElement('a'); 41 | logoEle.innerText = "三维室内地图"; 42 | logoEle.style.color = "red"; 43 | logoEle.style.width = '100px'; 44 | logoEle.style.height = '20px'; 45 | logoEle.style.bottom = '10px'; 46 | logoEle.style.right = '20px'; 47 | logoEle.style.position = 'absolute'; 48 | pEle.appendChild(logoEle); 49 | return logoEle; 50 | } 51 | } 52 | 53 | // 获取 元素 与 浏览器左侧 的距离 54 | getElementLeft(element: HTMLElement) { 55 | var actualLeft = element.offsetLeft; 56 | var current = element.offsetParent; 57 | while (current !== null) { 58 | actualLeft += current.offsetLeft; 59 | current = current.offsetParent; 60 | } 61 | return actualLeft; 62 | } 63 | 64 | // 获取 元素 与 浏览器顶部 的距离 65 | // TODO 类型完善 66 | getElementTop(element: any) { 67 | 68 | var actualTop = element.offsetTop; 69 | var current = element.offsetParent; 70 | while (current !== null) { 71 | actualTop += current.offsetTop; 72 | current = current.offsetParent; 73 | } 74 | return actualTop; 75 | } 76 | 77 | // 获取 point 的3d转换描述 78 | // TODO: 类型完善 79 | getTranslateString(point: any) { 80 | var dim = Browser.webkit3d; 81 | return "translate" + (dim ? "3d" : "") + "(" + point[0] + "px," + point[1] + "px" + ((dim ? ",0" : "") + ")"); 82 | // translate3d(110px,120px,0) 83 | // translate(110px,120px) 84 | } 85 | 86 | // 获取元素在浏览器中的位置 87 | // TODO 类型完善 88 | getPos(element: any) { 89 | return element._idm_pos ? element._idm_pos : [this.getElementLeft(element), this.getElementTop(element)]; 90 | } 91 | 92 | // 设置元素在浏览器中的位置 93 | // TODO 类型完善 94 | setPos(element: any, point: any) { 95 | element._idm_pos = point; 96 | Browser.any3d ? element.style[this.TRANSFORM] = this.getTranslateString(point) : (element.style.left = point[0] + "px", element.style.top = point[1] + "px") 97 | //element.style.transform = translate3d(110px,120px,0); 98 | // 或者 99 | //element.style.left = point[0] + "px"; 100 | //element.style.top = point[1] + "px"; 101 | } 102 | 103 | // 检测 css3 中 TRANSFORM 支持性 104 | // TODO 类型完善 105 | testProp(props: any) { 106 | for (var c = document.documentElement.style, i = 0; i < props.length; i++) 107 | if (props[i] in c) return props[i]; 108 | return false; 109 | } 110 | 111 | } -------------------------------------------------------------------------------- /src/utils/GeomUtil.ts: -------------------------------------------------------------------------------- 1 | import { Rect } from '../base/Rect'; 2 | 3 | export class GeomUtil { 4 | 5 | // 获取一系列点的 外包矩形Rect 6 | static getBoundingRect = function (points: Array) { 7 | var rect = new Rect(); 8 | //if there are less than 1 point 9 | if (points.length < 2) { 10 | return rect; 11 | } 12 | let minX: number = 9999999; 13 | let minY: number = 9999999; 14 | let maxX: number = -9999999; 15 | let maxY: number = -9999999; 16 | for (var i = 0; i < points.length - 1; i += 2) { 17 | 18 | if (points[i] > maxX) { 19 | maxX = points[i]; 20 | } 21 | if (points[i] < minX) { 22 | minX = points[i]; 23 | } 24 | if (points[i + 1] > maxY) { 25 | maxY = points[i + 1]; 26 | } 27 | if (points[i + 1] < minY) { 28 | minY = points[i + 1]; 29 | } 30 | } 31 | rect.tl = [minX, minY]; 32 | rect.br = [maxX, maxY]; 33 | return rect; 34 | } 35 | 36 | } -------------------------------------------------------------------------------- /src/utils/System.ts: -------------------------------------------------------------------------------- 1 | export class System { 2 | // "http://localhost:8080/index.js" 3 | scriptPath: string = document.scripts[document.scripts.length - 1].src; 4 | // "http://localhost:8080" 5 | static sysPath: string = document.scripts[document.scripts.length - 1].src.substring(0, document.scripts[document.scripts.length - 1].src.lastIndexOf("/")); 6 | // "http://localhost:8080"/assets/img" 7 | static imgPath: string = System.sysPath + "/assets/img"; 8 | 9 | constructor(path: string) { 10 | System.sysPath = path 11 | System.imgPath = path + "/img"; 12 | } 13 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "quotemark": [ 4 | true, 5 | "single" 6 | ], 7 | "curly": [ 8 | true, 9 | "ignore-same-line" 10 | ], 11 | } 12 | } 13 | --------------------------------------------------------------------------------