Очень нужна помощь с MapBasic

MapInfo, MapBasic
gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Очень нужна помощь с MapBasic

Сообщение gamm » 07 май 2013, 11:00

Sibit писал(а):Про программу, даже и не знаю с чего начать :(
может, уговорить таки автора написать наконец, что за задача решается?

Sibit
Активный участник
Сообщения: 216
Зарегистрирован: 21 окт 2009, 13:29
Репутация: 28
Откуда: Новосибирск

Re: Очень нужна помощь с MapBasic

Сообщение Sibit » 07 май 2013, 12:32

gamm писал(а):может, уговорить таки автора написать наконец, что за задача решается?
Да вроде очевидно - надо геокодировать табличку со встречами птиц по повыделенной базе. Способ определения места на мой взгляд странный, но это как задачу поставили.

sysrepos
Активный участник
Сообщения: 128
Зарегистрирован: 07 окт 2012, 16:25
Репутация: 20
Откуда: Москва

Re: Очень нужна помощь с MapBasic

Сообщение sysrepos » 07 май 2013, 23:31

если колонка I - это стороны света, то какую сторону света означает каждая цифра?
все значения, которые есть в этой колонке, такие:
"I"
""
"СТОРОНА КВАРТ."
"3"
"1"
"7"
"3,3,2/4"
"2"
"4"
"8"
"9"
"1,9,4/4,9,3/3"
"2/1,2,4;2/4"
"2/1,4;2/4"
"2/4;2/4"
"5"
"6"
"0.5"
"4,4,3/1"
"2,9,9,9"
"136,116,103,87"

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Очень нужна помощь с MapBasic

Сообщение gamm » 08 май 2013, 05:52

sysrepos писал(а):если колонка I - это стороны света, то какую сторону света означает каждая цифра?
все значения, которые есть в этой колонке, такие:
возвращаемся к тому же вопросу: постановка задачи отсутствует, а телепатических способностей участников ветки не хватает :?

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2240
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1513
Откуда: Казань

Re: Очень нужна помощь с MapBasic

Сообщение Игорь Белов » 08 май 2013, 12:05

sysrepos писал(а):если колонка I - это стороны света, то какую сторону света означает каждая цифра?
БД птиц явно дефектна. Возможно, записи добавлялись из таблиц с разной структурой. Или где-то на этапах импортов/экспортов перемешались разделители полей.

Несколько замечаний по обработке направлений в Конечном варианте.
  1. Величины x3, y3 используются в параметрах CreateLine в качестве координат, что есть безумие. Они суть разности координат.
  2. Нечто осмысленное получится, если заменить x3, y3 на cx, cy. И всё же схема направлений, демонстрирующая результат, вызывает некоторые сомнения. Первое: создание нулевого вектора для кода 9 с плохо предсказуемыми последствиями. Второе: вторичные направления (5-8) логично кодировать с СВ, а не с СЗ.
  3. Не все кварталы в лесу близки по форме к квадрату. Для квартала, вытянутого вдоль меридиана или параллели, азимуты вторичных направлений будут далеки от предположительно ожидаемых 45, 135, 225 и 315 градусов.

Код: Выделить всё

5   1   6
  \ | /
4 - 9 - 2
  / | \
8   3   7
The purpose of computing is insight, not numbers

Aphina
Интересующийся
Сообщения: 18
Зарегистрирован: 24 июн 2012, 17:43
Репутация: 0

Re: Очень нужна помощь с MapBasic

Сообщение Aphina » 13 май 2013, 00:10

БД птиц явно дефектна. Возможно, записи добавлялись из таблиц с разной структурой. Или где-то на этапах импортов/экспортов перемешались разделители полей.
Да, это проблема. Но другой базы просто никто не предоставил. Приходится работать с тем, что есть. Увы, это не единственный её недостаток.

Большое спасибо всем за советы, программа заработала, точки рисуются. У меня остался последний вопрос: когда на заключительном этапе вставляются точка и прилагающиеся данные, они разбиваются по информации из каждой колонки на строку. Лесенкой.То есть вот на такой код к одной точке будут прилагаться две частично заполненные строчки.

Код: Выделить всё

 Insert Into Результат (obj) Values (CreatePoint(ObjectNodeX(Storona,1,2), ObjectNodeY(Storona,1,2) ))
			Insert Into Результат (E) Values (Bio)
Insert Into Результат (J) Values (Videl)
Как исправить запрос, чтобы всё было в одной строке? Или использовать другой оператор?

sysrepos
Активный участник
Сообщения: 128
Зарегистрирован: 07 окт 2012, 16:25
Репутация: 20
Откуда: Москва

Re: Очень нужна помощь с MapBasic

Сообщение sysrepos » 13 май 2013, 08:35

попробуйте так:

Код: Выделить всё

Insert Into Результат (Obj, E, J) Values (CreatePoint(ObjectNodeX(Storona,1,2), ObjectNodeY(Storona,1,2) ), Bio, Videl )
раз у вас всё получилось, выложите код, интересно посмотреть всё таки, что в итоге должно быть

Aphina
Интересующийся
Сообщения: 18
Зарегистрирован: 24 июн 2012, 17:43
Репутация: 0

Re: Очень нужна помощь с MapBasic

Сообщение Aphina » 14 май 2013, 15:40

Поспешила я с "Всё получилось"... Всплыли два момента.

1.

Код: Выделить всё

Insert Into Результат (Obj, E, J, H, I, S) Values (CreatePoint(ObjectNodeX(oDirLine,1,2), ObjectNodeY(oDirLine,1,2) ), Biotop, Videl, Kvartal, Storona, Vid)
В колонку S данные Vid не вставляются. То есть числовые значения проходят на ура, а в колонке с текстовой информацией в таблице Результат идут только 0. Сама переменная Vid объявлена как строка, структуры колонок S в БД_птиц и Результате совпадают: символьный тип, 27 знаков.

2. Вдруг оказалось, что точки должны строиться только для вида Глухарь, т. е. Vid = Глухарь. И теперь я в непонятках, как и где прописать это условие.

Код: Выделить всё

 Fetch First From БД_птиц 
   Do While Not EOT(БД_птиц) '' Перебор строк

      Kvartal = Val(БД_птиц.H)      '' Квартал
      Videl = Val(БД_птиц.J)      '' Выдел
      Storona = Val(БД_птиц.I)      '' Сторона света
      Biotop = Val(БД_птиц.E)    "Биотоп
      Vid = Val(БД_птиц.S)     "Вид
    

      Select * From Выделы Where Поле2 = Videl And Номер_квартала = Kvartal Into temptab Noselect

      If  iDir < 1 Or iVdl < 1 Or iKvtl > 115 Then
         '' Нет такого квартала, выдела или стороны света
  Else         
rect_mbr = MBR(tmptab.obj)
И дальше идёт вычисление координат
Куда и как вставлять условие только для глухаря? Через Select одновременно с выделами? Но какой тогда там синтаксис, потому что программа у меня потребовала объединения таблицы Выделы и БД_птиц при попытке исправить запрос там.
Хотя в принципе, если решить первый момент, то потом можно будет просто в итоговой таблице сделать выборку для глухаря. Но хотелось бы, что это определялось сразу.

juffin_h
Завсегдатай
Сообщения: 265
Зарегистрирован: 22 окт 2012, 08:35
Репутация: 50
Откуда: Нижний Новгород

Re: Очень нужна помощь с MapBasic

Сообщение juffin_h » 14 май 2013, 17:45

1. Заменить

Код: Выделить всё

 Vid = Val(БД_птиц.S)
на

Код: Выделить всё

 Vid = БД_птиц.S
Функция Val() преобразует строку в число.

2. Заменить

Код: Выделить всё

If  iDir < 1 Or iVdl < 1 Or iKvtl > 115 Then
         '' Нет такого квартала, выдела или стороны света
  Else         
rect_mbr = MBR(tmptab.obj)
И дальше идёт вычисление координат 
…
На

Код: Выделить всё

 If  iDir < 1 Or iVdl < 1 Or iKvtl > 115 Then
         '' Нет такого квартала, выдела или стороны света
  ElseIf Vid = “Глухарь”       
rect_mbr = MBR(tmptab.obj)
И дальше идёт вычисление координат
...

Aphina
Интересующийся
Сообщения: 18
Зарегистрирован: 24 июн 2012, 17:43
Репутация: 0

Re: Очень нужна помощь с MapBasic

Сообщение Aphina » 14 май 2013, 18:55

Функция Val() преобразует строку в число.
Тьфу ты, точно. Забыла совсем. Спасибо, исправила.

По поводу второго - я уже пробовала эту конструкцию и даже если программа компилируется, то при запуске выдаётся ошибка "Не определена переменная или поле Глухарь". Поэтому то и встала в тупик.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2240
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1513
Откуда: Казань

Re: Очень нужна помощь с MapBasic

Сообщение Игорь Белов » 14 май 2013, 19:39

Код: Выделить всё

Select * From Выделы Where Поле2 = Videl And Номер_квартала = Kvartal And Vid = "Глухарь" Into temptab
The purpose of computing is insight, not numbers

Aphina
Интересующийся
Сообщения: 18
Зарегистрирован: 24 июн 2012, 17:43
Репутация: 0

Re: Очень нужна помощь с MapBasic

Сообщение Aphina » 14 май 2013, 20:01

Select * From Выделы Where Поле2 = Videl And Номер_квартала = Kvartal And Vid = "Глухарь" Into temptab
Vid относится к таблице БД_птиц.

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2240
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1513
Откуда: Казань

Re: Очень нужна помощь с MapBasic

Сообщение Игорь Белов » 14 май 2013, 20:45

В этом случае делают объединение таблиц:

Код: Выделить всё

Select * From Table1, Table2 ...
задавая условие объединения по уникальным полям:

Код: Выделить всё

... Where Table1.Kvartal = Table2.Kvartal And Table1.Vydel = Table2.Vydel ...
Таблица с нужной геометрией должна быть первой.
Условие можно усложнять:

Код: Выделить всё

... Where Table1.Kvartal = Table2.Kvartal And Table1.Vydel = Table2.Vydel And Table2.Vid = "Глухарь"...
The purpose of computing is insight, not numbers

trir
Гуру
Сообщения: 5354
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Сообщение trir » 14 май 2013, 21:45

И после этого мне будут говорить, что теория реляционных баз данных не относится к ГИС. Учите SQL!

juffin_h
Завсегдатай
Сообщения: 265
Зарегистрирован: 22 окт 2012, 08:35
Репутация: 50
Откуда: Нижний Новгород

Re: Очень нужна помощь с MapBasic

Сообщение juffin_h » 15 май 2013, 07:32

Aphina писал(а):выдаётся ошибка "Не определена переменная или поле Глухарь"
В данном контексте такой ошибки быть не должно. "Глухарь" (в кавычках) - константа. Приведите пожалуйста весь код. Ну или хотя бы фрагмент от If до End If
ErnieBoyd писал(а):В этом случае делают объединение таблиц:
КОД: ВЫДЕЛИТЬ ВСЁ
Select * From Table1, Table2 ...
Да, это вариант. Но, по моему скромному мнению, излишне городить многотабличный запрос, когда человек с If ... Else разобраться не может.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя