LINUX.ORG.RU

Как вывести друзей на карте мира

 , ,


0

4

Openlayers+mongodb. Там есть поддержка geojson это изумительно! Честно даже не знал и не задумывался о реализации, но раз уж Богом дано надо брать.

Хочу вывести друзей на карте, по типу как на авито, всплывают кругляшки, там колличество юзеров в данном масштабе. Приближаешь карту - балонов больше ну и в конце сами предложения о продаже бетонных коробок или автохлама.

Покумекал сегодня, пришли кое какие идеи о реализации, но не охота велосипед делать, может есть какие то алгоритны/патерны/либы что-то еще? Изгуглился, ничего толкового не нашел, все тупо выводят балоны на кару, если их миллион будет(не будет конечно хехе)?

★★★★

Когда я контрибутил в OSM лет 10 назад, считалось что openlayers говно, а leaflet сила, быстрее работает и API лучше. Но я точно помню что и одно и другое умело кластеризацию маркеров из коробки, поэтому научись читать доки. Кластеризация на клиенте может не подойти если данных очень много - тогда имеет смысл предвычислять агрегаты, и для этого есть простые способы - например, можно делать на регулярной сетке или на qtree.

anonymous
()
Ответ на: комментарий от anonymous

Брат, да если б я знал это слово «кластеризация», я бы по нему и гуглил. Я же почти 0 в теме, а примеров там сотня, вот и тыкал и искал по «source»...

Посмотрел на код leaflet - АПИ намного вроде проще, без этих new постоянных. Подумаю, спасибо

Кластеризация на клиенте может не подойти если данных очень много

Ну дык. Данных может потенциально быть очень много, это не гостиницы вывести в городе... Сейчас через монго ковыряю, там есть фильтр по дистанции

gobot ★★★★
() автор топика
Ответ на: комментарий от anonymous

Понятно в целом, оно «схлапывает» ближние точки и показывает одну вместо 10. А что с серверной реализацией, есть что-то? Группы какие то заводить надо предварительно или на лету группировать данные и отдавать в зависимости от масштаба... или че? )

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Ну дык. Данных может потенциально быть очень много, это не гостиницы вывести в городе… Сейчас через монго ковыряю, там есть фильтр по дистанции

Его конечно использовать обязательно (чтобы на больших замах не обрабатывать точки вне окна просмотра), но всей проблемы он не решает, потому что на низких зумах когда видна большая площадь, ты получаешь пятнышко точек в центре карты и всё.

Понятно в целом, оно «схлапывает» ближние точки и показывает одну вместо 10. А что с серверной реализацией, есть что-то?

Обязано быть - задача типовая, но я сам её не решал. По опыту OSM первым делом я бы смотрел PostGIS, есть ли что-то похожее для монги есть я не знаю, погугли или спроси у LLM.

Группы какие то заводить надо предварительно или на лету группировать данные и отдавать в зависимости от масштаба… или че? )

Ну дешевле всего группировать заранее (в постгресе, например, можно делать это прозрачно триггером на изменении данных) и отдавать на низких зумах готовые группы вместо отдельных точек. Например, можно группировать точки по принадлежности стране-региону-области, огрублённые границы можно взять из OSM, тот же постгис попадание в регион умеет, правда нужно учесть что границы иногда меняются. Вполне возможно что такая группировка наиболее ожидаема пользователем когда он смотрит низкие зумы. С другой стороны, регионы местами контринтуитивны - Красноярский край, например, в проекции Меркатора имеет огромную площадь, и куда тут точку тыкать? Центр масс у него в болотах, а сам Красноярск расположен на самом краю.

Но умея решать эту задачу в общем, сетку для более удобной группировки можно придумать любую - хоть руками нарисуй, хоть регионы доразбей чтобы не было совсем крупных кусков, хоть сгенерируй с нуля на основе данных о плотности населения или возьми диаграмму Вороного на крупных населенных пунктах, либо как я уже предлагал, сделай полностью автоматическую сетку на основе qtree - начинаешь с одного квадрата покрывающего всю планету, когда число точек в нём превышает порог разбиваешь его на 4 и так рекурсивно. Это, правда, выглядит некрасиво, зато технологично.

anonymous
()
Ответ на: комментарий от max_lapshin

Я может чего-то не знаю, но индексы с группировкой не помогут. Они позволяют быстро выбрать точки в окрестности, но если ты хочешь посмотреть всю планету, тебе нужно выбрать все точки и индекс не работает.

Тут нужно явно заводить отдельную таблицу с группами, возможно несколько для разных зумов, с поддержкой их актуальности триггерами.

anonymous
()
Ответ на: комментарий от anonymous

Например, можно группировать точки по принадлежности стране-региону-области

Тоже это думал, но... это нужно регионы заранее сохранять. А сколько их? Куча! Страна\ Область \ Город \ Район \ Пригород\ Деревни...ууу. Не, ну если делать полномасштабную 2GIS, то конечно, а так запаришься, крыша поедет

Я хочу более универсально сделать, по дистанции. Когда точка добавляется - ищется ближайшая по дистанции группа (я их по зумам на 5 штук разбил, 1000, 500, 200, 60, 5 км.), ну и создаются группы при добавлении. То есть 1 точка создает\присоединяется к 5 группам. Не знаю пока как пойдет, правильно или не нет, но интуитивно такую схему вижу. Тем более в монго есть фильтр по дистанции и...нету группировки ))

Ну и отображать на карте сначала группы, а когда уже приблизит до 6 уровня (где нет групп), то отображать точки.

Или не париться, делать на клиенте? Ну загрузить 1000 точек, насколько это тормозить будет?

gobot ★★★★
() автор топика
Ответ на: комментарий от anonymous

Кластеризация на клиенте может не подойти если данных очень много

Десятки и сотни тысяч точек точно можно на клиенте кластеризовать, даже первые миллионы. Если знать, как %)

одно и другое умело кластеризацию маркеров из коробки

Не знаю, как в OpenLayers, а в Leaflet этого из коробки точно нет — есть плагины разной степени протухшести. У него вообще упор сделан на маленький размер коробки и расширяемость сторонними плагинами.

Nervous ★★★★★
()
Ответ на: комментарий от gobot

Тоже это думал, но… это нужно регионы заранее сохранять. А сколько их? Куча! Страна\ Область \ Город \ Район \ Пригород\ Деревни…

Деревни не нужны, группировка же работает до определённого уровня, дальше ты уже достаточно приблизился чтобы выгрузить точки по gin/gist индексу и отдать клиенту. Регионы выгружаются из OSM для всего мира, наверняка готовые выгрузки есть в любых форматах, смотри у них на wiki.

Я хочу более универсально сделать, по дистанции. Когда точка добавляется - ищется ближайшая по дистанции группа (я их по зумам на 5 штук разбил, 1000, 500, 200, 60, 5 км.), ну и создаются группы при добавлении. То есть 1 точка создает\присоединяется к 5 группам. Не знаю пока как пойдет, правильно или не нет, но интуитивно такую схему вижу. Тем более в монго есть фильтр по дистанции и…нету группировки ))

Это эквивалентно тому что я описал выше с сеткой построенной по диаграмме Вороного. Да, можно так, в терминах точек это даже проще. Точки также выгружаются из OSM. Или викидаты. И там и там есть данные о населении, можешь для разных зумов их отфильтровать по порогам отсечения.

Или не париться, делать на клиенте? Ну загрузить 1000 точек, насколько это тормозить будет?

Ты даже не написал сколько у тебя точек. 1000 конечно же можно сразу отдать клиенту и ни о чём не переживать.

anonymous
()
Ответ на: комментарий от Nervous

Хмм, а 10 000 точек отдать клиенту через json? Это ж какой размер то должен быть и в память же их загнать ещё нужно. Но надо конечно потестить

gobot ★★★★
() автор топика
Ответ на: комментарий от anonymous

Да вот не нравится мне «зависимость» от OSM данных, ну карта понятно, без этого никак, но сами данные - там лимиты. Я читад их ограничения, они useragent смотрят и могут весь сайт заблокировать теоретически, ну понятно что лимитировать и пасти своих зверей ты сам должен, но... Я не знаю насколько там все стабильно, если завязываться на этом. Вдруг санкции все отрубят или ещё че. А координаты у тебя никто не отнимет и карт всяких много.... Содрать базу всю может? Там есть у них export. Или я сильно заморачиваюсь? )

gobot ★★★★
() автор топика
Ответ на: комментарий от gobot

Да вот не нравится мне «зависимость» от OSM данных, ну карта понятно, без этого никак, но сами данные - там лимиты. Я читад их ограничения, они useragent смотрят и могут весь сайт заблокировать теоретически, ну понятно что лимитировать и пасти своих зверей ты сам должен, но… Я не знаю насколько там все стабильно, если завязываться на этом. Вдруг санкции все отрубят или ещё че. А координаты у тебя никто не отнимет и карт всяких много…. Содрать базу всю может? Там есть у них export. Или я сильно заморачиваюсь? )

До сих пор об OSM данных мы говорили только в контексте «один раз оффлайн выгрузить границы или насёлённые пункты», о чём ты вообще сейчас?

Но всю базу содрать никто не запрещает, даже наоборот, только зачем она тебе для однократной выгрузки горстки данных. Но она может понадобиться чтобы рендерить свои карты - так ты не будешь от OSM’овских тайлов зависеть, и свой стиль сможешь прикрутить, и никто тебе ничего уже не сможет отрубить.

anonymous
()