Создание Интерактивной Карты

13.11.2008
5
0
#1
Доброго времени суток.
Заранее прошу, не судите строго. Десять лет занимаюсь базами про графику уже забыл)).
Итак, имеется Delphi 7. Написана программа работы с базой данных по жилищному фонду.
Заказчик хочет чтобы на экране был реализован не только поиск по адресу, но и по карте.
Т. е. необходимо загружать картинку со схематичной картой района на ней должны быть нарисованы дома (полигоны). При наведении на них курсором мыши, они должны как-то меняться (изменять цвет например), а при клике мыши должны выводиться характеристики дома. Очень желательно чтобы карта могла менять размер и прокручиваться. Все это должно быть реализовано бесплатными средствами.

Попробывал применить Sweet Driving Engine, но хелпа к нему нет, а разбираться времени нет ((
И, собственно говоря, идей нет

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

Заранее благодарен за ответ.
 

Senset

Well-known member
11.09.2006
136
0
#2
чтобы не париться с графикой... юзайте командную строку в ней прописываете exe=iexplorer.exe cmd=maps.ya.ru открываются яндекс карты... далее нужно программно влепить в edit на странице нужный адрес (аля WinApi) и вот вся простейшая прога, с учетом всех уже затраченных трудов (ну типа людей кто делал яндекс карты и винду)

или прямо в cmd вбить нужный текст (еще проще решение)
 
13.11.2008
5
0
#3
Так не получится. Надо чтобы без подключения к инету работало.
 

Senset

Well-known member
11.09.2006
136
0
#4
нехилую базу хотите) ну значит что можно забацать... методом большого копи-паста скопировать карту москвы (желательно во всех приближениях) или по крайней мере нужного района\участка... и т.п. сделать компонент timage...
1) загружать в него картинку... через канву двигать как надо, и сделать событие на timage onclick... определить где был курсор - если в прямоугольнике, то значит выбран дом... и двигаться дальше
2) загружать в него картинку, предварительно создав базу данных (набросанную ручками) какое положение какой дом занимает... и при клике определять вхождение в базу данных... если вхождение есть - выбран дом, и двигаемся дальше)

пункты 1 и 2 - взаимоисключающие
1 - более крутой и сложный, ибо даже если выбран дом... то надо отловить текст в данной "схематичной" фигуре, преобразовать его из картинки в текст... и сравнивать с основной бд на вхождение
2 - более простой, но нужно всё сделать ручками... и при подключении нового дома (например) придеться делать изменения в ней самому
 
13.11.2008
5
0
#5
нехилую базу хотите) ну значит что можно забацать... методом большого копи-паста скопировать карту москвы (желательно во всех приближениях) или по крайней мере нужного района\участка... и т.п. сделать компонент timage...
1) загружать в него картинку... через канву двигать как надо, и сделать событие на timage onclick... определить где был курсор - если в прямоугольнике, то значит выбран дом... и двигаться дальше
2) загружать в него картинку, предварительно создав базу данных (набросанную ручками) какое положение какой дом занимает... и при клике определять вхождение в базу данных... если вхождение есть - выбран дом, и двигаемся дальше)

пункты 1 и 2 - взаимоисключающие
1 - более крутой и сложный, ибо даже если выбран дом... то надо отловить текст в данной "схематичной" фигуре, преобразовать его из картинки в текст... и сравнивать с основной бд на вхождение
2 - более простой, но нужно всё сделать ручками... и при подключении нового дома (например) придеться делать изменения в ней самому

Карта будет делаться для Рязани. Она поменьше) А так, пока в рамках одного района.
Думаю пока про гибридный вариант. Накопипастить карту и внести в базу координаты точек полигона, обозначающего дом. Не придумал пока как реализовать вхождение точки клика в тот или иной полигон если будет масштабирование или сдвиг карты. И как грузить карту в TImage целиком или какой-то кусок...
 

Senset

Well-known member
11.09.2006
136
0
#6
целиком через метод loadfromfile вроде, отражение по частям = рисование на канве...
чтобы абсолютные координаты не терялись при сдвиге... просто тяните некоторый коэффициент "dxdy" который будет учтен при клике, dx=смещение карты по x... dy=смещение карты по y...
x,y- точка где был клик
dx,dy - координаты левой нижней точки отрисованной канвы
тогда координаты отнотосительно всей картинки:
AX=x+dx;
AY=y+dy;

а при масшатабировании нужно юзать умножение или деление)

т.е. пардон событие не onclick а то что дает координаты, mousedown, mouseup например или вместе их юзать в паре) - так проще
но на onclick никто не мешает почекать курсор... только вроде там координата будет относительно всего экрана (mouse.CursorPos)

И как грузить карту в TImage целиком или какой-то кусок...
Код:
целиком: image1.Picture.LoadFromFile('C:\1.bmp');
 
D

DenNik

#7
Код:
целиком: image1.Picture.LoadFromFile('C:\1.bmp');
а если карта огромная будет (эдак 20000 х 15000). нехилые вычислительные ресурсы понадобятся
даже чтобы просто загрузить файл. Второе, если карта будет в растровом формате, то с масштабированием возникнут ОЧЧень большие проблемы. Думаю, клиенту это не понравится.
 

nayke

Well-known member
04.08.2010
310
0
#8
Доброго времени суток.
Заранее прошу, не судите строго. Десять лет занимаюсь базами про графику уже забыл)).
Итак, имеется Delphi 7. Написана программа работы с базой данных по жилищному фонду.
Заказчик хочет чтобы на экране был реализован не только поиск по адресу, но и по карте.
Т. е. необходимо загружать картинку со схематичной картой района на ней должны быть нарисованы дома (полигоны). При наведении на них курсором мыши, они должны как-то меняться (изменять цвет например), а при клике мыши должны выводиться характеристики дома. Очень желательно чтобы карта могла менять размер и прокручиваться. Все это должно быть реализовано бесплатными средствами.

Попробывал применить Sweet Driving Engine, но хелпа к нему нет, а разбираться времени нет ((
И, собственно говоря, идей нет

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

Заранее благодарен за ответ.

Посмотрите 2gis.ru они какое то время даже исходники выкладывали.

Вобще про изображения думать безмысленно - необходимо создавать свою структуру данных и отрисовывать. Если будете подсовывать bmp комп просто умерет от размера базы.
 

Senset

Well-known member
11.09.2006
136
0
#9
а если карта огромная будет (эдак 20000 х 15000). нехилые вычислительные ресурсы понадобятся
даже чтобы просто загрузить файл. Второе, если карта будет в растровом формате, то с масштабированием возникнут ОЧЧень большие проблемы. Думаю, клиенту это не понравится.
Чтобы не было проблем использовать технологии отрисовки =) и забыть про "по пиксельную обработку"
Масштабирование делается путем загрузки других файлов)
 
13.11.2008
5
0
#10
2gis не встраивается в программу.
Про попиксельную согласен. Думаю, сделать как в гугле, например. Разбить карту на куски и грузить нужный. Точнее несколько карт разного масштаба разбить на куски....
 

Senset

Well-known member
11.09.2006
136
0
#11
2gis не встраивается в программу.
Про попиксельную согласен. Думаю, сделать как в гугле, например. Разбить карту на куски и грузить нужный. Точнее несколько карт разного масштаба разбить на куски....
+1. быстро и относительно просто)