На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты
АРХИВ ФОРУМА...
здесь вы можете ознакомиться с материалами форума до 08.06.2008

V Bolotoff (все сообщения)

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти  
Форум » Пользователи » V Bolotoff
Выбрать дату в календаре ...  Выбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 След.
Получение точных габаритов карты после ее перевода в другую систему координат
Здравствуйте!
Если имеем дело с одной такой картой, то можно перевести всю метрику (или метрику сетки) в географические координаты и найти минимум-максимум по широте и долготе - это и будут Ваши точки. Затем переводите их в любую СК.

С Уважением, Болотов В.И.
флаг "не сжимать" для объекта классификатора
Здравствуйте!

Подскажите пожалуйста, как получить значение флага "не сжимать" для объекта классификатора (не объекта карты).
Например, значение флага "масштабировать" можно получить в составе структуры TRSCOBJECT функцией mapGetRscObject().

А как насчет "не сжимать"?

С Уважением, Болотов В.И.
Отложить расстояние от точки
Здравствуйте!

Код

const
  rad   : extended = 180 / pi;
  radr  : extended = pi / 180;

  // Красовский 42
  a_kr  = 6378245.0;  // большая полуось (экваториальный радиус), м
  c_kr  = 1/298.3;    // (a-b)/a  (сжатие эллипсоида)
  e2_kr = 2*c_kr - c_kr*c_kr;  // (a2-b2)/a2  (квадрат эксцентриситета)
  b_kr  = 6356863.0;  // малая (полярная) полуось, м

function  sk_get_lgeo42_bess(f1,t1,f2,t2: double; var s,a12,a21: double): boolean;
var  b1,l1,b2,l2,l,w,wi,dw,tb1,tb2,u1,u2,a1,a2,x,y,m,g,g1,k,q,dq,a,b,c,d,alf,bet,gam: extended;
// PEШEHИE OБPATHOЙ ГEOДEЗИЧECKOЙ ЗAДAЧИ HA ЭЛЛИПCOИДE METOДOM БECCEЛЯ
// ->  a_kr - ПOЛУOCЬ ЭЛЛИПCOИДA B METPAX, e2_kr - KBAДPAT ЭKCЦEHTPИCИTETA;
// ->  B1,L1,B2,L2 - ГEOДEЗИЧECKИE KOOPДИHATЫ TOЧEK B ГРАДУСАХ;
// <-  s - ДЛИHA ГЕОЛИНИИ B METPAX;
// <-  A12 И A21 ПPЯMOЙ И OБPATHЫЙ ГEOДEЗИЧECKИЙ AЗИMУT В ГРАДУСАХ.
begin  // (на эллипсоиде Красовского)
  Result := false;
  if (abs(f1-f2)<1e-5) and (abs(t1-t2)<1e-5) then begin  s := 0;  a12 := 0;  a21 := 0;  exit;  end;
  if (t1 > 89.9) then t1 := 89.9 else if (t1 < -89.9) then t1 := -89.9;
  if (t2 > 89.9) then t2 := 89.9 else if (t2 < -89.9) then t2 := -89.9;
  while (f1 < -180) do f1 := f1 + 360;  while (f1 > 360) do f1 := f1 - 360;
  while (f2 < -180) do f2 := f2 + 360;  while (f2 > 360) do f2 := f2 - 360;
  b1 := t1 * radr;  l1 := f1 * radr;
  b2 := t2 * radr;  l2 := f2 * radr;
  l  := l2 - l1;  tb2 := sin(b2)/cos(b2);  tb1 := sin(b1)/cos(b1);
  u1 := arctan(sqrt(1 - e2_kr) * tb1);
  u2 := arctan(sqrt(1 - e2_kr) * tb2);
  w  := l;
  while (true) do
  begin
    x := sin((u2-u1)/2);  y := sin(w/2)/cos(w/2) * cos((u2+u1)/2);  a1 := mp_atan_2(x, y);
    x := cos((u2-u1)/2);  y := sin(w/2)/cos(w/2) * sin((u2+u1)/2);  a2 := mp_atan_2(x, y);
    a12 := a1 - a2;  while (a12 < 0) do a12 := a12 + 2*pi;
    a21 := a1 + a2 + pi;  while (a21 >= 2*pi) do a21 := a21 - 2*pi;
    m := arctan(sin(u1)/cos(u1)/cos(a12));  g1 := sin(a12) * cos(u1);
    if (abs(sin(m)) > abs(cos(m)))
    then g := sin(u1) / sin(m)
    else g := cos(u1) * cos(a12) / cos(m);
    if (abs(sin(a12)) >= abs(cos(a12)))
    then y := cos(u2) * sin(w) / sin(a12)
    else y := (sin(u2)*cos(u1) - cos(u2)*sin(u1)*cos(w)) / cos(a12);
    x := sin(u1)*sin(u2) + cos(u1)*cos(u2)*cos(w);
    q := mp_atan_2(x, y);
    k := (e2_kr/(1-e2_kr)) * g * g;
    a := ((5/4*k - 3)/64*k + 0.25) * k + 1;
    b := (((15*k)/512 - (1/16)) * k + 0.25) * k;
    c := (1 - 0.75*k)/128 * k * k;
    d := k * k * k / 1536;
    dq := b*sin(q)*cos(2*m+q) + c*sin(2*q)*cos(2*(2*m+q)) + d*sin(3*q)*cos(3*(2*m+q));
    alf := ((e2_kr/2 + 1)*e2_kr*0.125 - (e2_kr+1)*e2_kr*g*g*0.0625 + 0.5) * e2_kr;
    bet := ((1-g*g*0.5)*e2_kr + 1)*g*g*e2_kr*e2_kr*0.0625;
    gam := ((e2_kr*g)*(e2_kr*g)*(e2_kr*g)*g)/256;
    dw := ( alf*q + bet*sin(q)*cos(2*m+q) + gam*sin(2*q)*cos(2*(2*m+q)) ) * g1;
    wi := l + dw;
    dw := wi - w;
    w  := wi;
    if (abs(dw) < 1e-13) then
    begin
      s := a_kr * sqrt(1-e2_kr) * (a*q - dq);
      a12 := a12 * rad;  a21 := a21 * rad;
      break;
    end;
  end;
  Result := true;
end;

function  sk_get_f2t242_bess(f1,t1,s,a12: double; var f2,t2,a21: double): boolean;
var  b1,l1,b2,l2,l,w,dw,tb1,u1,u2,x,y,m,g,g1,k,q,dq,si,a,b,c,d,alf,bet,gam: extended;
label  mm1;
// PEШEHИE ПPЯMOЙ ГEOДEЗИЧECKOЙ ЗAДAЧИ HA ЭЛЛИПCOИДE METOДOM БECCEЛЯ
// -> a_kr - ПOЛУOCЬ ЭЛЛИПCOИДA B METPAX, e2_kr - KBAДPAT ЭKCЦEHTPИCИTETA;
// -> B1,L1 - ГEOДEЗИЧECKИE KOOPДИHATЫ 1-OЙ TOЧKИ B ГРАДУСАХ; s - ДЛИHA ГЕОЛИНИИ В МЕTPAX;
// -> A12 - ПPЯMOЙ ГEOДEЗИЧECKИЙ AЗИMУT B ГРАДУСАХ;
// <- B2,L2 -  ГEOДEЗИЧECKИE  KOOPДИHATЫ 2-OЙ TOЧKИ;
// <- A21 - OБPATHЫЙ ГEOДEЗИЧECKИЙ AЗИMУT B ГРАДУСАХ.
begin
  Result := false;
  if (abs(s) < 1e-1) then begin  f2 := f1;  t2 := t1;  a21 := 0;  exit;  end;
  while (a12 < 0) do a12 := a12 + 360;  while (a12 > 360) do a12 := a12 - 360;
  a12 := a12 * radr;
  if (t1 > 89.9) then t1 := 89.9 else if (t1 < -89.9) then t1 := -89.9;
  while (f1 < -180) do f1 := f1 + 360;  while (f1 > 360) do f1 := f1 - 360;
  b1 := t1 * radr;  l1 := f1 * radr;  tb1 := sin(b1)/cos(b1);
  u1 := arctan(sqrt(1 - e2_kr) * tb1);
  m := arctan(sin(u1)/cos(u1)/cos(a12));  g1 := sin(a12) * cos(u1);
  if (abs(sin(m)) > abs(cos(m)))
  then g := sin(u1) / sin(m)
  else g := cos(u1) * cos(a12) / cos(m);
  si := 0;
  k  := (e2_kr/(1-e2_kr)) * g * g;
  a  := ((5/4*k - 3)/64*k + 0.25) * k + 1;
  b  := (((15*k)/512 - (1/16)) * k + 0.25) * k;
  c  := (1 - 0.75*k)/128 * k * k;
  d  := k * k * k / 1536;
mm1:
  dq := b*sin(si)*cos(2*m+si) + c*sin(2*si)*cos(2*(2*m+si)) + d*sin(3*si)*cos(3*(2*m+si));
  q  := (s / (a_kr * sqrt(1-e2_kr)) + dq) / a;
  if (abs(si-q) > 1e-13) then begin  si := q;  goto mm1;  end;
  u2  := arcsin(g * sin(m+q));
  w   := mp_atan_2(cos(q)-sin(u1)*sin(u2), sin(q)*sin(a12)*cos(u1));
  a21 := mp_atan_2(-g*cos(m+q)*sin(q), -cos(u1)*sin(w)*cos(u2));
  while (a21 < 0) do a21 := a21 + 2*pi;  while (a21 >= 2*pi) do a21 := a21 - 2*pi;
  b2  := arctan(sin(u2) / cos(u2) / sqrt(1-e2_kr));
  alf := ((e2_kr/2 + 1)*e2_kr*0.125 - (e2_kr+1)*e2_kr*g*g*0.0625 + 0.5) * e2_kr;
  bet := ((1 - g*g*0.5)*e2_kr + 1)*g*g*e2_kr*e2_kr*0.0625;
  gam := ((e2_kr*g)*(e2_kr*g)*(e2_kr*g)*g)/256;
  dw  := (alf*q + bet*sin(q)*cos(2*m+q) + gam*sin(2*q)*cos(2*(2*m+q))) * g1;
  l2  := l1 + w - dw;
  while (l2 < 0) do l2 := l2 + 2*pi;  while (l2 >= 2*pi) do l2 := l2 - 2*pi;
  a21 := a21 * rad;  f2 := l2 * rad;  t2 := b2 * rad;
  Result := true;
end;



С Уважением, Болотов В.И.
Перевод координат из градусов/радиан в метры
Здравствуйте!

В API имеется несколько групп функций для преобразования координат.
Привожу эти функции (возможно не все из имеющихся в SDK ГИС):

Код


// Преобразование координат в метрах на местности из одной зоны в другую
// source - номер исходной зоны системы 1942г
// target - нужной зоны
// x;y  - преобразуемые координаты
// на входе метры в одной зоне 42г.;на выходе - другой.
// При ошибке возвращает 0
function  mapPlaneToPlaneByZone(source, target: integer; var x,y: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование координат в метрах на местности из заданной зоны
// в геодезические координаты в системе 42г.
// zone - номер исходной зоны системы 1942г
// x;y  - преобразуемые координаты
// на входе метры в одной зоне 42г.;на выходе - радианы.
// При ошибке возвращает 0
function  mapPlane42ToGeo42ByZone(zone: integer; var x, y: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

function  mapPlaneToGeo42ByZone(zone: integer; var x,y: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF} external sGisAcces;

// Преобразование координат в метрах на местности из заданной зоны UTM
// в геодезические координаты в системе WGS-84.         // 03/07/06
// zone - номер исходной зоны системы UTM
// x;y  - преобразуемые координаты
// на входе метры в одной зоне UTM; на выходе - радианы WGS-84.
// При ошибке возвращает 0
function  mapPlaneUTMToGeoWGS84ByZone(zone: integer; var x,y: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование координат в метрах на местности из одной зоны в другую  // 04/09/09
// source - номер исходной зоны системы UTM
// target - нужной зоны системы UTM
// x,y  - преобразуемые координаты
// на входе метры в одной зоне UTM, на выходе - метры в другой зоне UTM.
// При ошибке возвращает 0
function  mapPlaneUTMToPlaneUTMByZone(source: integer; target: integer;
var x, y: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование геодезических координат в радианах из системы ПЗ-90
// (общеземной эллипсоид ПЗ-90) в геодезические координаты в радианах
// в системе WGS-84 (общеземной эллипсоид WGS84)
function  mapGeoEP90ToGeoWGS843D(var Bx,Ly,H: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование геодезических координаты в радианах из системы 1942г
// (эллипсоид Красовского) в геодезические координаты в радианах
// (общеземной эллипсоид WGS84) (поддерживается не для всех карт !)
// HMAP - идентификатор открытых данных
// Bx;Ly  - преобразуемые координаты
// на входе радианы в 42г.; на выходе - радианы в WGS84
// H     - высота в точке (метры)
// Параметр HMAP может быть равен нулю
procedure mapGeo42ToGeoWGS84Ex(var Bx, Ly,H: double);
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование геодезических координаты в радианах из системы WGS 84
// (общеземной эллипсоид WGS84) (поддерживается не для всех карт !)
// в геодезические координаты в радианах в систему 1942 г (эллипсоид Красовского)
// HMAP - идентификатор открытых данных
// Bx;Ly  - преобразуемые координаты
// на входе радианы в WGS84; на выходе - радианы в 42г.
// H     - высота в точке (метры)
// Параметр HMAP может быть равен нулю
function  mapGeoWGS84ToGeo42Ex(var Bx, Ly, H: double): integer; // 03/05/05
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование геодезических координат в радианах из системы ПЗ-90
// (общеземной эллипсоид ПЗ-90) в геодезические координаты в радианах
// системы 1942 г (эллипсоид Красовского)
// Параметр HMAP может быть равен нулю
procedure mapGeoEP90ToGeo42Ex(var Bx, Ly, H: double); // 03/05/05
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

function  mapGeoEP90ToGeo42(Map: HMAP; var Bx, Ly: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

function  mapGeoEP90ToGeo423D(Map: HMAP; var Bx, Ly, H: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование геодезических координат в радианах из системы ПЗ-90
// (общеземной эллипсоид ПЗ-90) в геодезические координаты в радианах
// системы 1995 г (эллипсоид Красовского)
procedure mapGeoEP90ToGeo95Ex(var Bx, Ly, H: double); // 03/05/07
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование геодезических координат в радианах из системы 1995 г
// (эллипсоид Красовского) в геодезические координаты в радианах
// системы ПЗ-90(общеземной эллипсоид ПЗ-90)
procedure mapGeo95ToGeoEP90Ex(var Bx, Ly, H: double); // 03/05/07
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование геодезических координат в радианах из системы 1942 г
// (эллипсоид Красовского) в геодезические координаты в радианах
// системы ПЗ-90(общеземной эллипсоид ПЗ-90)
// Параметр HMAP может быть равен нулю
procedure mapGeo42ToGeoEP90Ex(var Bx, Ly, H: double); // 03/05/05
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование геодезических координат в радианах из системы 1942 г
// (эллипсоид Красовского) в прямоугольные в метрах с учетом ближайшей
// зоны к координатам точки02/10/02
// Bx;Ly - преобразуемые координаты
procedure mapGeo42ToPlaneByOwnZone(var Bx, Ly: double);
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование координат из градусов в радианы с учетом знака
// degree - структура; содержащая координаты в градусах; минутах;
// секундах. Описана в maptype.h
// radian - значение в радианах
procedure mapSignDegreeToRadian(var degree: TSIGNDEGREE; var radian: double);
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование координат из радиан в градусы со знаком
// radian - значение в радианах
// degree - структура; содержащая координаты в градусах; минутах;
// секундах. Описана в maptype.h
procedure mapRadianToSignDegree(var radian: double; var degree: TSIGNDEGREE);
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Вычисление осевого маридиана по номеру зоны для
// топокарт системы 42 года
// zone - номер зоны системы 42 года
// При ошибке возвращает ноль
function  mapGetAxisMeridianByZone(zone: integer): double;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Вычисление номера зоны по геодезической долготе в радианах
// (меридиану) для топокарт системы 42 года
// meridian - значение меридиана в радианах
// При ошибке возвращает ноль
function  mapGetZoneByMeridian(meridian: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;



// Установить текущие параметры пользовательской системы координат
// parm      - параметры рабочей системы координат (см. MAPCREAT.H)
// datum     - параметры пересчета с эллипсоида рабочей системы координат
//             к WGS-84 (datum может быть 0)                         // 04/03/10
// ellipsoid - параметры пользовательского эллипсоида для рабочей
//             системы координат, только когда поле EllipsoideKind в
//             MAPREGISTEREX равно USERELLIPSOID (ellipsoid может быть 0)
// Возвращает идентификатор пользовательской системы координат
// По завершении использования необходимо вызвать mapDeleteUserSystemParameters
// При ошибке возвращает ноль
function  mapCreateUserSystemParameters(parm: PMAPREGISTEREX;
            datum: PDATUMPARAM; ellipsoid: PELLIPSOIDPARAM): THANDLE;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование из геодезических координат (радианы) в пользовательской проекции
// в геодезические координаты в радианах (общеземной эллипсоид WGS84)
// huser - идентификатор пользовательской системы координат
// Bx,Ly - преобразуемые координаты
// на входе радианы, на выходе - радианы
// H     - высота в точке (метры)
// При ошибке возвращает 0
function  mapUserGeoToGeoWGS84(huser: THANDLE; var Bx,Ly: double) : integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;
function  mapUserGeoToGeoWGS843D(huser : THANDLE; var Bx,Ly,H: double) : integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование из геодезических координат (радианы) в пользовательской проекции  // 10/05/11
// в метры в пользовательской проекции
// huser - идентификатор пользовательской системы координат
// Bx,Ly - преобразуемые координаты
// на входе радианы, на выходе - метры
// При ошибке возвращает 0
function mapUserGeoToPlane(huser : THANDLE; var Bx : double;
                           var Ly : double) : integer;
{$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF} external sGisAcces;

// Преобразование из метров на местности в пользовательской проекции            // 10/05/11
// в геодезические координаты в радианах на эллипсоиде в пользовательской проекции
// Наличие высоты повышает точность расчетов
// huser - идентификатор пользовательской системы координат
// Bx,Ly - преобразуемые координаты
// на входе метры, на выходе - радианы
// При ошибке возвращает 0
function mapUserPlaneToGeo(huser : THANDLE; var Bx : double; var Ly : double) : integer;
{$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF} external sGisAcces;


// Преобразование из метров на местности в пользовательской проекции
// в геодезические координаты в радианах (общеземной эллипсоид WGS84)
// Наличие высоты повышает точность расчетов
// huser - идентификатор пользовательской системы координат
// Bx,Ly - преобразуемые координаты
// на входе метры, на выходе - радианы
// H     - высота в точке (метры)
// При ошибке возвращает 0
function  mapUserPlaneToGeoWGS84(huser: THANDLE; var Bx,Ly: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;
function  mapUserPlaneToGeoWGS843D(huser: THANDLE; var Bx,Ly,H: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование из геодезических координат в радианах
// (общеземной эллипсоид WGS84)
// в метры на местности в пользовательской проекции
// huser    - идентификатор пользовательской системы координат
// Bx,Ly,H  - преобразуемые координаты
// на входе радианы, на выходе - радианы
// При ошибке возвращает ноль
function  mapGeoWGS84ToUserGeo(huser: THANDLE; var Bx,Ly: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;
function  mapGeoWGS84ToUserGeo3D(huser: THANDLE; var Bx,Ly,H: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Преобразование из геодезических координат в радианах
// (общеземной эллипсоид WGS84)
// в метры на местности в пользовательской проекции
// huser    - идентификатор пользовательской системы координат
// Bx,Ly,H  - преобразуемые координаты
// на входе радианы, на выходе - метры
// При ошибке возвращает ноль
function  mapGeoWGS84ToUserPlane(huser: THANDLE; var Bx,Ly: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;
function  mapGeoWGS84ToUserPlane3D(huser: THANDLE; var Bx,Ly,H: double): integer;
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;

// Освободить ресурсы пользовательской системы координат
procedure mapDeleteUserSystemParameters(huser: THANDLE);
  {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}  external sGisAcces;



С Уважением, Болотов В.И.
Выделение нескольких объектов
Здравствуйте!
Для поиска объектов в зоне использую следующую функцию:

Код

// на форме:
//    mapv      : TMapView;

function  sel_obj_inzon(o: TMapObj; var areo: double;  var cnfindobj: integer;
  isvis: boolean = false; iscsel: boolean = false): boolean;
var
  hm: HMAP;  hs: HSITE;  ho,hocr: HOBJ;  rs: HRSC;  sel: HSELECT;  ms: TMapSelect;  cr: HCROSS;
  n,cn,n1,v,flg,mv,km,i,scmx,scmn,ko,koo,lo,loo,cno: integer;
  function  chk_scale(): boolean;
  var  sct,scb: integer;
  begin
    sct := mapObjectTopScale(ho);  scb := mapObjectBotScale(ho);
    if (mv < scmn) and (scb = scmn) then scb := mv - 1;
    if (mv > scmx) and (sct = scmx) then sct := mv + 1;
    Result := (mv >= scb) and (mv <= sct);
  end;
begin  // выделить объекты, попавшие в зону (площадной объект) "o"
  Result := false;  areo := -1;  cnfindobj := 0;
  findobj_clear(); // => cnfindobj = 0

  mapv.SetObjSelected(nil, 0, false);  // снять групповое выделение
  mapv.SetViewSelected(false, 0);
  mapv.ViewSelect.ClearSampleAll();
  if (o = nil) then exit;

  n1 := 0;  // номер первой векторной карты, может быть > 0, если основная mapv - растровая
  cn := mapv.MapSites.SiteCount;  if (n1 > cn) then exit;  // нет векторных карт
  koo := o.Key;  if (koo = 0) then exit;  // код объекта - зоны
  hm := mapv.MapHandle;
  loo := mapGetSiteNumber(hm, mapGetObjectSiteIdent(hm, o.ObjHandle));
  if (loo = 0) then loo := mapGetListNumber(o.ObjHandle);
  mv := mapv.ViewScale;  // текущий масштаб
  if isvis then v := 1 else v := 0;  // v=1 - только по видимым объектам
  // ho, hocr - временные объекты
  ho := mapCreateObject(hm, 1, KM_IDDOUBLE2, 0);  if (ho = 0) then exit;  // какая-то ошибка
  hocr := mapCreateObject(hm, 1, KM_IDDOUBLE2, 0);
  mapv.Rendering := false;
  if iscsel then ms := TMapSelect.Create(mapv) else ms := nil;  // ms <> 0 - выделять объекты в зоне

  try
    if (ms <> nil) then ms.MapSites[-1] := false;  
    for n := n1 to cn do
    begin  // по векторным картам
      if (n > 0) then
        if mapv.MapSites[n].SiteVisible then hs := mapv.MapSites[n].FHS else hs := 0
      else
        if (mapGetSiteViewFlag(hm, hm) <> 0) then hs := hm else hs := 0;
      if (hs = 0) then continue;  // не видимая
      rs := mapGetRscIdent(hm, hs);  if (rs = 0) then continue;
      sel := mapCreateSiteSelectContext(hm, hs);  // контекст поиска
      if (sel = 0) then continue;  // какая-то ошибка
      scmx := mapGetRscScaleItem(rs, mapGetRscScaleCount(rs));
      scmn := mapGetRscScaleItem(rs, 1);
      try
        if isvis then
          mapGetSiteViewSelect(hm, hs, sel);  // в sel - условия отображения
        mapSelectLayer(sel, -1, 1);  mapSelectLayer(sel, 0, 0);
        mapSelectLocal(sel, -1, 0);
        mapSelectLocal(sel, OL_SQUARE, 1);  mapSelectLocal(sel, OL_LINE, 1);
        mapSelectLocal(sel, OL_MARK, 1);  // и т.д. по всем требуемым характерам локализации
        mapSelectSeekArea(sel, o.ObjHandle, 0, 1, 1, v, 1);  // здесь можно использовать всякие флаги
        flg := cWO_INMAP or cWO_FIRST;  cno := 0;  // число найденных из карты n
        while (mapSeekSiteSelectObject(hm, hs, ho, sel, flg) <> 0) do
        begin  // по найденным объектам (текущий найденный - ho)
          flg := cWO_INMAP or cWO_NEXT;  // для продолжения поиска
          ko := mapObjectKey(ho);   if (ko = 0) then continue;
          if (ko = koo) then
          begin  // объект совпал с "o"
            lo := n;  if (lo = 0) then lo := mapGetListNumber(ho);
            if (lo = loo) then continue;    // проверка номера листа (карты)
          end;
          { if (условие) then
          begin  // ищем площадь пересечения зоны "o" и объекта ho
            if (areo < 0) then areo := 0;
            cr := mapCreateObjectsCrossSquare(ho, o.ObjHandle, 0);
            if (cr <> 0) then
            begin
              while (mapGetNextCross(cr, hocr) <> 0) do
                areo := areo + mapSquare(hocr);
              mapFreeObjectsCross(cr);
            end;
          end; }
          if isvis and (not chk_scale()) then continue;  // проверка видимости объекта ho
          if (ms <> nil) then
          begin
            if (cno = 0) then ms.MapSites[n] := true;  // нашли первый объект на карте n
            if (n = 0) then i := mapGetListNumber(ho) else i := 1;  // номер листа
            mapSelectSampleByList(ms.SelectHandle[n], i, ko);
          end;
          inc(cno);
          // findobj_add(hm, ho, n, 0, i); - вызов функции для добавления в список найденных объектов
        end;  // while mapSeekSiteSelectObject()
      finally  mapDeleteSelectContext(sel);  end;
    end;  // for n
    Result := (cnfindobj > 0);
    if Result and (ms <> nil) then
      mapv.SetObjSelected(ms, cz_sel, false);  // выделить цветом cz_sel
  finally
    if (ms <> nil) then ms.Free;
    mapFreeObject(hocr);
    mapFreeObject(ho);
    mapv.Rendering := true;
  end;
end;



С Уважением, Болотов В.И.
Изменено: V Bolotoff - 09.06.2011 22:48:55
aiMapMrt.ReBuild
Здравсствуйте!
Используется конструкция MV.MapMtrs.MapMtr[1].
В языке СИ массивы мартиц (карт и т.д.) обычно индексируются с нуля. Может надо на первую матрицу сослаться как MV.MapMtrs.MapMtr[0]?
С Уважением, Болотов В.И.
Ошибка компиляции при создании наследника TMapView
Здравствуйте!
Проверьте наличие всех необходимых include "...".
(например, TMapView и TMapViewWindow - в разных hpp).
С Уважением, Болотов В.И.
Диалог "Выбор объекта" в новой версии
Здравствуйте!
В версии gislib11 от 12.05.11 та же ситуация.
Отредактировать строковое значение семантики не удается (в окне Выбор объекта).
С Уважением, Болотов В.И.
Диалог "Выбор объекта" в новой версии
Здравствуйте!
С Праздником Победы!

Для объекта карты вызывается диалог "Выбор объекта".
При попытке отредактировать значение семантической характеристики (строкового типа) вместо нового значения появляется какая-то билеберда.
Эта ситуация наблюдается для версий gislib11 (набор dll), начиная с 14.04.2011 (ver 11.5.1).
Для gislib11 от 31.03.2011 - все нормально - семантика редактируется правильно.
Проверено для GisToolKit 11 Free, Delphi 7, Windows XP(32) и Windows7(32) на одном и том же объекте (одной карты).

С Уважением, Болотов В.И.
параметры функции imlPaintExample()
Здравствуйте!

Имеется ли возможность отрисовки в библиотеке знаков IML стандартными функциями GDI?
Например, при вызове функции imlPaintExample() библиотеки IML из внешнего приложения получаю в параметре context (типа TIMGCONTEXT) поле DC равное нулю (контекст устройства вывода).
Возможно ли передавать в этом параметре (context.DC) передавать реальный контекст отображения?
Или его можно получить каким-то образом из поля context.HVIEW?

Работаю в Windows, SDK11 free.

PS. Ещё наблюдается путаница с типами PPOINT в структуре TPOLYDATAEX (для Delphi) - по всей вероятности поле структуры Points должно указывать на TPoint, а не на TDOUBLEPOINT (maptype.pas).

С Уважением, Болотов В.И.
Изменено: V Bolotoff - 27.03.2011 14:02:38
Страницы: 1 2 3 4 5 6 7 8 9 10 След.


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