Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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 Заголовок сообщения: |
|
|
Может и бессистемно, но со старой картой только так работает
Set Map CoordSys Nonearth Units "km" - устанавливаю систему координат для карты Nonearth, если написать Set CoordSys Nonearth Units "km", то он поругается, что я не указал Bound пределы.
Set Map Distance Units "km" - устанавливаю единицы изменения для расстояния
Set Map XY Units "km" - устанавливаю непонятно что, без этого тоже работает
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 км. |
Наверное Вы рисуете круг в окне отчета |
|
Вернуться к началу |
|
|
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)
Вот
Вообще уже запустался... |
|
Вернуться к началу |
|
|
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) как и должен.
Так какой же вариант верен?
Простите что утомляю Вас глупыми вопросами |
|
Вернуться к началу |
|
|
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 Заголовок сообщения: |
|
|
нет-нет! Я вас дезинформировала. Очень сильно прошу прощения.
Ваш эллипс не может иметь по километру в ширину и высоту при таком построении, проверьте еще раз.
Надо все-таки пользоваться той системой координат, в которой создана исходная карта, и рисовать свои объекты в координатах карты, либо переводить свои координаты из план-схемы в проекцию карты, чтобы добавить туда объект.
А еще лучше, предупреждать пользователя, что программа будет работать с такой-то проекцией, чтобы карту предварительно перевели в нужную проекцию |
|
Вернуться к началу |
|
|
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 км...
Тогда второй вопрос - как задавать сферическую СК. |
|
Вернуться к началу |
|
|
|