c80_map_floors 0.2.0.0 → 0.2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|

|
83
92
|
|
93
|
+
Bounding box:
|
94
|
+
|
95
|
+

|
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
|