Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Сообщение arzobispo »

Доброго времени суток всем!
Коллеги, продолжаю развивать карту со зверюшками и вот с интересной проблемой столкнулся.
Есть у меня 8 выпадающих списков и 4 блока с чекбоксами (в каждом блоке от 3 до 5 чекбоксов). Далее буду приводить код в перемешку с описанием проблемы и вопросами, для краткости html сокращу (количество Выпадающих списков и чекбоксов).

Код-html:

Код: Выделить всё

<form name="mapserv" method="GET" action="/cgi-bin/mapserv.exe">
 <text><b>Волк</b></text><br>
  <input type="hidden" name="map" value="[map]">
   <select name ="nam" size=1>
    <option  selected></option>
    <option value='Лесной'>Лесной</option>
    <option value='Полярный'>Полярный</option>
    <option value='Степной'>Степной</option>
   </select><br>

 <text><b>Заяц</b></text><br>
  <input type="hidden" name="map" value="[map]">
   <select name ="nam" size=1>
    <option  selected></option>
    <option value='Русак'>Русак</option>
    <option value='Пятнистый'>Пятнистый</option>
    <option value='Степной'>Степной</option>
   </select><br>

 <text><b>Лиса</b></text><br>
  <input type="hidden" name="map" value="[map]">
   <select name ="nam" size=1>
    <option  selected></option>
    <option value='Маленькая'>Маленькая</option>
    <option value='Чернобурка'>Чернобурка</option>
    <option value='Низкая'>Низкая</option>
   </select><br>

 <text><b>Цвета</b></text><br>
  <input type="checkbox" name="col" value='Белый'>Белый<br>
  <input type="checkbox" name="col" value='Черный'>Черный<br>
  <input type="checkbox" name="col" value='Рыжий'>Рыжий<br>

 <text><b>Пол</b></text><br>
  <input type="checkbox" name="sex" value='Муж'>муж<br>
  <input type="checkbox" name="sex" value='Жен'>Жен<br>

  <input type="submit"  value="Найти">
  <input type="hidden" name="layer" value="prostokarta_region">
  <input type="hidden" name="layer" value="base">
  <input type="hidden" name="mode" value="browse">
</form>
Есть две таблицы, одна prostokarta_region и animals, в первой геометрия, во второй данные о животных.

Код МАР-файла:

Код: Выделить всё

MAP
IMAGETYPE GIF
EXTENT -0.384 -0.383 0.217 -0.245
SIZE 680 612
WEB 
   TEMPLATE   "/ms4w/apps/mslocal/templates/index2.html"
   IMAGEPATH   "/ms4w/tmp/ms_tmp/"
   IMAGEURL   "/ms_tmp/"
END
LAYER 
  NAME "base" 
  CONNECTIONTYPE postgis
  CONNECTION "user=postgres password=1234 dbname=postgis host=localhost"
  DATA "the_geom FROM prostokarta_region USING SRID=4326"
  TYPE POLYGON
   CLASS
    COLOR 125 234 100
    OUTLINECOLOR 100 100 100
  END
END
LAYER
  NAME "prostokarta_region"
  CONNECTIONTYPE postgis
  CONNECTION "user=postgres password=1234 dbname=postgis host=localhost"
  DATA "the_geom FROM 
         (
            SELECT prostokarta_region.the_geom AS the_geom,
            prostokarta_region.oid AS oid,
         animals.name AS aname, animals.color AS acolor, animals.sex AS asex
            from prostokarta_region, animals
            where (animals.id = prostokarta_region.id) and (animals.name='%nam%') and (animals.color='%col%') and (animals.sex='%sex%')

            )
            AS new_table USING SRID=4326"
  TYPE POLYGON
  CLASSITEM "aname"
  CLASS
   NAME "Лесной"
   EXPRESSION 'Лесной'
   COLOR 100 100 100
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Полярный"
   EXPRESSION 'Полярный'
   COLOR 0 0 0
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Степной"
   EXPRESSION 'Стеной'
   COLOR 255 255 0
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Русак"
   EXPRESSION 'Русак'
   COLOR 100 100 100
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Пятнистый"
   EXPRESSION 'Пятнистый'
   COLOR 200 100 0
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Степной"
   EXPRESSION 'Степной'
   COLOR 200 100 50
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Маленькая"
   EXPRESSION 'Маленькая'
   COLOR 400 100 50
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Чернобурка"
   EXPRESSION 'Чернобурка'
   COLOR 500 100 50
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Низкая"
   EXPRESSION 'Низкая'
   COLOR 700 100 50
   OUTLINECOLOR 100 100 100
  END
END
END
Итак, при такой схеме у меня выводится, если выбраны строго Волк, Цвета и Пол - рисуется на карте соответствующего цвета квадрат (это только в том случае, если зарание известно, что в БД есть волк лесной черного цвета и мужского пола, НО если я не знаю какого он пола или цвета и выберу из выпадающего списка волк: Лесной, Рыжий и Женский, то ничего не закрасится), меняю SQL-запрос на вот такой:

Код: Выделить всё

SELECT prostokarta_region.the_geom AS the_geom,
            prostokarta_region.oid AS oid,
         animals.name AS aname, animals.color AS acolor, animals.sex AS asex
            from prostokarta_region, animals
            where (animals.id = prostokarta_region.id) and (animals.name='%nam%') or (animals.color='%col%') or (animals.sex='%sex%')
результат, выводятся волки лесные, и !!! все животные белого цвета, а также мужского пола, которые есть в БД!!!

Вторая проблема, в выпдающих списках (волк, заяу и лиса), если заметили имется <select name ="nam" size=1> значение присвоено name ="nam", в этом случае вообще ничего не выводится и на карте, пришлось мне сделать следующее, один выпадающий список с разграничителями:

Код: Выделить всё

<form name="mapserv" method="GET" action="/cgi-bin/mapserv.exe">
 <text><b>Выберите животное</b></text><br>
  <input type="hidden" name="map" value="[map]">
   <select name ="nam" size=1>
    <option  selected></option>
    <option>---</option>
    <option>Волк</option>
    <option>---</option>
    <option value='Лесной'>Лесной</option>
    <option value='Полярный'>Полярный</option>
    <option value='Степной'>Степной</option>
    <option>---</option>
    <option>Заяц</option>
    <option>---</option>
    <option value='Русак'>Русак</option>
    <option value='Пятнистый'>Пятнистый</option>
    <option value='Степной'>Степной</option>
    <option>---</option>
    <option>Лиса</option>
    <option>---</option>
    <option value='Маленькая'>Маленькая</option>
    <option value='Чернобурка'>Чернобурка</option>
    <option value='Низкая'>Низкая</option>
   </select><br>

 <text><b>Цвета</b></text><br>
  <input type="checkbox" name="col" value='Белый'>Белый<br>
  <input type="checkbox" name="col" value='Черный'>Черный<br>
  <input type="checkbox" name="col" value='Рыжий'>Рыжий<br>

 <text><b>Пол</b></text><br>
  <input type="checkbox" name="sex" value='Муж'>муж<br>
  <input type="checkbox" name="sex" value='Жен'>Жен<br>

  <input type="submit"  value="Найти">
  <input type="hidden" name="layer" value="prostokarta_region">
  <input type="hidden" name="layer" value="base">
  <input type="hidden" name="mode" value="browse">
</form>
При такой постановке, животные находятся, но повторяется случай описанный выше, что все рисуется в куче :(((

Мне необходимо следующее:
Из выпадающего списка с Волками выбираю Лесной, затем из чекбокса Цвета выбираю Белый и потом из Чекбокса Пол выбираю муж, НО при этом я не знаю (умышленно не знаю, т.е. как будто я пользователь карты, которому не известно, что записано в БД) и у меня на карте закрашиваются соответствующие клетки с животным. Потом аналогично для других животных. И хочу, чтобы можно было выбирать все по отдельности, т.е. выбираю из списка с волками, потом из Зайцев и Лис и мне на карте закрашиваются где такие зверюшки сидят на карте.
Последний раз редактировалось arzobispo 13 май 2009, 18:08, всего редактировалось 1 раз.
С Уважением, Антон
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Сообщение Denis Rykov »

Строка,

Код: Выделить всё

(animals.name='%nam%') or (animals.color='%col%') or (animals.sex='%sex%')
означает совокупность животных с данным именем или данным цветом или данного пола. Это выглядит примерно так, вывести всех волков или животных белого цвета или мужского пола, то есть в итоге будут выведены все волки+все звери коричневого цвета+все звери мужского пола.
Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

Re: Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Сообщение arzobispo »

Денис спасибо за ответ по запросу! :) Вечером попробую его дома. У меня еще вопрос, его писал первый раз еще в этой теме:

Код: Выделить всё

<text><b>Волк</b></text><br>
  <input type="hidden" name="map" value="[map]">
   <select name ="nam" size=1>
    <option  selected></option>
    <option value='Лесной'>Лесной</option>
    <option value='Полярный'>Полярный</option>
    <option value='Степной'>Степной</option>
   </select><br>

<text><b>Заяц</b></text><br>
  <input type="hidden" name="map" value="[map]">
   <select name ="nam" size=1>
    <option  selected></option>
    <option value='Русак'>Русак</option>
    <option value='Пятнистый'>Пятнистый</option>
    <option value='Степной'>Степной</option>
   </select><br>

<text><b>Лиса</b></text><br>
  <input type="hidden" name="map" value="[map]">
   <select name ="nam" size=1>
    <option  selected></option>
    <option value='Маленькая'>Маленькая</option>
    <option value='Чернобурка'>Чернобурка</option>
    <option value='Низкая'>Низкая</option>
   </select><br>

<text><b>Цвета</b></text><br>
  <input type="checkbox" name="col" value='Белый'>Белый<br>
  <input type="checkbox" name="col" value='Черный'>Черный<br>
  <input type="checkbox" name="col" value='Рыжий'>Рыжий<br>

<text><b>Пол</b></text><br>
  <input type="checkbox" name="sex" value='Муж'>муж<br>
  <input type="checkbox" name="sex" value='Жен'>Жен<br>

  <input type="submit"  value="Найти">
  <input type="hidden" name="layer" value="prostokarta_region">
  <input type="hidden" name="layer" value="base">
  <input type="hidden" name="mode" value="browse">
</form>
В описании формы <form></form> мне только один раз указывать вот эту строчку:

Код: Выделить всё

 <input type="hidden" name="map" value="[map]">
или мне ее писать каждый раз перед новым <select></select> ?

И передадутся все даныне из блоков <select> и input type="checkbox" name="sex" value='Муж'> в MapServer?
С Уважением, Антон
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Сообщение Denis Rykov »

Строку писать один раз, данные передадутся.
Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

Re: Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Сообщение arzobispo »

По запросу SQL: ты мне написал без вот этого

Код: Выделить всё

(animals.id = prostokarta_region.id)
, т.е. мне не надо указывать эту свзяь или надо? Т.е. без нее будут закрашиваться квадратики?
С Уважением, Антон
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Сообщение Denis Rykov »

Антон, это уже не ко мне вопрос, это уже логика вашего приложения. Выражение (animals.id = prostokarta_region.id) обозначает выбрать животных, id которых совпадает с id области карты.
Spatial is now, more than ever, just another column- The Geometry Column.
Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

Re: Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Сообщение arzobispo »

Этим выражением

Код: Выделить всё

(animals.id = prostokarta_region.id) 
устанавливается связь между таблицами, если ее убрать, то как связываются таблички тогда?
С Уважением, Антон
Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

Re: Много выпадающих списков и чекбоксов для MS+Postgre+PostGIS

Сообщение arzobispo »

Доброго времени суток!
В продолжении темы, Денис, попробовал SQL, который ты вчера написал, он не работает должным образом, а работает так: красит все квадратики в один цвет, не зависимо от того есть ли зверь там такой.
Связь

Код: Выделить всё

(animals.id = prostokarta_region.id)
необходима, т.к. по ней связываются две таблицы по полю id .
Сделал следующий запрос:

Код: Выделить всё

(animals.id = prostokarta_region.id) and (animals.name='%nam%') and (animals.color='%col%') and (animals.sex='%sex%')
при таком запросе отображаются звери, если выбрано все из выпадающих списков, НО если хотя бы одинин параментр из выпадающего списка не выбран, то при нажатии на кнопуку [Выполнить] ничего не происходит. Это важно, т.к. бывает часто нужно просто узнать (отобразить) на карте именно всех {волков} не зависимо от остальных параметров, а именно: цвет и пол.

Для решения задачи вчера написал еще один слой (кстати, он не работает почему то, но об этом ниже), а также в таблицу {Animals} добвил еще один столбец Cod, в котором все значения для всех строк равно 1, и в html добавил еще один checkbox:

Код: Выделить всё

<input type="checkbox" name="cod" value='1'>Выбрать только животных<br>
Вот запрос:

Код: Выделить всё

LAYER
  NAME "Zvery"
  ...

  DATA "the_geom FROM 
         (
            SELECT prostokarta_region.the_geom AS the_geom,
            prostokarta_region.oid AS oid,
         animals.name AS aname, animals.cod AS acod
            FROM prostokarta_region, animals
            WHERE (animals.id = prostokarta_region.id) and (animals.name='%nam%') and (animals.cod='%cod%') 
            )
            AS new_table USING SRID=4326"
...

END
Если выбираю животное {Волк} или {Заяц} (не важно кого именно) и выбираю в checkbox'е {Выбрать только животных}, то происходит выборка из БД именно выбранного животного.

Для решения задачи обозначенной в настоящем посте сегодня: "часто нужно просто узнать (отобразить) на карте именно всех {волков} не зависимо от остальных параметров, а именно: цвет и пол." создаю в мар-файле еще один слой и в результате у меня ТРИ слоя, один base, prostokarta_region и zvery:

Код: Выделить всё

LAYER 
  NAME "base" 
  CONNECTIONTYPE postgis
  CONNECTION "user=postgres password=1234 dbname=postgis host=localhost"
  DATA "the_geom FROM prostokarta_region USING SRID=4326"
  TYPE POLYGON
   CLASS
    COLOR 125 234 100
    OUTLINECOLOR 100 100 100
  END


LAYER
  NAME "prostokarta_region"
  ...

  DATA "the_geom FROM 
         (
            SELECT prostokarta_region.the_geom AS the_geom,
            prostokarta_region.oid AS oid,
         animals.name AS aname, animals.color AS acolor, animals.sex AS asex
            FROM prostokarta_region, animals
            WHERE (animals.id = prostokarta_region.id) and (animals.name='%nam%') and (animals.color='%col%') and (animals.sex='%sex%')

            )
            AS new_table USING SRID=4326"
...

END

LAYER
  NAME "zvery"
  ...

  DATA "the_geom FROM 
         (
            SELECT prostokarta_region.the_geom AS the_geom,
            prostokarta_region.oid AS oid,
         animals.name AS aname, animals.cod AS acod
            FROM prostokarta_region, animals
            WHERE (animals.id = prostokarta_region.id) and (animals.name='%nam%') and (animals.cod='%cod%') 
            )
            AS new_table USING SRID=4326"
...

END
и вот тут вот начинаются чудеса в прямом смысле этого слова!!! Запрос из слоя {prostokarta_region} отрабатывается нормально, как и должен, а вот второй запроc из слоя {zvery} НЕ РАБОТАЕТ! Почему он не работает?
С Уважением, Антон
Ответить

Вернуться в «Веб-картография»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя