Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Работа с большими изображениями
 
 автор: andMegaM   (09.02.2009 в 13:46)   письмо автору
 
 

Доброго времени суток.
Я на сайте хочу сделать сервис, подобный картам Яндекс или Google maps.
У меня есть подробная карта нужной мне местности, но она огромная по весу и по размерам и поэтому грузить ее полностью на сайт не возможно.
Как мне сделать чтобы при перетаскивании мышкой карта подгружалась динамически.?
С чего начать?

  Ответить  
 
 автор: magic   (09.02.2009 в 14:09)   письмо автору
 
   для: andMegaM   (09.02.2009 в 13:46)
 

Наверно не на сайт, а в браузер. Если я правильно понял, то это надо делать при помощи JavaScript или Ajax, это то что работает на стороне клиента, а РНР работает на стороне сервера и поэтому проследить за мышкой не получится. Я так думаю :)

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 14:19)   письмо автору
 
   для: magic   (09.02.2009 в 14:09)
 

Я думаю что при помощи JavaScript можно получать координаты прямоугольной области, эти координаты отправлять на сервер, а затем на сервере при помощи imagecopy (php) с сервера брать часть картинки и вставлять в браузер.
Что думаете по этому поводу?
Я что-то не уверен правильно ли так делать. Может есть какие-то другие варианты.

  Ответить  
 
 автор: sim5   (09.02.2009 в 14:35)   письмо автору
 
   для: andMegaM   (09.02.2009 в 14:19)
 

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

  Ответить  
 
 автор: Trianon   (09.02.2009 в 14:41)   письмо автору
 
   для: sim5   (09.02.2009 в 14:35)
 

to andMegaM:
на сервере все равно придется порезать карту.
Причем отнюдь не php-средствами.
И вероятно, даже не на сервере. :)

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 14:51)   письмо автору
 
   для: Trianon   (09.02.2009 в 14:41)
 

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

  Ответить  
 
 автор: Trianon   (09.02.2009 в 14:57)   письмо автору
 
   для: andMegaM   (09.02.2009 в 14:51)
 

Вы на карты яндекса или гугла, про которые упоминали здесь, хоть раз заходили?
Зайдите - убедитесь, что них карты порезаны.

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 15:03)   письмо автору
 
   для: Trianon   (09.02.2009 в 14:57)
 

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

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 14:47)   письмо автору
 
   для: sim5   (09.02.2009 в 14:35)
 

Вот мне и надо чтобы во фрейм подгружалась только нужная часть карты.
На правильном ли я пути? Может кто-то более подробно (по шагам) может описать реализацию задачи

  Ответить  
 
 автор: sim5   (09.02.2009 в 15:11)   письмо автору
 
   для: andMegaM   (09.02.2009 в 14:47)
 

Грузить частями. А вот к разговру выше, то да, резать ее надо на части, а далее иметь список-идентификтор этих частей. В общем надо подумать как это организовать. Очень большое изображение обрабатывать на сервере, ну насколько оно большое бог его знает, но возможно, что просто нехватка памяти для этог будет и тогда крындец...

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 15:17)   письмо автору
 
   для: sim5   (09.02.2009 в 15:11)
 

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

  Ответить  
 
 автор: Trianon   (09.02.2009 в 15:37)   письмо автору
 
   для: andMegaM   (09.02.2009 в 15:17)
 

20000px * 20000px , если бы его можно было загрузить в gdlib, заняло бы 2Гб .
В гугле картинки порезаны квадратиками 256x256
то есть ваша карта в самом высоком разрешении - около полутора тысяч таких квадратиков.
Около двух с половиной - трех тысяч - всех разрешений.
15..30 Кб на квадратик - 50..100Мб в сумме.

  Ответить  
 
 автор: Axxil   (09.02.2009 в 15:43)   письмо автору
 
   для: andMegaM   (09.02.2009 в 15:17)
 

Можно попробовать прям поверх гугл мапс пустить свою карту. Чтоб велосипед не изобретать.

http://www.xakep.ru/post/47006/default.asp?print=true

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 16:02)   письмо автору
 
   для: Axxil   (09.02.2009 в 15:43)
 

Спасибо за ссылку. Это уже что-то. Но мне совсем не хотелось как-то привязываться к гуугл картам.
Как с нуля мне сделать динамическую карту?
К примеру я порезал свою карту на квадратики нужного мне размера. Что дальше?

  Ответить  
 
 автор: Axxil   (09.02.2009 в 16:07)   письмо автору
 
   для: andMegaM   (09.02.2009 в 16:02)
 

Какая конечная цель всех этих манипуляций? Что вы хотите в итоге получить? Просто схему, которую можно прокручивать в окне или карту с системой координат и возможностью добавлять маркеры и объекты?

Просто перемещать карту можно отслеживая в <div style="overflow:hidden;"> события onDrug*, считывая координаты мыши и последовательно подгружая квадраты, на которые нарезана карта.

Конкретнее сказать не могу, но я бы рыл в данном направлении. Задача очень нетривиальная.

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 16:16)   письмо автору
 
   для: Axxil   (09.02.2009 в 16:07)
 

Мне нужно карту с системой координат и возможностью добавлять маркеры и объекты. Изначально планируется просто перемещать карту и добавлять маркеры и объекты. Возможно потом потребуется динамически изменять масштаб карты, но сейчас это не нужно.

  Ответить  
 
 автор: Axxil   (09.02.2009 в 17:15)   письмо автору
 
   для: andMegaM   (09.02.2009 в 16:16)
 

Хм...

По моему глупо с нуля всё это строить. У гугла отличный открытый API карт. Сделайте слой со своей картой и всё.

Если у вас нагрузка меньше 500000 обращений к карте в сутки, то и изобретать новый механизм карт незачем. Лучше время потратить на что-то более полезное.

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 17:18)   письмо автору
 
   для: Axxil   (09.02.2009 в 17:15)
 

Гугл без предупреждений может отказать в предоставлении услуг не поясняя почему. И тогда мой web сервис накроется.

  Ответить  
 
 автор: Trianon   (09.02.2009 в 17:21)   письмо автору
 
   для: andMegaM   (09.02.2009 в 17:18)
 

"Сын, выйди из машины!" (с)

а сейчас он у Вас живет и здравствует?

Ваш сервис скорее накроется, даже если Вы его и сделаете.
Лицензию на предоставление картографических услуг Вы уже получили?

  Ответить  
 
 автор: andMegaM   (09.02.2009 в 17:29)   письмо автору
 
   для: Trianon   (09.02.2009 в 17:21)
 

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

  Ответить  
 
 автор: Axxil   (10.02.2009 в 09:35)   письмо автору
 
   для: andMegaM   (09.02.2009 в 17:29)
 

> Тогда получается что и проект сделанный с картами гугл заранее обречен.

Лицензию гугл мапс попробуйте почитать для начала.

> Кстати, на картах гугл очень много косяков и неточностей

Так у вас же вроде своя карта.

> Кому и какая разница у кого и как я приобрел карту.

Всё зависит от детализации и подробности карты. Если это обычная схема с квадратиками нарисованными от руки, то никому никакого дела. А если это карта, сделанная военными топологами, то очень скоро к вам постучатся.

  Ответить  
 
 автор: sim5   (09.02.2009 в 17:23)   письмо автору
 
   для: Axxil   (09.02.2009 в 16:07)
 

Фильмы по войнушку любите? Как там - открывает командир планшет, смотрит на него и говорит умно - "Враг в квадрате 57, ...". В квадрате!
Представьте для простоты карту какого либо района, который разбит на квадраты. Именно эти квадраты, а не координаты, вы будете передавать на сервер в качестве запроса. Из этого района вы выводите часть карты, например, таблицей 3х3. Допустим сейчас пользователь смотрит часть с квадратами:
15, 16, 17
25, 26, 27
35, 36, 37
Мышь пользователя находится в квадрате 26. Если он продвинет ее влево на квадрат 25, то вы, получив запрос этот (25), должны выдать ему таблицу с квадратами
14, 15, 16
24, 25, 26
34, 35, 36
Если с квадрата 25, он поведет мышь на квадрат 14, то выдать
3, 4, 5
13, 14, 15
23, 24, 25
Ну и так далее. Передавать координаты при разрезанном изображении, я думаю будет расточительно. А в данном случае, вы должны держать "сетку" квадратов в базе, которым соответствуют те или иные изображения. Это будет проще. Вот в этом плане бы я думал. А фрейм можно организовать так, что он у вас будет работать как AJAX, передавая запросы на сервер по событиям onmousemove каждого изображения сетки выводимой пользователю.

PS. Нет, onmousemove не годится, так будут постонно идти запросы, от любого движения. Хотя, эту проблему можно решить на JS.

  Ответить  
 
 автор: andMegaM   (10.02.2009 в 08:12)   письмо автору
 
   для: sim5   (09.02.2009 в 17:23)
 

За идею с квадратами спасибо. Примерно к этому же я и склоняюсь.
Но в гугле по другому происходит реализация. Там я так понимаю смена картинок происходит после выполнения двух событий : нажатия мышкой и перемещении курсора.
Тут мне кажется что подгрузка зависит от координат курсора относительно фрейма и на какой картинке произошло нажатие клавиши мышки. Но как это точно работает я не пойму.
Вариант с подгрузкой при наведении на карайнюю картинку я думаю не подходит, т.к. если будет стоять метка где-нибудь около края фрейма, то при подробном просмотре метки (при наведении мыши выпрыгивает более более подробная информация ) произойдет перемещение карты, хотя пользователь перемещать карту и не собирался.
Так как же происходит реализация подгузки картинок в гугле?

  Ответить  
 
 автор: sim5   (10.02.2009 в 09:03)   письмо автору
 
   для: andMegaM   (10.02.2009 в 08:12)
 

Не обязательно от координат. Можно, для того, чтобы не посылать постоянные запросы на сервер при каждом движении мыши, активировать выбор/передачу после щелчка мыши. Собственно, совсем не обязательно это делать по движению мыши, можно организовать навигатор - стрелки направляющие, выбирая какую либо, пользователь задает направление, и в этом случае их будет всего 4.
Координаты годятся только в том случае, если это единое изображение с наложенной картой. Это тоже можно организовать, но матрица с квадратами это проще - расчет, поиск, и т.п., по одному значанию найти ближайшие, быстрее и удобнее, чем работать с координатами.
Не знаю как в Гугле, я не принимал участия в создании ее. Но, если бы делал себе подобное, то - передвижение по карте, наверное бы, сделал навигатором, а вот щелчек по пункту населенному, либо по квадрату, служил либо выбором для масштабирования, либо уже приводил к масштабированию выбранного района. И, если подразумевать масштабирование, то каждый квадрат наделил бы картой, которая бы пердавала ID объектов на ней. Все это потребует описания/связей объектов в базе.
Но все делал бы именно так, разбив всю карту на квадраты. Это мне кажется самым удобным вариантом, более простым, с более быстрой реакцией сервера и выдачей ответа пользователю.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования