├── .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 | 
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 |
--------------------------------------------------------------------------------