Звітні форми. Площа, експлікація і т.д.

Геодезична інформаційна система 6 та Геодезична інформаційна система 6 Агро

Модератори: NickS, feNICKs

Аватар користувача
NoViChoK
Повідомлень: 140
З нами з: 10 вересня 2012, 18:09

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NoViChoK » 03 червня 2019, 21:12

Напевно не зовсім зрозуміло я написав.
Спробую ще раз. Для того щоб не виникало незрозумілих моментів прикріпив картинку.


.jpg


На її основі:

межовий знак ____.__-000-00001 розташований за координатами X=... Y=... на відстані 493,63 м. від закріпленого теодолітного ходу, направлення 162°3’55,73’’
межовий знак ____.__-000-00002 розташований за координатами X=... Y=... на відстані 365,61 м. від закріпленого теодолітного ходу, направлення 156°4’17,61’’
і т.д.

Причому тут теодолітний хід?

Ну типу із за цього: 3.9. Місцезнаходження межових знаків підлягає прив'язці до пунктів державної геодезичної мережі.
І якщо вказати відстань до ближнього межового знаку то питання, а як він привязаний, а наступний як .... і т.д.

Я згоден, що для цього спецом є схема ходу та схема обміру і взагалі кроки непотрібно відразу тулити і ...
Але у нас простіше зробити собі "правильний" шаблон чим доказувати комусь свою точку зору.

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NickS » 04 червня 2019, 09:06

NoViChoK писав:Напевно не зовсім зрозуміло я написав.
...
Я згоден, що для цього спецом є схема ходу та схема обміру і взагалі кроки непотрібно відразу тулити і ...
Але у нас простіше зробити собі "правильний" шаблон чим доказувати комусь свою точку зору.

Відстань можна порахувати. Кут теж, але є питання:
1. Звідки брати оту точку до якої вести розрахунки?
2. Який кут визначати? Дирекційний? Якщо ні, то до якої третьої точки?
Від відповіді на ці запитання буде залежати код. Код розрахунку довжини відрізка між двома точками вже є в Акті приймання передачі за 2017-й.

Аватар користувача
NoViChoK
Повідомлень: 140
З нами з: 10 вересня 2012, 18:09

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NoViChoK » 04 червня 2019, 18:07

Спочатку не зрозумів, що ще може бути не зрозуміло, але потім дійшло ))
Навіть засумнівався в правильності такого варіанту, який я пишу, але поки так проходило, значить хай так і буде.

На прикладі того ж зображення:
2.jpg


По факту це тіж дані, що роблять на схемі обміру та прив'язки.
Тобто т2 - точка стояння, з якої проводиться зйомка ділянки. Орієнтуємося на попередню точку ходу "т1" (направлення на т1 показано червоною стрілкою). Ітого маємо відрізок т2-т1 від якого кут в ліво 162°3’55,73’’. А довжина відрізка від точки стояння т2 до першої точки ділянки 493,63.
Звідси і маємо:
межовий знак ____.__-000-00001 розташований за координатами X=... Y=... на відстані 493,63 м. від закріпленого теодолітного ходу, направлення 162°3’55,73’’
і так для кожної точки.

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NickS » 06 червня 2019, 17:56

NoViChoK писав:По факту це тіж дані, що роблять на схемі обміру та прив'язки.
Тобто т2 - точка стояння, з якої проводиться зйомка ділянки. Орієнтуємося на попередню точку ходу "т1" (направлення на т1 показано червоною стрілкою). Ітого маємо відрізок т2-т1 від якого кут в ліво 162°3’55,73’’. А довжина відрізка від точки стояння т2 до першої точки ділянки 493,63.
Звідси і маємо:
межовий знак ____.__-000-00001 розташований за координатами X=... Y=... на відстані 493,63 м. від закріпленого теодолітного ходу, направлення 162°3’55,73’’
і так для кожної точки.

Так як брати координати - це геть інша історія і вимагає зовсім іншого коду чи алгоритму, тим паче, Ви так і не описали звідки брати хід. Отже я Вам покажу як це зробити універсально, використовуючи підготовлені мною функції.

Щоб визначити довжину відрізка між двома координатами A(X1, Y1) і B(X2, Y2):
1. Описуємо потрібні змінні:

Код: Виділити все

LengthPoint : string;
X1, Y1, X2, Y2 : extended;

2. Зверху, після блока var добавляємо функцію розрахунку довжини:

Код: Виділити все

// Функция вычисления расстояние между двумя координатами
function CalculLeng(_X1, _Y1, _X2, _Y2 : extended): extended;
var
   DX, DY : extended;
begin
  DX := Abs(_X1 - _X2); // Координаты X вектора
  DY := Abs(_Y1 - _Y2); // Координаты Y вектора
  Result := Sqrt((DX * DX) + (DY * DY));
end;

3. В коді, в потрібному місці треба змінним X1, Y1, X2, Y2 присвоїти значення координат, де, X1, Y1 - кооринати першої точки, а X2, Y2 - координати другої точки. Наприклад:

Код: Виділити все

  Points.First;
  X3 := <Points."X">;
  Y3 := <Points."Y">;
  Points.Next;
  X2 := <Points."X">;
  Y2 := <Points."Y">;

Не забувайте: це код лише приклад! Все залежить від того, звідки Ви будете брати координати точок.
4. Потім виконати функцію розрахунку довжини:

Код: Виділити все

LengthPoint := FormatFloat('0.00', CalculLeng(X1, Y1, X2, Y2));

Отриманна змінна [LengthPoint] вставляється в потрібне місце.

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NickS » 06 червня 2019, 18:02

Щоб визначити кут між двома відрізками: AB(X1, Y1, X2, Y2) та BC(X2, Y2, X3, Y3):
1. Описуємо потрібні змінні:

Код: Виділити все

   VnCutStr : string;
   VnCut, X1, Y1, X2, Y2, X3, Y3 : extended;

2. Зверху, після блока var добавляємо функціЇ розрахунку арккосинуса і кута:

Код: Виділити все

// Функция вычисления арккосинуса
function ArcCos(X: extended): extended;
var
   Cut : extended;
begin
  If X <= -1.0 then
    Cut := Pi
  else
  begin
    If X < -Sqrt(2) / 2 then
      Cut := Pi + ArcTan(Sqrt(1 - X * X) / X) { левый край }
    else
    begin
      If X <= Sqrt(2) / 2 then
        Cut := Pi / 2 - ArcTan(X / Sqrt(1 - X * X)) { центр }
      else
      begin
        If X < 1.0 then
          Cut := ArcTan(Sqrt(1 - X * X) / X) { правый край }
        else
          Cut := 0.0;
      end;
    end;
  end;

  Result := (180 / Pi) * Cut;
end;

// Функция расчёта направленного угла между тремя точками
function NaprUgol(X1, Y1, X2, Y2, X3, Y3 : extended; PravUgl : boolean) : extended;
var
   CosL, STriangl, Vector1X, Vector1Y, Vector2X, Vector2Y, VectorsL1, VectorsL2, Cut : extended;
begin
  // Определяем координаты вектора 1
  Vector1X := X2 - X1;
  Vector1Y := Y2 - Y1;

  // Расчитываем длину вектора 1
  VectorsL1 := Sqrt((Vector1X * Vector1X) + (Vector1Y * Vector1Y));

  // Определяем координаты вектора 1
  Vector2X := X2 - X3;
  Vector2Y := Y2 - Y3;

  // Расчитываем длину вектора 1
  VectorsL2 := Sqrt((Vector2X * Vector2X) + (Vector2Y * Vector2Y));

  // Расчитываем угол между векторами (косинус)
  CosL := ((Vector1X * Vector2X) + (Vector1Y * Vector2Y)) / (VectorsL1 * VectorsL2);

  // Определяем угол в градусах
  Cut := ArcCos(CosL);

  // Определяем ориентированную площадь треугольника
  // (чтобы определить направленный угол, а не угол между векторами)
  STriangl := X1 * Y2 + X2 * Y3 + X3 * Y1 - Y1 * X2 - Y2 * X3 - Y3 * X1;

  // Определяем реальный угол до 360 градусов
  If STriangl = 0 then
    Cut := 0.0
  else
  begin
    If PravUgl and (STriangl > 0) then
      Cut := 360 - Cut
    else
    begin
      If (PravUgl = false ) and (STriangl < 0) then
        Cut := 360 - Cut
    end;
  end;

  Result := Cut;
end;

3. В коді, в потрібному місці треба змінним X1, Y1, X2, Y2, X3, Y3 присвоїти значення координат, де, X1, Y1 - кооринати точки наведення, X2, Y2 - координати точки стояння, а X3, Y3 - координати точки ділянки. Наприклад:

Код: Виділити все

  Points.First;
  X3 := <Points."X">;
  Y3 := <Points."Y">;
  Points.Next;
  X2 := <Points."X">;
  Y2 := <Points."Y">;
  Points.Next;
  X1 := <Points."X">;
  Y1 := <Points."Y">;

Не забувайте: це код лише приклад! Все залежить від того, звідки Ви будете брати координати точок.

4. Потім виконати функції і розкласти кут на градуси, мінути і секунди:

Код: Виділити все

  VnCutStr := ''; // Значение угла (строка)
  VnCut    := NaprUgol(X1, Y1, X2, Y2, X3, Y3, false); // Значение угла

  // Формируем строку для угла
  VnCutStr := FormatFloat('00', Int(VnCut)) + '° '; // градусы
  VnCutStr := VnCutStr + FormatFloat('00', Int(Frac(VnCut) * 60)) + ''' '; // минуты
  VnCutStr := VnCutStr + FormatFloat('00.00', Int(Frac(Frac(VnCut) * 60) * 60 * 100) / 100) + '"'; // секунды

Отриманна змінна [VnCutStr] вставляється в потрібне місце.

До речі, вираховуються ліві по ходу кути, але якщо у фукнції NaprUgol останній параметр задати як true:

Код: Виділити все

VnCut    := NaprUgol(X1, Y1, X2, Y2, X3, Y3, true);

то будуть вираховуватись праві по ходу кути. Це для універсальності.

Аватар користувача
NoViChoK
Повідомлень: 140
З нами з: 10 вересня 2012, 18:09

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NoViChoK » 06 червня 2019, 18:15

NickS писав:.....тим паче, Ви так і не описали звідки брати хід.

Та малюється хід :)
І створюється в камеральних функціях через "создание теодолитного хода (обратная задача)"
Потім вибирається точка стояння, орієнтування і через "импорт - пикетов/засечек из участка" робиться типу зйомка ділянки.
І потім у вкладці "Пикеты" всі ці дані відображено (і кут і довжина).
Я думав можно просто звідти якось "видьоргувати" в шаблон та і все.

NickS писав:Отже я Вам покажу як це зробити універсально, використовуючи підготовлені мною функції.

На перший погляд страшно ))
Але думаю розберусь. Дуже Вам вдячний!

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NickS » 10 червня 2019, 14:35

NoViChoK писав:Потім вибирається точка стояння, орієнтування і через "импорт - пикетов/засечек из участка" робиться типу зйомка ділянки.
І потім у вкладці "Пикеты" всі ці дані відображено (і кут і довжина).
Я думав можно просто звідти якось "видьоргувати" в шаблон та і все.

Ну от з цього і треба було починати! Я ж казав, що код залежить від умов чи завдання. А Ви не уточнили завдання, тому я дав Вам варіант, де все треба розраховувати вручну і цих точок не має в теодолітному ході. Якщо ж Ви брати хід, то приклад уже зроблений - в шаблоні "Ведомость вычисления координат пикетов (портрет).FR3"

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NickS » 10 червня 2019, 14:35

NickS писав:
NoViChoK писав:Потім вибирається точка стояння, орієнтування і через "импорт - пикетов/засечек из участка" робиться типу зйомка ділянки.
І потім у вкладці "Пикеты" всі ці дані відображено (і кут і довжина).
Я думав можно просто звідти якось "видьоргувати" в шаблон та і все.

Ну от з цього і треба було починати! Я ж казав, що код залежить від умов чи завдання. А Ви не уточнили завдання, тому я дав Вам варіант, де все треба розраховувати вручну і цих точок не має в теодолітному ході. Якщо ж брати хід, то приклад уже зроблений - в шаблоні "Ведомость вычисления координат пикетов (портрет).FR3"

utas
Повідомлень: 1
З нами з: 13 квітня 2021, 15:22

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення utas » 13 квітня 2021, 15:57

Доброго дня! Допоможіть будь-ласка у вирішенні такого питання: як на кадастровому плані земельної ділянки (Кіровоград) в умовних позначеннях Малоповерхову забудову ([DM1.TbPlan."Name"]) замінити на порядковий номер угідь?

Аватар користувача
NickS
Повідомлень: 1393
З нами з: 04 квітня 2008, 12:21

Re: Отчётные формы. Площадь, экспликация и т.д.

Повідомлення NickS » 04 травня 2021, 21:47

utas писав:Доброго дня! Допоможіть будь-ласка у вирішенні такого питання: як на кадастровому плані земельної ділянки (Кіровоград) в умовних позначеннях Малоповерхову забудову ([DM1.TbPlan."Name"]) замінити на порядковий номер угідь?

Порядковий номер на плані (поле "Номер на плані") - це [DM1.TbPlan."Number"]. Але майте на увазі, що таблиця "DM1.TbPlan" - це список всіх угідь на поточній ділянці, тому якщо вам потрібно номер конкретного угіддя, потрібно спочатку на нього спозиціонуватись (наприклад, в циклі), але тут вже залежить від вимог, які ви ставите перед цим алгоритмом. Якщо ж у вас таблиця "DM1.TbPlan" перебирається в бенді, тоді просто замініть на [DM1.TbPlan."Number"]. Якщо ж потрібно відсортувати таблицю, щоб вона йшла в порядку слідування номера на плані, тоді треба заводити окремий SQL-запит і ним маніпулювати, але це теж досить складно і залежить від того, які вимоги ставляться і як ця таблиця відображається.