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

анализ работы mapSeekSelectArea в разных версиях

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
анализ работы mapSeekSelectArea в разных версиях
 
Здравствуйте уважаемые разработчики ядра !
Вопрос задаю в вертке ГИС ТУлКит, а скрины с Просмотровщика, потому что нужна корректная работа функции.
Поясните пожалуйтса следующую ситуацию (справа ГисКарта 8-я (старая), слева 11-я новая)
Общая обстановка

Выбираем один и тот же объект область

ПОЛУЧАЕМ

------------
Вопрос:
стоит ли переходить на новые версии ядра, если могут вознинкуть следующие ситуации?
------------
Для справки: входимость(пересечения) того или иного элемента воздушного пространства с базовой временной зоной, является входной информацией для принятия решения о разрешении деятельности или об отказе.
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Ошибку поправили. Новый библиотеки доступны для скачивания.
 
Вот мой пример  - СКАЧАТЬ (для скачивания нажать кнопку "бесплатно")
Работа примера с последними библиотеками от 23.03.2012 выглядит приблизительно так:

----
На картинке видно что кроме самого себя , функция ничего не выбирает в пределах 50 км от неё.
Пробовал менять знак на - 5 км то же самое.
В архиве есть карта, на которой нанесён буффер в виде площадного объекта. По буфферу видно что должно пересекатся как минимум 3 объекта.
Изменено: KFF - 29.03.2012 10:51:22
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
СКАЧАТЬ >> http://depositfiles.com/files/prj6vrdux

КНОПКА


КОД
Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,  Grids, DBGrids, DBGridEh, Extras,  ExtCtrls, mapproc,  maptype,  ComCtrls,

type
  TForm1 = class(TForm)
    Label4: TLabel;
    Hbuff: TEdit;
    Label1: TLabel;
    _key: TEdit;
    CalcConflict: TButton;
    m1: TMemo;
    isBuff: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure CalcConflictClick(Sender: TObject);
  private
  public
    Map  : HMap;
  end;

var
  Form1: TForm1;

implementation
uses dateutils, math;

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
var path : string;
begin
  path := ExtractFilePath(Application.Exename);
  Map := mapOpenMap(PChar(path+'\MAP\ЗОНЫ.sit'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  mapCloseMap(Map);
end;

procedure TForm1.CalcConflictClick(Sender: TObject);
var Obj     : HObj;
    Select  : HSelect;
    i, buff : integer;
begin
  m1.Clear;
  Select := mapCreateSiteSelectContext(Map, Map);
  mapSelectLocal(Select, -1, 1); // все локализации
  Obj := mapCreateSiteObject(Map, Map);
  mapSeekSiteObject(Map, Map, Obj, StrToIntDef(_key.Text,0));
  // select  - контекст поиска об'ектов
  // Obj     - объект-область поиска
  // buff    - расстояние поиска в метрах
  // filter  - не учитывать фильтр объектов (= 0)
  // inside  - границы поиска объектов по области : 1 - внутри области;
  // visible - без учета(0) видимости объектов на карте
  // action  - порядок поиска объектов :   0 - последовательный поиск по мере запроса объектов;
  buff := StrToIntDef(Hbuff.Text, 0)*byte(isBuff.Checked);

  mapSelectSeekArea(Select, Obj, buff, 0, 1, 0, 0);
  i:=0;
  while mapSeekSiteSelectObject(Map, Map, Obj, Select, 4*byte(i>0))<>0 do
  begin
   m1.Lines.Add(IntToStr(mapObjectKey(Obj)));
   inc(i);
  end;
  mapFreeObject(Obj);
  mapDeleteSelectContext(Select);
end;

end.

КОД
Изменено: KFF - 03.04.2012 11:51:38
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Код для тестирования (проект mapexam из sdk11.zip):

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

#include <stdio.h>

int CallApplication(HMAP hMap, HWND handle)
{
  // Номер объекта
  unsigned long int key = 2178984811;
//  long int key = -2115982485;

  // Рабочая копия объекта
  HOBJ hObj = mapCreateSiteObject(hMap, hMap);

  if (mapSeekObjectInList(hMap, hMap, hObj, 1, key) == 0)
    {
      // Нет такого объекта или карты
      ::MessageBox(handle, "Не найден объект - область поиска", "Тестирование поиска",
                   MB_OK | MB_ICONSTOP | MB_TASKMODAL);
 
       mapFreeObject(hObj);
       return 0;
    }

  HSELECT hSelect = mapCreateSiteSelectContext(hMap, hMap);
  if (hSelect == 0)
    {
      ::MessageBox(handle, "hSelect - не создан", "Тестирование поиска",
                   MB_OK | MB_ICONSTOP | MB_TASKMODAL);
      mapFreeObject(hObj);
      return 0;
    }

//  mapSelectSeekArea(hSelect, hObj, 5000.0, 0, 1, 0, 0);
  mapSelectSeekArea(hSelect, hObj, 5000.0, 0, 0, 0, 0);

  int count = mapSeekSelectObjectCount(hMap, hSelect);  

  char message[80];
  sprintf(message, "Найдено объектов - %u", count);

  ::MessageBox(handle, message, "Тестирование поиска",
                MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);

  if (count > 0)
    {
      HOBJ hObj2 = mapCreateSiteObject(hMap, hMap);
      int  flag  = WO_FIRST;

      while(mapSeekSelectObject(hMap, hObj2, hSelect, flag) != 0)
      {
        flag = WO_NEXT;
        key  = (unsigned) mapObjectKey(hObj2);

        char keystr[80];
        sprintf(keystr, "Найден объект, номер - %u", key);  

        ::MessageBox(handle, keystr, "Тестирование поиска",
                     MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
      }

      mapFreeObject(hObj2);
    }

  // Освободить ресурсы
  mapFreeObject(hObj);

  mapDeleteSelectContext(hSelect);

  return 0;
}


 
Добрый день, разработчики.

Имею:
GisTool15Free
Delphi 10.4

Есть описание параметров функции

// Установить в контексте параметры поиска объектов по области.
 // hselect - контекст поиска об'ектов
 // object - объект-область поиска
 // distance - расстояние поиска в метрах
 // флажки,описывающие критерии поиска :
 // filter  - учитывать/не учитывать(1/0) фильтр объектов
 //           (параметры фильтра должны быть установлены заранее
 //           в контексте поиска)
 // inside  - границы поиска объектов по области :
 //           0 - внутри области по расстоянию от заданного объекта,
 //           1 - внутри области от заданного объекта, включая пересечение границы,
 //               если задано расстояние, то с учетом расстояния,
 //           2 - целиком внутри области без касания или пересечения границы,
 //           4 - целиком снаружи области без касания или пересечения границы,
 // visible - с учетом/без учета(1/0) видимости объектов на карте
 // action   - порядок поиска объектов :
 //            0 - последовательный поиск по мере запроса объектов (может принудительно восприниматься как 1
 //                для ускорения поиска по большим картам),
 //            1 - предварительный отбор всех объектов
 //            (главному окну приложения посылается WM_PROGRESSBARUN - maptype.h),
 //            ускоряет многократный запрос отобранных объектов, НО ПОСЛЕ ЭТОГО ПОИСК БУДЕТ ИДТИ ТОЛЬКО ПО КАРТЕ,
 //            НА КОТОРОЙ СОЗДАН HSELECT
 // subjectflag - выполнять поиск с учетом подобъектов заданной области (исключать внутренние контура)
 // samplelistflag - при наличии списка объектов (см. mapSelectSampleUn и т.п.) выполнить операцию
 //              над объектами из этого списка (см. SAMPLELISTFLAG)
 // При ошибке возвращает нольа (можно выполнять пересечение условий отбора)
 // При ошибке возвращает ноль

function mapSelectSeekAreaEx(aHselect : HSELECT; aObj : HOBJ;
                            aDistance : double = 0.0;
                            aFilter : integer = 0;
                            aInside : integer = 1;
                            aVisible : integer = 0;
                            aAction : integer = 0;
                            subjectflag : integer = 0;
                            samplelist : integer = 0) : integer;
 stdcall external sGisAcces;
 
function mapSelectSeekArea(aHselect : HSELECT; aObj : HOBJ;
                            aDistance : double = 0.0;
                            aFilter : integer = 0;
                            aInside : integer = 1;
                            aVisible : integer = 0;
                            aAction : integer = 0) : integer;


Какие параметры я должен установить, что-бы найти объекты лежащие вне основного объекта на заданном расстоянии ?  
 
Для корректного поиска объектов, находящихся на заданном удалении от указанного объекта или области,
необходимо построить зону вокруг объекта на заданном расстоянии и выполнить поиск объектов, не входящих в эту зону.

В новой версии программ функция mapSelectSeekArea будет сама внутри строить зону с учетом проекции карты и выполнять поиск,
если будет задано расстояние поиска (distance) и поиск целиком снаружи области (inside = 4).
Обновление программы GIS ToolKit (Free) планируется сегодня.
Для получения новой версии GIS ToolKit Free необходимо прислать запрос на электронную почту panorama@gisinfo.ru
 
 //  Поиск объектов, имеющих смежный участок с заданным объектом
//  Поиск ведется в карте, где находится выбранный объект
//  hMap  - идентификатор открытой карты,
//  info  - идентификатор существующего объекта,
//          для которого надо найти смежные участки
//  MAPADJACENTLISTEX - память для соседей
//  count - максимальное количество смежных участков
//  select - условия поиска объектов для списка
//  delta - допуск до объекта в метрах
//  point - обработка сторон,образуемых повторяющимися точками:
//  0 - заносить в список, 1 - нет
//  subject - 0 искать соседей только с внешним контуром
// ( 1- с учетом подобъектов, нумерация точек объекта и подобъектов - сквозная)
//  Если соседи не найдены - возвращает ноль,
//  иначе - количество соседей


 code := mapSeekAdjacentListEx(hMapIn, Obj1, @aListAdj, aCounAdj, sel2, distance, 1, 0);

Есть ещё такая функция. но почему-то при вызове выдаёт code = 1, но при этом в aListAdj первая запись, не соответствует найденному смежному участку.(пустые поля, только
First     : integer;                 // первая точка участка
Last      : integer;                 // последняя точка участка
равны 1.

И какие параметры для функции необходимо установить, чтобы она нашла смежные участки на заданном расстоянии ?
 
delta - допуск до объекта в метрах

Это погрешность совпадения участков границ - миллиметр, сантиметр. Это не расстояние.
 
Спасибо за информацию.
Страницы: 1
Читают тему (гостей: 1)



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

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