c80_map_floors 0.2.0.0 → 0.2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -1
- data/app/assets/javascripts/src/main.js +102 -132
- data/app/assets/stylesheets/map.scss +1 -0
- data/bounding_box.jpg +0 -0
- data/lib/c80_map_floors/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2597a223d11b4fb3705f4659ceb15607a297d3f3
|
4
|
+
data.tar.gz: 1c9cd5b88f9585da75b252bf5d0cb3963895ec0c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a63e2caff22da7243b43746bd2cfd92e4e534c58fbcbb89887bdc1667b1dc2ecd1b69d0a6da8cc1e77b78bd58bc5cf7c715d96201b1196356e0e784aff018ef8
|
7
|
+
data.tar.gz: 8d3e8e79f3c92d102c3fa6e97a194a73c810b52c5e08373905d6d0d6fe8219c300aca57cb1d3528b832d3d0b26e61e11e6c6c1860584912e2abb79f6012c71cb
|
data/README.md
CHANGED
@@ -74,13 +74,26 @@ $(document).ready(function() {
|
|
74
74
|
left_padding: 50,
|
75
75
|
right_padding: 50,
|
76
76
|
focus_area_width: 500,
|
77
|
-
focus_area_height: 500
|
77
|
+
focus_area_height: 500,
|
78
|
+
bounding_box: {
|
79
|
+
x: 401,
|
80
|
+
y: 90,
|
81
|
+
width: 3576,
|
82
|
+
height: 2142
|
83
|
+
}
|
78
84
|
});
|
79
85
|
}
|
80
86
|
});
|
81
87
|
```
|
88
|
+
|
89
|
+
Focus area:
|
90
|
+
|
82
91
|
![map padding tuning](map_padding_tuning.jpg)
|
83
92
|
|
93
|
+
Bounding box:
|
94
|
+
|
95
|
+
![bounding box](bounding_box.jpg)
|
96
|
+
|
84
97
|
# Helpers
|
85
98
|
```
|
86
99
|
render_map
|
@@ -13,15 +13,11 @@ var InitMap = function (params) {
|
|
13
13
|
// - to delete start -----------------------------------------------------------------------------------------------------------------------
|
14
14
|
var scale = 0.599999;
|
15
15
|
|
16
|
-
var window_height = $(window).height() - 200;
|
17
|
-
if (window_height < 400) window_height = 400;
|
18
|
-
|
19
|
-
var window_width = $(window).width();
|
20
16
|
var image_width = MAP_WIDTH * scale;
|
21
17
|
var image_height = MAP_HEIGHT * scale;
|
22
18
|
|
23
|
-
var x =
|
24
|
-
var y =
|
19
|
+
var x = image_width/2;
|
20
|
+
var y = image_height/2;
|
25
21
|
// - to delete end -----------------------------------------------------------------------------------------------------------------------
|
26
22
|
|
27
23
|
var map_params = {
|
@@ -30,8 +26,7 @@ var InitMap = function (params) {
|
|
30
26
|
x: x,
|
31
27
|
y: y,
|
32
28
|
mapwidth: MAP_WIDTH,
|
33
|
-
mapheight: MAP_HEIGHT
|
34
|
-
height: window_height
|
29
|
+
mapheight: MAP_HEIGHT
|
35
30
|
};
|
36
31
|
map_params = $.extend(map_params, params);
|
37
32
|
map_on_index_page = $('#map_wrapper').beMap(map_params);
|
@@ -59,10 +54,23 @@ var InitMap = function (params) {
|
|
59
54
|
y: 0,
|
60
55
|
dnd_enable: true,
|
61
56
|
debug: false,
|
57
|
+
|
58
|
+
// координаты области (в системе координат контейнера, который содержит карту),
|
59
|
+
// в которую вписывается картинка этажа при входе в него
|
62
60
|
left_padding: 20,
|
63
61
|
focus_area_width: 520,
|
64
62
|
top_padding: 20,
|
65
|
-
focus_area_height: 520
|
63
|
+
focus_area_height: 520,
|
64
|
+
|
65
|
+
// прямоугольник, который расположен на изображении, в котором находится осмысленное
|
66
|
+
// содержимое карты. Значения в системе координат изображения, получены с помощью photoshop.
|
67
|
+
// TODO:: эти значения должны высчитываться при геренации json при наличии полигонов зданий
|
68
|
+
bounding_box: {
|
69
|
+
x: 0,
|
70
|
+
y: 0,
|
71
|
+
width: 0,
|
72
|
+
height: 0
|
73
|
+
}
|
66
74
|
};
|
67
75
|
self.svg = null;
|
68
76
|
self.svg_overlay = null;
|
@@ -119,6 +127,7 @@ var InitMap = function (params) {
|
|
119
127
|
|
120
128
|
// extend options
|
121
129
|
self.o = $.extend(self.o, params);
|
130
|
+
self.o.height = _$m.outerHeight();
|
122
131
|
|
123
132
|
self.x = self.o.x;
|
124
133
|
self.y = self.o.y;
|
@@ -169,9 +178,6 @@ var InitMap = function (params) {
|
|
169
178
|
|
170
179
|
self.data = data;
|
171
180
|
|
172
|
-
//var nrlevels = 0;
|
173
|
-
//var shownLevel;
|
174
|
-
|
175
181
|
self.container = $('.mcontainer'); //$('<div></div>').addClass('mcontainer').appendTo(self.el);
|
176
182
|
self.map = self.container.find('.mmap'); //$('<div></div>').addClass('mmap').appendTo(self.container);
|
177
183
|
if (self.o.zoom) self.map.addClass('mapplic-zoomable');
|
@@ -297,108 +303,74 @@ var InitMap = function (params) {
|
|
297
303
|
// NOTE:: запускаем данные в карту
|
298
304
|
self.draw_childs(data["buildings"]);
|
299
305
|
|
300
|
-
// проверим, всё ли уместилось
|
301
|
-
self.invalidateViewArea();
|
302
|
-
|
303
306
|
// инициализируем класс, обслуживающий поиск
|
304
307
|
self.search_gui_klass = new SearchGUI(self);
|
305
308
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
// Mobile
|
310
|
-
//if ($(window).width() < 668) {
|
311
|
-
// self.container.height($(window).height() - 66);
|
312
|
-
//}
|
313
|
-
//else self.container.height('100%');
|
314
|
-
|
315
|
-
// Контейнер с картой должен слушать изменения габаритов окна и подгоняться по высоте
|
316
|
-
var window_height = $(window).height() - 200;
|
317
|
-
if (window_height < 400) window_height = 400;
|
318
|
-
self.el.height(window_height + "px");
|
319
|
-
|
320
|
-
// 20161003: заодно после редизайна необходимо позиционировать текстовый блок с адресом
|
321
|
-
var hh = _$address_p.outerHeight(true);
|
322
|
-
_$address_p.css('margin-top',(window_height - hh - 200)+"px");
|
323
|
-
|
324
|
-
// 20170327: подгоняем по высоте блок с текстом внутри инфо-панели
|
325
|
-
// т.к. список арендаторов и площадей может быть очень большим
|
326
|
-
self.building_info_klass.set_max_height_of_tab_content(window_height - 220);
|
327
|
-
|
328
|
-
// ------------------------------------------------------------------------------------------------------------------------
|
329
|
-
|
330
|
-
// если пользователь еще не взаимодействовал с картой или вне здания\площади
|
331
|
-
// вписываем картинку карты в главный прямоугольник карты
|
332
|
-
// т.е. меняем масштаб
|
333
|
-
if (self.mark_virgin) {
|
334
|
-
// рассчитаем масштаб, при котором можно вписать главный прямоугольник карты в прямоугольник рабочей области
|
335
|
-
var scaleX = self.calcScale(self.o.mapwidth*0.05, self.o.mapwidth *.95, self.X10, self.X20);
|
336
|
-
var scaleY = self.calcScale(self.o.mapheight*0.05, self.o.mapheight *.95, self.Y10, self.Y20);
|
337
|
-
var scale = (scaleX < scaleY) ? scaleX : scaleY;
|
338
|
-
self.scale = scale; /* NOTE:: вызывается во время window resize */
|
339
|
-
}
|
340
|
-
|
341
|
-
// совмещаем точку на экране, в которую надо центрировать карту,
|
342
|
-
// с центром карты (или с центром здания\площади, в котором находится юзер),
|
343
|
-
// с учётом рассчитанного масштаба
|
344
|
-
|
345
|
-
// если пользователь еще не взаимодействовал с картой или вне здания\площади,
|
346
|
-
// то фокусируемся на центр карты,
|
347
|
-
// иначе - фокусируемся на центр здания\площади, в котором находится пользователь и
|
348
|
-
// фокус сдвигаем, с учётом того, что сбоку открыта панель с информацией о здании
|
349
|
-
|
350
|
-
// NOTE-25::хардкод
|
351
|
-
// логические координаты - геометрический центр картинки
|
352
|
-
var cx = self.o.mapwidth/2;
|
353
|
-
var cy = self.o.mapheight/2;
|
354
|
-
var mark_do_moving = false;
|
355
|
-
|
356
|
-
if (self.current_building) {
|
357
|
-
cx = self.current_building.cx();
|
358
|
-
cy = self.current_building.cy();
|
359
|
-
mark_do_moving = true;
|
360
|
-
} else if (self.current_area) {
|
361
|
-
cx = self.current_area.cx();
|
362
|
-
cy = self.current_area.cy();
|
363
|
-
mark_do_moving = true;
|
364
|
-
} else if (self.mark_virgin) {
|
365
|
-
mark_do_moving = true;
|
366
|
-
}
|
367
|
-
|
368
|
-
if (mark_do_moving) {
|
369
|
-
self.x = self.normalizeX({
|
370
|
-
x: self.CX - self.scale * cx - self.container.offset().left,
|
371
|
-
scale: self.scale
|
372
|
-
});
|
373
|
-
self.y = self.normalizeY({
|
374
|
-
y: self.CY - self.scale * cy - self.container.offset().top,
|
375
|
-
scale: self.scale
|
376
|
-
});
|
377
|
-
console.log("<$(window).resize> call moveTo");
|
378
|
-
self.moveTo(self.x, self.y, self.scale, 100);
|
379
|
-
|
380
|
-
// если пользователь ещё не взаимодействовал с картой (т.е. она только загрузилась и готова к использованию)
|
381
|
-
// запомним позицию, чтобы при нажатии на кнопку "назад на карту" происходил возврат с исходному
|
382
|
-
// состоянию
|
383
|
-
if (self.mark_virgin) {
|
384
|
-
self.initial_map_position = {
|
385
|
-
x: self.x,
|
386
|
-
y: self.y,
|
387
|
-
scale: self.scale
|
388
|
-
}
|
389
|
-
}
|
309
|
+
self.calcViewArea();
|
310
|
+
self.invalidateViewArea();
|
390
311
|
|
391
|
-
|
312
|
+
};
|
392
313
|
|
393
|
-
|
314
|
+
// позиционируем картинку и gui елементы
|
315
|
+
self.invalidateViewArea = function () {
|
394
316
|
|
317
|
+
//<editor-fold desc="// вписываем картинку карты в "главный" прямоугольник карты (т.е. рассчитываем масштаб)">
|
318
|
+
var scaleX = self.calcScale(
|
319
|
+
self.o['bounding_box']['x'],
|
320
|
+
self.o['bounding_box']['x'] + self.o['bounding_box']['width'],
|
321
|
+
self.X10, self.X20);
|
322
|
+
|
323
|
+
// note:: вписываем по ширине
|
324
|
+
// var scaleY = self.calcScale(
|
325
|
+
// self.o['bounding_box']['y'],
|
326
|
+
// self.o['bounding_box']['y'] + self.o['bounding_box']['height'],
|
327
|
+
// self.Y10,
|
328
|
+
// self.Y20);
|
329
|
+
// var scale = (scaleX < scaleY) ? scaleX : scaleY;
|
330
|
+
// self.scale = scaleX;
|
331
|
+
|
332
|
+
self.scale = scaleX;
|
333
|
+
//</editor-fold>
|
334
|
+
|
335
|
+
// совмещаем точку на экране, в которую надо центрировать карту,
|
336
|
+
// с центром карты,
|
337
|
+
// с учётом рассчитанного масштаба
|
338
|
+
|
339
|
+
// центр в системе координат контейнера который совмещаем с центром картинки.
|
340
|
+
var screen_center_x, screen_center_y;
|
341
|
+
|
342
|
+
// центр картинки (координаты в системе координат картинки)
|
343
|
+
var cx, cy;
|
344
|
+
|
345
|
+
screen_center_x = self.CX0;
|
346
|
+
screen_center_y = self.CY0;
|
347
|
+
cx = self.o['bounding_box']['x'] + self.o['bounding_box']['width']/2;
|
348
|
+
cy = self.o['bounding_box']['y'] + self.o['bounding_box']['height']/2;
|
349
|
+
|
350
|
+
self.x = self.normalizeX({
|
351
|
+
x: screen_center_x - self.scale * cx,
|
352
|
+
scale: self.scale
|
353
|
+
});
|
354
|
+
self.y = self.normalizeY({
|
355
|
+
y: screen_center_y - self.scale * cy,
|
356
|
+
scale: self.scale
|
357
|
+
});
|
358
|
+
self.moveTo(self.x, self.y, self.scale, 100);
|
395
359
|
|
396
|
-
|
360
|
+
// будет использован при клике по кнопке "обратно на карту"
|
361
|
+
self.initial_map_position = {
|
362
|
+
x: self.x,
|
363
|
+
y: self.y,
|
364
|
+
scale: self.scale
|
365
|
+
};
|
397
366
|
|
398
|
-
|
367
|
+
// позиционируем элементы
|
368
|
+
self.building_info_klass.set_left(self.X2);
|
369
|
+
$area_order_button.css("left", self.X2 + "px");
|
370
|
+
if (self.container) $container_buttons.css("margin-top", (self.container.height() -10) + "px");
|
399
371
|
|
400
372
|
};
|
401
|
-
|
373
|
+
|
402
374
|
// драг энд дроп и прочая мышь
|
403
375
|
var initAddControls = function () {
|
404
376
|
var map = self.map,
|
@@ -727,8 +699,6 @@ var InitMap = function (params) {
|
|
727
699
|
return pageC - scale * logicC;
|
728
700
|
};
|
729
701
|
|
730
|
-
/* --- invalidateViewArea BEGIN --------------------------------------------------------------------------------- */
|
731
|
-
|
732
702
|
var _$m = $("#map_wrapper");
|
733
703
|
var _$b = $('.container');//$('footer .container');
|
734
704
|
var $area_order_button = $('.area_order_button');
|
@@ -736,36 +706,34 @@ var InitMap = function (params) {
|
|
736
706
|
var _is_debug_drawn = false;
|
737
707
|
var _$address_p = $('#paddress'); // 20161003: после редизайна надо дополнительно позиционировать блок с адресом
|
738
708
|
|
739
|
-
|
740
|
-
|
709
|
+
// рассчитаем опорные переменные для view
|
710
|
+
self.calcViewArea = function () {
|
741
711
|
|
742
|
-
//
|
712
|
+
// прямоугольник, в который надо вписывать картинки зданий при входе в них
|
743
713
|
self.X1 = self.o.left_padding;
|
744
714
|
self.X2 = self.o.left_padding + self.o.focus_area_width;
|
745
|
-
|
746
715
|
self.Y1 = self.o.top_padding;
|
747
716
|
self.Y2 = self.o.top_padding + self.o.focus_area_height;
|
748
|
-
|
749
717
|
self.CX = (self.X2 + self.X1) / 2;
|
750
718
|
self.CY = (self.Y2 + self.Y1) / 2;
|
751
719
|
|
720
|
+
// прямоугольник, в который надо вписывать полигоны площадей при входе в них
|
752
721
|
self.X1S = _$b.offset().left + 200;
|
753
722
|
self.Y1S = 140;
|
754
723
|
self.X2S = self.X1 + _$b.width() * .4;
|
755
724
|
self.X3 = self.X1 + _$b.width() - 100;
|
756
725
|
self.Y2S = _$m.height() - 80;
|
757
726
|
|
758
|
-
|
759
|
-
|
760
|
-
self.
|
761
|
-
self.
|
727
|
+
// "главный" прямоугольник (тот, в который вписывается картинка карты в режиме `view` )
|
728
|
+
// (координаты прямоугольника даны в системе координат контейнера, содержащего карту)
|
729
|
+
self.X10 = self.X1;
|
730
|
+
self.X20 = _$m.outerWidth() - 15;
|
731
|
+
self.Y10 = self.Y1;
|
732
|
+
self.Y20 = _$m.outerHeight() - 15;
|
733
|
+
self.CX0 = (self.X20 + self.X10) / 2;
|
734
|
+
self.CY0 = (self.Y20 + self.Y10) / 2;
|
762
735
|
|
763
|
-
//
|
764
|
-
self.building_info_klass.set_left(self.X2);
|
765
|
-
$area_order_button.css("left", self.X2 + "px");
|
766
|
-
if (self.container) $container_buttons.css("margin-top", (self.container.height() -10) + "px");
|
767
|
-
|
768
|
-
// DEBUG
|
736
|
+
// DEBUG DRAWING
|
769
737
|
if (self.o.debug) {
|
770
738
|
|
771
739
|
if (!_is_debug_drawn) {
|
@@ -777,15 +745,19 @@ var InitMap = function (params) {
|
|
777
745
|
//var style_dot = style + 'width:4px;height:4px;left:{X}px;top:{Y}px;';
|
778
746
|
|
779
747
|
var to_draw = [
|
780
|
-
{x: self.X1},
|
781
|
-
{x: self.X2},
|
782
|
-
{y: self.Y1},
|
783
|
-
{y: self.Y2},
|
784
|
-
//{x: self.
|
785
|
-
//{y: self.
|
786
|
-
|
787
|
-
{x: self.
|
788
|
-
{
|
748
|
+
// {x: self.X1},
|
749
|
+
// {x: self.X2},
|
750
|
+
// {y: self.Y1},
|
751
|
+
// {y: self.Y2},
|
752
|
+
// {x: self.CX},
|
753
|
+
// {y: self.CY},
|
754
|
+
|
755
|
+
{x: self.X10},
|
756
|
+
{x: self.X20},
|
757
|
+
{y: self.Y10},
|
758
|
+
{y: self.Y20},
|
759
|
+
{x: self.CX0},
|
760
|
+
{y: self.CY0}
|
789
761
|
];
|
790
762
|
|
791
763
|
|
@@ -808,8 +780,6 @@ var InitMap = function (params) {
|
|
808
780
|
|
809
781
|
};
|
810
782
|
|
811
|
-
/* --- invalidateViewArea END ----------------------------------------------------------------------------------- */
|
812
|
-
|
813
783
|
self.addEvent = function (target, eventType, func) {
|
814
784
|
self.events.push(new AppEvent(target, eventType, func));
|
815
785
|
return self;
|
data/bounding_box.jpg
ADDED
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: c80_map_floors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.0.
|
4
|
+
version: 0.2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- C80609A
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -204,6 +204,7 @@ files:
|
|
204
204
|
- app/views/c80_map_floors/shared/map_row/_search_gui.html.erb
|
205
205
|
- bin/console
|
206
206
|
- bin/setup
|
207
|
+
- bounding_box.jpg
|
207
208
|
- c80_map_floors.gemspec
|
208
209
|
- config/routes.rb
|
209
210
|
- db/migrate/20161015190000_create_c80_map_floors_settings.rb
|
@@ -242,7 +243,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
242
243
|
version: '0'
|
243
244
|
requirements: []
|
244
245
|
rubyforge_project:
|
245
|
-
rubygems_version: 2.
|
246
|
+
rubygems_version: 2.6.11
|
246
247
|
signing_key:
|
247
248
|
specification_version: 4
|
248
249
|
summary: Map
|