Forum

Author Topic: Измерение расстояний площадей и объемов  (Read 9593 times)

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Добрый день! Хотел узнать, можно ли с помощью скрипта выполнить следующие расчеты:
– линейная длина отрезка
– линейная длина отрезка с учетом рельефа
– высотная диаграмма по линейному отрезку
– площадь с учетом рельефа
– объем области отмеченной многоугльником
– параметры точки (высота, координаты)

Буду очень благодарен за помощь.

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15438
    • View Profile
Добрый день,

предполагая, что отрезки и точки заданы в виде фигур (шейпов), измерения с помощью скриптов можно производить следующим образом:

#линейная длина полилинии или полигона (без учёта рельефа и Z координаты вершин)
shape.perimeter2D()

#линейная длина полилинии или полигона (без учёта рельефа, но с учётом Z координат вершин)
shape.perimeter3D()

#площадь полигональной фигуры без учёта рельефа, только 2D
shape.area()

#объём области, ограниченной полигоном
shape.volume(level="bestfit")
#тут три варианта: "bestfit", "mean" или фиксированная высота базовой плоскости - просто числом.

#координаты вершин шейпа
shape.vertices()
#также можно получить высоту ЦМР по двумерным координатам:
chunk.elevation.altitude(Metashape.Vector([x, y]))

получить высотную диаграмму (профиль) по отрезку пока простым способом никак, только создавая спец.функцию, которая бы "бежала" по отрезку короткими шагами.
Best regards,
Alexey Pasumansky,
Agisoft LLC

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Спасибо огромное! Будем пробовать)

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
А длину и площадь с учетом рельефа нельзя получить?

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15438
    • View Profile
Для длины с учётом рельефа пока нет подходящего Python вызова. Постараемся добавить его в одном из ближайших обновлений. В качестве альтернативного метода можно было бы с небольшим шагом "идти" по периметру шейпа, получать высоту соответствующей точки на карте высот и таким образом считать длину профиля "вручную".

Расчёт площади с учётом рельефа пока также не поддерживается. Альтернативный вариант - расчёт площади для полигональной модели, т.к. данный метод суммирует площадь всех полигонов модели. Но такой подход требует удаления лишней геометрии.
Best regards,
Alexey Pasumansky,
Agisoft LLC

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Спасибо. По Perimeter3D проблемка: почему то он показывает 0.0.
На картинке это же и есть длина 3D ?

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15438
    • View Profile
Функция Perimeter3D - это длина ломаной с учётом XYZ координат вершин шейпа. В данном случае, скорее всего шейп является двумерным, т.к. был нарисован во вкладке Орто.
Чтобы рассчитать высоту координат вершин требуется использовать опцию "Пересчитать высоты" из контекстного меню шейпа в режиме просмотре Орто.

Однако, на всякий случай ещё раз повторю, что Perimeter3D - это не то же самое, что длина на вкладке Профиль, т.к. Perimeter3D считается исключительно по отрезкам между вершинами шейпа и не учитывает рельеф.
Best regards,
Alexey Pasumansky,
Agisoft LLC

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Так а как получить длину из вкладки Профиль средствами Python ?
Вот мой код:
Code: [Select]
if len(coords) >= 2:
    new_shape = chunk.shapes.addShape()
    new_shape.label = "boundary"
    new_shape.type = Metashape.Shape.Polygon
    new_shape.has_z = True
    new_shape.vertices = [Metashape.Vector([coord[1], coord[0]]) for coord in coords]
chunk.shapes.updateAltitudes(new_shape)
print("Периметр фигуры:",new_shape.perimeter2D()," м.")
print("Периметр фигуры с учетом высоты вершин:",new_shape.perimeter3D()," м.")
print("Площадь фигуры:",new_shape.area()," м^2.")
print("Объем фигуры:",new_shape.volume(level = 0)['total']," м^3.")
print("New shape created.")

Вот ответ:
Code: [Select]
2019-07-29 14:34:58 Finished processing in 0.011056 sec (exit code 1)
2019-07-29 14:34:58 Calculating 2D dimensions...
2019-07-29 14:34:58 Периметр фигуры: 312.7722914106116  м.
2019-07-29 14:34:58 Периметр фигуры с учетом высоты вершин: 0.0  м.
2019-07-29 14:34:58 Calculating 2D dimensions...
2019-07-29 14:34:58 Площадь фигуры: 3027.203739898397  м^2.
2019-07-29 14:34:58 Calculating plane...
2019-07-29 14:34:58 Calculating vertex coordinates...
2019-07-29 14:34:58 Calculating volume...
2019-07-29 14:34:58 Finished processing in 0.125381 sec (exit code 1)
2019-07-29 14:34:58 Объем фигуры: 375278.9691737943  м^3.
2019-07-29 14:34:58 New shape created.

Спасибо!

e1sep0

  • Newbie
  • *
  • Posts: 12
    • View Profile
Quote
Расчёт площади с учётом рельефа пока также не поддерживается. Альтернативный вариант - расчёт площади для полигональной модели, т.к. данный метод суммирует площадь всех полигонов модели. Но такой подход требует удаления лишней геометрии.

А что это за геометрия и как ее можно удалить с помощью скрипта?

Alexey Pasumansky

  • Agisoft Technical Support
  • Hero Member
  • *****
  • Posts: 15438
    • View Profile
Полигональная модель (меш) строится по команде Построить Модель (Build Mesh). Через Python API существует доступ к вершинам полигональной модели и самим полигонам. Соответственно, удаление полигонов доступно и через скрипт, если придумать критерий, по которому полигоны будут удалены.
Best regards,
Alexey Pasumansky,
Agisoft LLC