Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Карта города на PHP


Автор: neo2006 9.8.2006, 21:43
Подскажите пожалуйста как сделать поиск по данной карте.Например я ввожу:пер,Учительский 5;и мне сразу показывает(обводит в какой-нибудь цвет) где это, с двойным увеличением(http://www.nn.ru/map/).Подскажите пожалуйста....user posted image

Автор: szz 9.8.2006, 21:53
Так карта изначально не в виде картинки хранится, а в базе данных координаты и названия со свойствами, векторами полигонами.
   А потом на основе данных динамически рисуется.

  Так вот, поиск происходит в базе, а не на картинке.

Автор: Mal Hack 9.8.2006, 21:54
Цитата(szz @  9.8.2006,  22:53 Найти цитируемый пост)
Так карта изначально не в виде картинки хранится, а в базе данных координаты и названия со свойствами, векторами полигонами.
   А потом на основе данных динамически рисуется.

Не все так просто, да и по такому принципу работают полноценные ГИС.
В данном случае можно обойтись базой с названием объектов и координатами, куда ставить маркер.

Автор: neo2006 9.8.2006, 22:03
Ребята,у меня эта карта в OCADе хранится,это я просто скрин сделал.

Автор: Mal Hack 9.8.2006, 22:48
neo2006, возможна эта система позволяеь с ней работать, как с ГИС, надо бы инфу по ней глянуть.

Автор: neo2006 10.8.2006, 07:11
Mal Hack, в OCADе вся карта начерчена. Так что я думаю можно.

Автор: szz 10.8.2006, 07:22
Начерчена, но хранятися ли как-то там названия всех мест? Можно ли их экспортировать в какой-нить CSV с координатами? А то колупать формат файлов OCAD как-то страшно (если это, конечно не XML какой-нибудь приятный)

Автор: HalkaR 10.8.2006, 10:58
Вот такой вариант подойдет?

http://osnova-develop.ru/?page_id=127

Автор: neo2006 10.8.2006, 19:04
HalkaR, да именно так.Не подскажешь как это реализовать?Буду премного благодарен.

Автор: HalkaR 11.8.2006, 11:07
Так. Описываю, как это сделал я.

Есть БОЛЬШОЕ изображение. В моем случае это примерно 2000*2000. Еще есть маленький вариант, который показывается пользователю при открытии страницы. Сссылка на изображение по умолчанию выглядит как map.php. Если map.php не получает параметров, то перенаправляет на маленькую карту.

При клике на меленькую карту ссылка на изображение меняется на map.php?x=234&y=234, где числа это координаты клика. map.php обрабатывает их и отсылает пользователю соответствующую часть изображения (реализованно на gd). 

Самая большая проблема это обьекты. При загрузки страницы загружается массив обьектов
Код

<div id='1250' style='z-index:50;left:374.79388917659;top:280.94202898551;container:positioned; position:absolute;cursor: url(images/zoom.cur);display:none' onMouseOver='show(this);' onMouseOut='hide(this);' onclick='NewMap(374.79388917659, 280.94202898551);'>
<img id="1250_img" src="/dm_pics/43957b6ee58d8.gif" border=0>
</div>


При клике на маленбкое изображение JS пересчитывает координаты этих обьектов и если они не находятся на карте делает их невидимыми. Соответственно при повторном клике (возврате на полную карту) производится обратный персчет (точнее восстанавливались сохранненные данные).

В базе хранятся только координаты обьектов.

Вот такой вот яваскрипт там 
Код

var divs = document.getElementsByTagName('div');
var data = new Array(divs.length);
var data1 = new Array(divs.length);
var sX, sY;
function NewMap(x, y, isBigMap) {    
    if(x==0){x = event.x;}
    if(y==0){y = event.y;}
    document.getElementById('loading').style.display = "block";
    var map = document.getElementById('map');    
     if(map.src != "http://.../minmap.gif" && map.src != "http://.../minmap.gif" && isBigMap)
        {
            map.style.cursor='images/zoom.cur';
            for (i = 0; i < divs.length; i++) {
                if(document.getElementById(divs[i].id+'_desc') != null)
                {
                    divs[i].style.pixelLeft = data[i][0];
                    divs[i].style.pixelTop = data[i][1];
                    document.getElementById(divs[i].id+'_desc').style.pixelLeft = data[i][2];
                    document.getElementById(divs[i].id+'_desc').style.pixelTop = data[i][3];
                    divs[i].style.display = data[i][5];
                    
                    data1[i] = divs[i].style.display;
                    divs[i].style.display = "none";
                    divs[i].style.cursor='url(images/zoom.cur)';
                }
                else
                {
                    if(divs[i].id.substr(0,10)=="map_kompas")
                    {
                        divs[i].style.display = "none";
                    }                
                }
            }
            map.src="/map/minmap.gif";
        }
    else {    
        map.style.cursor='images/back.cur';
        //document.getElementById('info').innerHTML = '<img src="map/back.gif">';    
        if(x<350/1931*700){x=350/1931*700;}
        if(y<350/1931*700){y=350/1931*700;}
        if(x>700-350/1931*700){x=700-350/1931*700;}
        if(y>900-350/1931*700){y=900-350/1931*700;}
        sX = x;
        sY = y;
        if(!isBigMap)
        {
            for (i = 0; i < divs.length; i++) {
                if(document.getElementById(divs[i].id+'_desc') != null)
                {
                    divs[i].style.pixelLeft = data[i][0];
                    divs[i].style.pixelTop = data[i][1];
                    document.getElementById(divs[i].id+'_desc').style.pixelLeft = data[i][2];
                    document.getElementById(divs[i].id+'_desc').style.pixelTop = data[i][3];
                    divs[i].style.display = data[i][5];
                    
                    data1[i] = divs[i].style.display;
                    //divs[i].style.display = "none";
                    //divs[i].style.cursor='url(images/zoom.cur)';
                }                
            }
        }
        for (i = 0; i < divs.length; i++) {
            if(document.getElementById(divs[i].id+'_desc') != null)
            {
                data[i]    = new Array(5);
                data[i][0] = divs[i].style.pixelLeft;
                data[i][1] = divs[i].style.pixelTop;
                data[i][2] = document.getElementById(divs[i].id+'_desc').style.pixelLeft;
                data[i][3] = document.getElementById(divs[i].id+'_desc').style.pixelTop;
                data[i][5] = divs[i].style.display;
                divs[i].style.pixelLeft = 700/2 - (x - divs[i].style.pixelLeft - 10)/700*1931 - 10;
                divs[i].style.pixelTop = 700/2 - (y - divs[i].style.pixelTop - 15)/700*1931 - 15;
                document.getElementById(divs[i].id+'_desc').style.pixelLeft = divs[i].style.pixelLeft + 25;
                document.getElementById(divs[i].id+'_desc').style.pixelTop = divs[i].style.pixelTop - 35;                
                divs[i].style.display = "block";
                if(divs[i].style.pixelLeft < 0 || divs[i].style.pixelLeft > 700 || divs[i].style.pixelTop < 0 || divs[i].style.pixelTop > 700)
                {
                    divs[i].style.display = "none";                    
                }
                data1[i] = divs[i].style.display;
                divs[i].style.display = "none";
                divs[i].style.cursor='url(images/back.cur)';
            }
            else
            {
                if(divs[i].id.substr(0,10)=="map_kompas")
                {
                    divs[i].style.display = "block";
                }                
            }
        } 
        map.src="/map/map.php?x="+x+"&y="+y;
    }
}
function ShowObjects()
{
    for (i = 0; i < divs.length; i++) {
            if(document.getElementById(divs[i].id+'_desc') != null)
            {
                if(divs[i].style.display != null && data1[i] != null){divs[i].style.display = data1[i];}
            }
    }
}

Автор: neo2006 11.8.2006, 18:45
HalkaR, спасибо.Попробую сегодня разобраться.

Автор: neo2006 12.8.2006, 14:08
HalkaR, а в чем это все реализовывать?Прогу не подскажешь?

Автор: HalkaR 13.8.2006, 12:50
neo2006, я это все руками писал.

Автор: neo2006 14.8.2006, 08:45
HalkaR, это понимаю.Лучше где это все набирать?В каком-нибудь HTML-редакторе,Dreamweaver или Visual C#?Я ведь не знаю. smile 

Автор: HalkaR 14.8.2006, 10:58
neo2006, да без разницы - хоть в блокноте. Наверно в Dreamweaver будет удобнее, а разницы никакой.

Автор: Enya 15.8.2006, 14:09
Вот ещё одна карта. Скорее всего реализованна на Java 
http://www.vietas.lv/index.php?p=12&x=2617855&y=18720766.5&s=3

Автор: neo2006 15.8.2006, 16:46
HalkaR, чего-то у меня ничего не получается.Пожалуйста,если тебя не затруднит,ты не мог бы поточнее описать (лучше по шагам в Dreamweavere).Заранее спасибо...

Автор: HalkaR 18.8.2006, 13:56
neo2006, давай по пунктам - что не получается?

Автор: neo2006 19.8.2006, 11:44
HalkaR, все.Я создаю PHP проект.Вставляю в него твой HTML-код,а потом JAVA-скрипт.Но ничего не отображается.Только пустой экран.

Автор: HalkaR 19.8.2006, 15:05
neo2006, код в студию!

Автор: neo2006 20.8.2006, 09:48
Вот они:

Цитата

<div id='1250' style='z-index:50;left:374.79388917659;top:280.94202898551;container:positioned; position:absolute;cursor: url(images/zoom.cur);display:none' onMouseOver='show(this);' onMouseOut='hide(this);' onclick='NewMap(374.79388917659, 280.94202898551);'>
<img id="1250_img" src="/dm_pics/43957b6ee58d8.gif" border=0>
</div>


Цитата

var divs = document.getElementsByTagName('div');
var data = new Array(divs.length);
var data1 = new Array(divs.length);
var sX, sY;
function NewMap(x, y, isBigMap) {    
    if(x==0){x = event.x;}
    if(y==0){y = event.y;}
    document.getElementById('loading').style.display = "block";
    var map = document.getElementById('map');    
     if(map.src != "http://.../minmap.gif" && map.src != "http://.../minmap.gif" && isBigMap)
        {
            map.style.cursor='images/zoom.cur';
            for (i = 0; i < divs.length; i++) {
                if(document.getElementById(divs[i].id+'_desc') != null)
                {
                    divs[i].style.pixelLeft = data[i][0];
                    divs[i].style.pixelTop = data[i][1];
                    document.getElementById(divs[i].id+'_desc').style.pixelLeft = data[i][2];
                    document.getElementById(divs[i].id+'_desc').style.pixelTop = data[i][3];
                    divs[i].style.display = data[i][5];
                    
                    data1[i] = divs[i].style.display;
                    divs[i].style.display = "none";
                    divs[i].style.cursor='url(images/zoom.cur)';
                }
                else
                {
                    if(divs[i].id.substr(0,10)=="map_kompas")
                    {
                        divs[i].style.display = "none";
                    }                
                }
            }
            map.src="/map/minmap.gif";
        }
    else {    
        map.style.cursor='images/back.cur';
        //document.getElementById('info').innerHTML = '<img src="map/back.gif">';    
        if(x<350/1931*700){x=350/1931*700;}
        if(y<350/1931*700){y=350/1931*700;}
        if(x>700-350/1931*700){x=700-350/1931*700;}
        if(y>900-350/1931*700){y=900-350/1931*700;}
        sX = x;
        sY = y;
        if(!isBigMap)
        {
            for (i = 0; i < divs.length; i++) {
                if(document.getElementById(divs[i].id+'_desc') != null)
                {
                    divs[i].style.pixelLeft = data[i][0];
                    divs[i].style.pixelTop = data[i][1];
                    document.getElementById(divs[i].id+'_desc').style.pixelLeft = data[i][2];
                    document.getElementById(divs[i].id+'_desc').style.pixelTop = data[i][3];
                    divs[i].style.display = data[i][5];
                    
                    data1[i] = divs[i].style.display;
                    //divs[i].style.display = "none";
                    //divs[i].style.cursor='url(images/zoom.cur)';
                }                
            }
        }
        for (i = 0; i < divs.length; i++) {
            if(document.getElementById(divs[i].id+'_desc') != null)
            {
                data[i]    = new Array(5);
                data[i][0] = divs[i].style.pixelLeft;
                data[i][1] = divs[i].style.pixelTop;
                data[i][2] = document.getElementById(divs[i].id+'_desc').style.pixelLeft;
                data[i][3] = document.getElementById(divs[i].id+'_desc').style.pixelTop;
                data[i][5] = divs[i].style.display;
                divs[i].style.pixelLeft = 700/2 - (x - divs[i].style.pixelLeft - 10)/700*1931 - 10;
                divs[i].style.pixelTop = 700/2 - (y - divs[i].style.pixelTop - 15)/700*1931 - 15;
                document.getElementById(divs[i].id+'_desc').style.pixelLeft = divs[i].style.pixelLeft + 25;
                document.getElementById(divs[i].id+'_desc').style.pixelTop = divs[i].style.pixelTop - 35;                
                divs[i].style.display = "block";
                if(divs[i].style.pixelLeft < 0 || divs[i].style.pixelLeft > 700 || divs[i].style.pixelTop < 0 || divs[i].style.pixelTop > 700)
                {
                    divs[i].style.display = "none";                    
                }
                data1[i] = divs[i].style.display;
                divs[i].style.display = "none";
                divs[i].style.cursor='url(images/back.cur)';
            }
            else
            {
                if(divs[i].id.substr(0,10)=="map_kompas")
                {
                    divs[i].style.display = "block";
                }                
            }
        } 
        map.src="/map/map.php?x="+x+"&y="+y;
    }
}
function ShowObjects()
{
    for (i = 0; i < divs.length; i++) {
            if(document.getElementById(divs[i].id+'_desc') != null)
            {
                if(divs[i].style.display != null && data1[i] != null){divs[i].style.display = data1[i];}
            }
    }
}

Автор: HalkaR 22.8.2006, 14:54
neo2006, что "они"?

Код страницы дай!

Автор: neo2006 23.8.2006, 16:10
HalkaR, вот http://forum.vingrad.ru/index.php?showtopic=107341&view=findpost&p=819156

Автор: HalkaR 23.8.2006, 21:42
neo2006 Код ВСЕЙ веб-страницы! Это же не влоб вставлять надо!

Автор: neo2006 24.8.2006, 13:35
HalkaR, а я тебя и прошу,рассказать как это делать пошагово.Или выложи свой PHP готовый.Мне может будет легче с ним разобраться.

Автор: HalkaR 24.8.2006, 13:42
Я же писал ссылку!
http://osnova-develop.ru/?page_id=127

Посмотри код. Там все в одном файле.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)