На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Поиск объекта со названию

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Поиск объекта со названию, Как найти объект без учёта регистра букв
 
Здравствуйте!

Скажите, пожалуйста, как найти объект без учёта регистра букв, например, чтобы на запрос "невский*" находился "Невский проспект"

Использую код вида
   HSELECT hSelect = mapCreateMapSelectContext(hMap);
   mapSelectLayer(hSelect,-1,1);
   mapSelectSemanticAppend(hSelect, CMANY, 9, "невский*");
   HOBJ hObj = mapCreateObject(hMap, 1, IDFLOAT2, 0);
   char SemVal[255];
   int flag = WO_FIRST;
   while (mapSeekSelectObject (hMap, hObj, hSelect, flag))
{
...
}

Заранее спасибо
 
Поиск всегда ведется без учета регистра.
 
Вопрос разработчикам для оьщего развития:
В функции поиска это совместимый синтаксис ?
mapSelectSemanticAppend(hSelect, CMANY, 9, "невский*");
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
А почему нет. CMANY говорит, что надо делать, если условий поиска несколько.
 
Задам очень дураций вопрос, хотя может я чтото и пропустил из за невнимательности. Есть ли поиск по семантике аналогичный LIKE в SQL с разными вариациями ? Пример - поиск аналогичный в поисковых системах. Фраза вбитая в поле, разбивается на отдельные слова и в фильтр попадают все объекты, содержащие хотябы одно из них. Т.е ищем по всем семантикам.
Раньше я решал проблему простым перебором всех объектов, потом делал так называемое индексное поисковое поле из семантик, среди которых разрешон поиск, а сейчас просто сделал синхронизацию семантики объектов и базы данных, и ищу по ней...
 
В параметры поиска надо добавить несколько условий типа
mapSelectSemanticAppend(hSelect, CMANY, 9, "невский*");
mapSelectSemanticAppend(hSelect, CMANY, 9, "пите*");
 
Здравствуйте.
Подскажите, пожалуйста, как сформировать HSELECT hSelect
Если задано несколько условий
Нужно найти объекты
1.ExCode = 45200000 Local = OL_LINE c характеристикой 40 и значением 4
 code := mapSiteRscObjectCode(hMapIn, hMapIn, 45200000, OL_LINE); // ищем
 mapSelectObject(sel, code, 1); //включаем нужный
 mapSelectSemanticLink(sel, SC_CMAND);
 code := mapSelectSemanticAppend(sel, integer(SC_EQUAL), 40, '4');

2.Плюс к этому добавить объект с другим кодом, например 45111000 не важно какие у него характеристики
 code := mapSiteRscObjectCode(hMapIn, hMapIn, 45111000, OL_LINE); // ищем
 mapSelectObject(sel, code, 1); //включаем нужный

3.И например объекты 45140000  OL_LINE с характеристикой 9 со значением '10'
 

В одном HSELECT все условия по отбору видов объектов (кодов, слоев, локализаций) пересекаются со всеми условиями по семантикам.
Для семантик можно строить комбинации условий с объединением через ИЛИ / И.

Отбор объектов - это как выбор таблиц в базе данных, а условия по семантикам - это как условия по атрибутам в SELECT.

В данном случае есть 3 набора условий.
Их формирование зависит от того, что планируется делать с найденными объектами.

Например, каждый найденный объект отдельно как-то обрабатывается.
Тогда можно сделать 3 прохода по 3 условиям и обработать все объекты.

Или нужно выделить все подходящие объекты на карте через один HSELECT:

1) Заполняем 3 HSELECT по указанным условиям.
2) Переводим условия отбора в списки объектов
mapSelectSampleBySelectObjects(HSELECT hselect);
3) Дописываем списки объектов из второго и третьего HSELECT в первый. Добавятся только новые номера.

mapGetSampleCount, mapGetSampleByNumber, mapSelectSampleByNumber

В новой версии пункт 3 можно будет выполнить командой mapSelectOrSelect (сейчас номера объектов не объединяются).

 
Пример (с учетом новой версии mapSelectOrSelect) - может быть собран в виде DLL/SO и запущен из меню Задачи - Запуск приложений (или добавить на пользовательскую панель) .
Открыть карту Ногинск из примеров в инсталляции ГИС Панорама и запустить задачу.

#include "mapapi.h"  

// --------------------------------------------------------------
//  Собственно задача                    
// --------------------------------------------------------------

int CallApplication(HMAP hMap, const TASKPARMEX * parm)
{
 HRSC hrsc = mapGetRscIdent(hMap, hMap);

 TEMPHSELECT hselect1(mapCreateSiteSelectContext(hMap, hMap));
 mapSelectObject(hselect1, -1, 0);
 int objectcode = mapGetRscObjectCodeByNumber(hrsc, 71111110, LOCAL_SQUARE, 1);    // ЛЕСА
 mapSelectObject(hselect1, objectcode, 1);

 int semanticcode = 3193;
 const WCHAR* value = WTEXT("wood");
 mapSelectSemanticAppendExUn(hselect1, CMEQUAL, semanticcode, value, 1);

 int count1 = mapSeekSelectObjectCountEx(hMap, hselect1, WO_INMAP);  // 6 451

 mapSelectSampleBySelectObjects(hselect1);

 int samplecount1 = mapSeekSelectObjectCountEx(hMap, hselect1, WO_INMAP);  // 6 451

 if (count1 != samplecount1)
 {
   const WCHAR* text = WTEXT("count1 != samplecount1");
   const WCHAR* caption = WTEXT("Проверка функции mapSelectSampleBySelectObjects");
   mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONWARNING | MB_TASKMODAL);
 }

 TEMPHSELECT hselect2(mapCreateSiteSelectContext(hMap, hMap));
 mapSelectObject(hselect2, -1, 0);
 objectcode = mapGetRscObjectCodeByNumber(hrsc, 31120002, LOCAL_SQUARE, 1);   // ОЗЕРА
 mapSelectObject(hselect2, objectcode, 1);

 semanticcode = 9;
 mapSelectSemanticAppendExUn(hselect2, CMANY, semanticcode, 0, 1);

 int count2 = mapSeekSelectObjectCountEx(hMap, hselect2, WO_INMAP);  // 223

 objectcode = mapGetRscObjectCodeByNumber(hrsc, 71111110, LOCAL_SQUARE, 1);    // ЛЕСА
 mapSelectObject(hselect2, objectcode, 1);

 count2 = mapSeekSelectObjectCountEx(hMap, hselect2, WO_INMAP);  // 223 + 63 = 286

 mapSelectSampleBySelectObjects(hselect2);

 int samplecount2 = mapSeekSelectObjectCountEx(hMap, hselect2, WO_INMAP);  // 286

 if (count2 != samplecount2)
 {
   const WCHAR* text = WTEXT("count2 != samplecount2");
   const WCHAR* caption = WTEXT("Проверка функции mapSelectSampleBySelectObjects");
   mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONWARNING | MB_TASKMODAL);
 }

 TEMPHSELECT hselect3(mapCreateSiteSelectContext(hMap, hMap));
 mapSelectObject(hselect3, -1, 0);
 objectcode = mapGetRscObjectCodeByNumber(hrsc, 61330000, LOCAL_LINE, 1);    // ТРОПЫ
 mapSelectObject(hselect3, objectcode, 1);

 semanticcode = 3172;
 value = WTEXT("track");
 mapSelectSemanticAppendExUn(hselect3, CMEQUAL, semanticcode, value, 1);

 int count3 = mapSeekSelectObjectCountEx(hMap, hselect3, WO_INMAP);  // 6 326

 mapSelectSampleBySelectObjects(hselect3);

 int samplecount3 = mapSeekSelectObjectCountEx(hMap, hselect3, WO_INMAP);  // 6 326

 if (count3 != samplecount3)
 {
   const WCHAR* text = WTEXT("count3 != samplecount3");
   const WCHAR* caption = WTEXT("Проверка функции mapSelectSampleBySelectObjects");
   mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONWARNING | MB_TASKMODAL);
 }

 mapSelectOrSelect(hselect1, hselect2);  // 6 451 + 223 + 3 = 6 677  // 3 имеют семантику 9, но не имеют 3193
 int check1 = mapSeekSelectObjectCountEx(hMap, hselect1, WO_INMAP);  // 6 677

 mapSelectOrSelect(hselect1, hselect3);  // 6 677 + 6 326 = 13 003;
 int total = mapSeekSelectObjectCountEx(hMap, hselect1, WO_INMAP);  // 13 003

 if (total != 13003)
 {
   const WCHAR* text = WTEXT("total != 13003");
   const WCHAR* caption = WTEXT("Проверка функции mapSelectOrSelect");
   mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONWARNING | MB_TASKMODAL);
 }
 else
 {
   const WCHAR* text = WTEXT("total = 13003");
   const WCHAR* caption = WTEXT("Проверка функции mapSelectOrSelect");
   mapMessageBoxUn(0, text, caption, MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
 }

 return 1;
}

// --------------------------------------------------------------
//  Точка входа в задачу
// --------------------------------------------------------------
extern "C"
{
 __declspec(dllexport) long int WINAPI GetInterfaceVersion() { return 0; }

 // Точка входа в задачу без интерактивных обработчиков для ГИС Панорама
 __declspec(dllexport) long int WINAPI CallMapFunctionEx(HMAP hmap, const TASKPARMEX * parm)
 {
   if (hmap == 0) return 0;
   return CallApplication(hmap, parm);
 }

 // Точка входа в задачу без интерактивных обработчиков для ГИС Оператор
 __declspec(dllexport) long int WINAPI CallGisFunctionEx(HMAP hmap, const TASKPARMEX * parm)
 {
   return CallMapFunctionEx(hmap, parm);
 }
}
 
Спасибо за развёрнутый ответ
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2026

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности