RUS  ENG 

Запись координат центра объекта в таблицу (VBScript)

Страницы: 1
RSS
Запись координат центра объекта в таблицу (VBScript)
 
Здравствуйте.
1. Пытаюсь адапртировать пример с сайта. Не работает, проблема в записи в БД. Сами координаты читает, проверил через MsgBox. Пытаюсь писать в таблицу Потребитель, которая выглядит вот так (см. картинку). x, y - тип Вещественное
2. Где найти список типов ZuluThermo? То, что 3 - это потребитель - пришлось искать в примерах.
3. Возможно ли чтение координат в метрах с локальной сетки?
https://ibb.co/nkJB73P
https://ibb.co/yXd6XYR
Код
Sub gure
'Пример записи географических координат центра объекта в таблицу
       'Текущая активная карта
    Set Doc = Zulu.ActiveMapDoc
    'Активный слой текущей карты
    Set L = Doc.Layers.Active
    Set Db = CreateObject("zb.database")
    'Проекция слоя
    Set CRS1 = L.GetCrs()
    'Создание проекция WGS84
    Set CRS_WGS84 = CreateObject("zululib.CRS")
    CRS_WGS84.InitByCode("EPSG:4326")
    'Открыли базу данных для типа -1 (примитивы)
    Db.Open L.BaseName
    'Список ключей объектов слоя
    Set Keys = L.ElementKeys
    'По всем объектам слоя
    For i = 1 To Keys.Count
    Set El = L.Elements.getElement(Keys.Item(i))
    'MsgBox "L.Elements.getElement(Keys.Item(i)) = " & L.Elements.getElement(Keys.Item(i))          
        'Если объект примитив
      If El.TypeID = 3 Then
            'Получаем точку центра объекта в координатах проекции слоя
            Set Pt = El.GetCenter()
            'MsgBox "El.GetCenter(5) = " & El.GetCenter(5)       
            'Получаем широту и долготу точки в WGS84
            Set Pt = CRS1.GetConvertPoint(Pt.X, Pt.Y, CRS_WGS84)
            MsgBox "CRS1.GetConvertPoint(Pt.X, Pt.Y, CRS_WGS84) = " & CStr(Pt.X)
            If pt.IsValid = False Then 
               MsgBox "Ошибка преобразования" 
            End If
             'Записываем широту и долготу в соответствующие поля ("X" и "Y")
             Db.UpdateBaseRecord Keys.Item(i), "x" + CHR(10) + "y", CStr(Pt.X) + CHR(10) + CStr(Pt.Y), 0
             Db.UpdateBaseRecord Keys.Item(i), "x", CStr(Pt.X), 0
             Db.UpdateBaseRecord Keys.Item(i), "y", CStr(Pt.Y), 0
         'MsgBox "Обновлено " & PT & "записей"                
        End If                     
    Next
MsgBox "Обновлено записей"  
End Sub
Изменено: stas - 23.12.2022 16:06:49
 
Цитата
написал:
Здравствуйте.
1. Пытаюсь адапртировать пример с сайта. Не работает, проблема в записи в БД. Сами координаты читает, проверил через MsgBox. Пытаюсь писать в таблицу Потребитель, которая выглядит вот так (см. картинку). x, y - тип Вещественное
2. Где найти список типов ZuluThermo? То, что 3 - это потребитель - пришлось искать в примерах.
3. Возможно ли чтение координат в метрах с локальной сетки?
Код
    'Открыли базу данных для типа -1 (примитивы)
    Db.Open L.BaseName

Добрый день. База для записи, видимо, нужна не для типа -1, а для типа 3
Код
Db.Open L.ObjectTypes.Item(3).BaseName
Уточните, что такое чтение координат с локальной сетки?
Изменено: Алексей Аширов - 23.12.2022 23:38:05
 
Алексей, спасибо.
Код
Sub gure
'Пример записи географических координат центра объекта в таблицу
       'Текущая активная карта
    Set Doc = Zulu.ActiveMapDoc
    'Активный слой текущей карты
    Set L = Doc.Layers.Active
    Set Db = CreateObject("zb.database")
    'Проекция слоя
    Set CRS1 = L.GetCrs()
    'Создание проекция WGS84
    Set CRS_WGS84 = CreateObject("zululib.CRS")
    CRS_WGS84.InitByCode("EPSG:4326")
    'Открыли базу данных для типа 3
    Db.Open L.ObjectTypes.Item(3).BaseName
    'Список ключей объектов слоя
    Set Keys = L.ElementKeys
    'По всем объектам слоя
    For i = 1 To Keys.Count
    Set El = L.Elements.getElement(Keys.Item(i))
    'MsgBox "L.Elements.getElement(Keys.Item(i)) = " & L.Elements.getElement(Keys.Item(i))          
        'Если объект примитив
      If El.TypeID = 3 Then
            'Получаем точку центра объекта в координатах проекции слоя
            Set Pt = El.GetCenter()    
            'Получаем широту и долготу точки в WGS84
            Set Pt = CRS1.GetConvertPoint(Pt.X, Pt.Y, CRS_WGS84)
            'MsgBox "CRS1.GetConvertPoint(Pt.X, Pt.Y, CRS_WGS84) = " & CStr(Pt.X)
            If pt.IsValid = False Then 
               MsgBox "Ошибка преобразования" 
            End If
             'Записываем широту и долготу в соответствующие поля ("X" и "Y")
             Db.UpdateBaseRecord Keys.Item(i), "x" + CHR(10) + "y", CStr(Pt.X) + CHR(10) + CStr(Pt.Y), 0               
        End If                     
    Next
MsgBox "Обновлено записей"  
End Sub
Код работает.
Имел в виду чтение координат с локальной системы в метрах, отрисованной самостоятельно или с помощью стандартных инструментов:
https://ibb.co/wpRjGjK
https://ibb.co/HxKvCHb
Изменено: stas - 25.12.2022 13:26:51
 
Цитата
написал:
[CODE][/CODE]Имел в виду чтение координат с локальной системы в метрах, отрисованной самостоятельно или с помощью стандартных инструментов:
https://ibb.co/wpRjGjK
https://ibb.co/HxKvCHb
Так получив Element, дальше от него получаете всю геометрию, в зависимости от графического типа, в единицах Layer.Units
https://politerm.com/zuludoc/zuluax/index.html#Element_cls.html
 
Вы имеете в виду
Код
Set Ptlocal = El.CalcDistance(Element(ID линии координатной оси), 0)
?
Как это написать
Код
Ptlocalattributes = Element(ID линии координатной оси), 0
'По всем объектам слоя
    For i = 1 To Keys.Count
    Set El = L.Elements.getElement(Keys.Item(i))        
        'Если объект примитив
      If El.TypeID = 3 Then
            'Получаем расстояние до линии координатной оси
            Set Ptlocal = El.CalcDistance(Keys.Item(i), ???Ptlocalattributes???)
?
Изменено: stas - 25.12.2022 17:38:12
 
Цитата
написал:
Как это написать
CalcDistance возвращает double, а не объект. Зачем Set? Просто расстояние между двумя Element

Set El = L.Elements.getElement(Keys.Item(i))
Set El1 = L.Elements.getElement(ID линии координатной оси) 'Или из из другого слоя, смотря в каком слое ось нарисована

D = El.CalcDistance(El1, 0)
 
Спасибо большое! Попробую ближайшее время
Страницы: 1