www.map-info.ru :: Просмотр темы - Несколько вопросов по MapInfo
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  
На страницу Пред.  1, 2, 3  След.
 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Ср Июл 15, 2009 3:36 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Почитайте внимательнее разделы хелпа про "set coordsys". У вас как-то бессистемно повторяется одно и то же в неправильных сочетаниях. Я не знаю, какие действия и в какой момент происходят в программе, но хочется поставить так:
В начале программы, для установки системы координат, которой будут пользоваться все последующие процедуры, работающие с координатами и расстояниями -
Set CoordSys Nonearth Units "km" (без "Map")
Дальше, для открытия нового окна карты с созданными кругами и пр. слоями -
Set Map XY (по-умолчанию в этом окне будет та система координат, которая задана выше оператором Set CoordSys),
если хотите переназначить другую систему координат или другие единицы измерения в этом окне карты, можно указать другие, метры. например.
Дальше, когда будете открывать окно отчета, для него тоже можно задать свои единицы измерения, отличные от умолчания MapInfo (дюймы вроде) -
Set CoordSys Layout Units "cm" (это бумажные единицы, расстояния на листе отчета, который будет распечатан на принтере, такие как расстояние от поля до заголовка отчета - какие тут километры на листочке шириной примерно 20-50 см).

Каким образом, когда, в какое окно загружается таблица, из программы или командой MapInfo - открыть рабочий набор? 17.64 чего? градусов или километров? Координаты возвращаются в строке статуса в левом нижнем углу или в Вашей программе как результат функции чтения координат?

Вставьте в код программы перед выполнением функции чтения координат проверку системы координат в вашем окне карты, что там будет?
note MapperInfo( идентификатор_окна, MAPPER_INFO_COORDSYS_CLAUSE )
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Ср Июл 15, 2009 3:50 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Может и бессистемно, но со старой картой только так работает Smile
Set Map CoordSys Nonearth Units "km" - устанавливаю систему координат для карты Nonearth, если написать Set CoordSys Nonearth Units "km", то он поругается, что я не указал Bound пределы.

Set Map Distance Units "km" - устанавливаю единицы изменения для расстояния
Set Map XY Units "km" - устанавливаю непонятно что, без этого тоже работает Smile

Set Distance Units "km" - устанавливаю общие единицы измерения для дистанции, чтобы можно было обращаться к ним через SessionInfo.

Set CoordSys Layout Units "km" - может эта штука нужна только для принтера, но у мну без нее не работает отрисовка объектов. Чтобы круг выводился с радиусом именно 10км необходимо прописать четко Layout км.

Да, кстати MAPPER_INFO_COORDSYS_CLAUSE выводит нормальную Nonearth

Вот такая штука...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Ср Июл 15, 2009 4:07 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Bound пределы надо указать. Выберите, какие у карты могут быть минимальные и максимальные границы, с запасом.
Если все же укажете в начале всего именно систему координат, используемую Вашей программой (Set CoordSys), не придется для каждого действия указывать, в каких единицах мерить расстояния, в том числе, думаю, и Set Distance Units "km".
писал(а):
Чтобы круг выводился с радиусом именно 10км необходимо прописать четко Layout км.

Наверное Вы рисуете круг в окне отчета Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Ср Июл 15, 2009 4:34 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Я понял, когда я пишу так:
Set Map Distance Units "km"
Set Map XY Units "km"
Set Distance Units "km"
То обе карты корректно отображают дистанции все с помощью функции Distance которой я передаю координаты двух точек.

Если я укажу систему координат Nonearth, то во второй карте (которая изначально имеет другую СК) расстояния будут считаться неверно (примерно в 1.5 раза погрешность).

В обоих случаях круг рисуется неверно. И координаты точек выводятся какие-то странные. То есть если я считаю расстояние между точек без функции Distance а просто как длину вектора, то ответ очень сильно отличается от того, что выводит Distance.

Если я напишу
Set CoordSys Layout Units "km"
то первая карта отлично начинает рисовать круг. Все четно, координаты без функции Distance такие же, как если я вызываю Distance для km.

НО вторая карта при этом перестает посылать какие-либо координаты вообще.

Круг отображаю вот так, уже ПОСЛЕ того как сделал все преобразования, описанные выше:
Create Map For tmpTable
Add Map Window FrontWindow() Layer tmpTable
Dim o_Ellipse as Object
Create Ellipse Into Variable o_Ellipse ...
Insert Into tmpTable (obj) Values (o_Ellipse)

Вот Confused Confused
Вообще уже запустался...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Ср Июл 15, 2009 4:49 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

подождите-подождите. если вторая карта имеет другую СК, то надо своей программе просто указать, с какой СК теперь работать. Я же спрашивала, какая СК в окне при открытии второй карты.
Поставьте себе правильно задачу:
1) пользователь открывает произвольную карту
2) вы читаете идентификатор ее окна и ее СК
3) задаете эту СК как СК по-умолчанию для всех следующих операций
4) читаете координаты объектов, создаете круги в новой таблице, созданной в той же СК
5) добавляете свой слой кругов в окно карты, которое уже открыто
..я так поняла?
объясните, что у вас на входе, а что на выходе должно получиться, а то и правда запутали
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Ср Июл 15, 2009 5:09 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Насколько я понял в несовместимости СК..
Итак я:
1) Открываю произвольную карту
2) Задаю СК:
Set CoordSys Nonearth Units "km" Bounds (0,0) (100,100)
3) Задаю масштаб для экрана:
Set Paper Units "km"
4) Создаю слой и рисую в нем круг

Если карта с nonearth СК, то все работает.
Если с earth, то координаты вообще не читаются. Даже если явно прописать Set Map CoordSys Nonearth Units "km" после открытия карты.

А если писать Set CoordSys Window FrontWindow() то круг превращается в эллепс вытянутый (что логично) и с координатами опять же какая то непонятная штука....
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Ср Июл 15, 2009 8:01 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Прошу прощения что на шарпе, но вот такой код вроде - бы стабильный:

if (_MapperInfo.GetCoordSys().ToLower().IndexOf("coordsys nonearth") > -1)
_Server.Exec("Set CoordSys NonEarth Units \"{0}\" Bounds (-50000,-50000) (50000,50000)", MapUnitsConvert.ToMapInfo(Units));
else if (_MapperInfo.GetCoordSys().ToLower().IndexOf("coordsys earth") > -1)
_Server.Exec("Set CoordSys Earth Projection 12, 0, \"{0}\",0 Bounds (-50000,-50000) (50000,50000)", MapUnitsConvert.ToMapInfo(Units));
else
{
if (MessageBox.Show("Ошибка установки системы координат",
"Неизвестная система координат: " + _MapperInfo.GetCoordSys(), MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
_Server.Exec("Set CoordSys Window FrontWindow()");
}

Смысл в том, что если у карты nonearth система координат, то ее и ставим, иначе ставим earth, причем везде указываем необходимые еденицы изменения - у мну это km.
Если вдруг система какая-то другая (я не нашел других вариантов, но мб в след. версиях mapinfo они появяться), то пользователю будет предложено установить СК как у карты.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Ср Июл 15, 2009 11:00 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Вообщем у меня осталось два варианта:
1) Я использую Вашу последовательность действий, использую СК из текущей карты.
Рисую в этой СК круг с радиусом 0.5, получаю такой эллепс, причем если померить его линейкой по вертикали он показывает 100км, по горизонтали 60км.

2) А теперь я создаю свою СК (об этом выше в посте написал). Получается круг, выводит как и должен круг, линейкой делаю замер, показывает 1 км (2*0.5) как и должен.


Так какой же вариант верен?
Простите что утомляю Вас глупыми вопросами Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Чт Июл 16, 2009 11:40 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

при чтении СК из текущей карты надо учесть единицы измерения координат которые назначены на данный момент, когда создаете объекты.
Если карта в Earth-проекции, то указывая при создании эллипса X+0.5, вы назначаете координату X градусов + полградуса. а диаметр в градус - это как раз порядка 100 км.

я назначаю СК для своей программы:
Set CoordSys NonEarth Units "km" Bounds (-50000,-50000) (50000,50000)
потом рисую эллипс в активном окне карты
Create Ellipse (0-0.5, 0-0.5) (0+0.5, 0+0.5)
независимо от проекции в окне карты (там открыта таблица в проекции широта-долгота, MapperInfo показывает CoordSys Earth Projection 1, 0), получается круг радиусом 0.5 км на сфере.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Чт Июл 16, 2009 12:21 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Вот я независимо от выбранной карты, после ее загрузки, указываю СК для сессии:
Set CoordSys NonEarth Units "km" Bounds (-50000,-50000) (50000,50000)

Теперь, если я отображаю на Earth карте свой круг, получается такая картина:

То-есть небольшой эллипс. Если я его меряю линейкой, то вроде бы по вертикальной оси и по горизонтальной масштаб 1км, хотя визуально это конечно же не круг...

Система координат теперь выглядит так (карта/сессия):


Теперь все верно? Тоесть я рисую в своем масштабе как хочу в глобальной СК(т.е. в СК сессии), а отображается на карте это все в СК карты?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Чт Июл 16, 2009 12:57 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

да, да
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Чт Июл 16, 2009 2:16 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Спасибо!)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Пт Июл 17, 2009 12:22 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

нет-нет! Я вас дезинформировала. Очень сильно прошу прощения. Embarassed
Ваш эллипс не может иметь по километру в ширину и высоту при таком построении, проверьте еще раз.
Надо все-таки пользоваться той системой координат, в которой создана исходная карта, и рисовать свои объекты в координатах карты, либо переводить свои координаты из план-схемы в проекцию карты, чтобы добавить туда объект.
А еще лучше, предупреждать пользователя, что программа будет работать с такой-то проекцией, чтобы карту предварительно перевели в нужную проекцию
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Пт Июл 17, 2009 6:00 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Хмм.. ну допустим я хочу работать с СК карты, и даже я рисую круг... Как мне установить для карты размерность в километрах?..
То есть если СК карты Earth то я хочу установить ее такую же только с Units km, чтобы радиусы были верные..

Вариант с предупреждением пользователей не подходит...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DragonFire



Зарегистрирован: 12.07.2009
Сообщения: 35

СообщениеДобавлено: Сб Июл 18, 2009 12:57 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Итак, вопрос - как нарисовать круг, радиусом 10 км в системе
CoordSys Earth Projection 1, 0

Если я напишу
Set CoordSys Earth Projection 1, 0, "km"
то он начнет ругаться, что неверное количество параметров. Запускается при таких параметрах:
Set CoordSys Earth Projection 12, 0, "km", 0
Но при радиусе 100км получается круг, по вертикали круг получается радиусом 109 км, по горизонтали 103 км...


Тогда второй вопрос - как задавать сферическую СК.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
На страницу Пред.  1, 2, 3  След.
Страница 2 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru