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

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

Re:

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

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

а вы попробуйте найти в этом запросе пространственную информацию.

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

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

Сообщение trir » 15 май 2013, 11:13

Ну, можно все данные загрузить БД и решить поставленную задачу, использовав только SQL...

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

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

Сообщение Sibit » 15 май 2013, 11:37

trir писал(а):Ну, можно все данные загрузить БД и решить поставленную задачу, использовав только SQL...
Можно. Но зачем? Это довольно простая задача, дольше загружать выгружать будешь.

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

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

Сообщение gamm » 15 май 2013, 12:19

trir писал(а):Ну, можно все данные загрузить БД и решить поставленную задачу, использовав только SQL...
вы удивитесь, но любую задачу можно решить на машине Тьюринга с одной головкой. Вообще без всяких SQL и прочих васиков.

P.S. Операции, характерные для ГИС, добавлены в новый стандарт SQL - но их нет в том запросе, на который вы среагировали. Так что учите SQL, и вам откроется истина :-)

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

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

Сообщение trir » 15 май 2013, 12:25

Нету, но человек только начал знакомится с ГИС и уже спотыкается на SQL-запросах, а что дальше будет? Конечно пространственные запросы на SQL - это уже другой уровень, до него надо дорасти. Я и имел ввиду, что SQL нужен при работе с ГИС, даже без его пространственного расширения, а уж с ним - must have.

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

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

Сообщение Sibit » 16 май 2013, 08:17

trir писал(а):Нету, но человек только начал знакомится с ГИС и уже спотыкается на SQL-запросах, а что дальше будет?
Разберется и перестанет спотыкаться :) Да и от SQL там только уши. Без специального изучения SQL для работы в MApInfo, я думаю, вполне можно обойтись. В общем - ничего страшного :)

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

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

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

Собственно программа заработала и на условие и выглядит сейчас следующим образом. Не знаю, почему у меня сразу ElseIf не заработал, стоило скомпилировать не следующий день и всё нормально.
Но вот странный для меня момент - не строятся 14 точек по Глухарям. Я сначала этого не заметила, обнаружила уже при вставке всей сопутствующей информации. То есть всего встреч 69, у меня строятся 32, 23 не подходят по условию отсутствия каких либо значений. Но что с остальными? Причём точки одни и те же. Проблема сохраняется и при проверке у других видов и всей таблицы разом. Если строить без оконтуривающего прямоугольника ситуация такая же. Это кривизна кода или моих ручек, рисовавших таблицу Выделы? Хотя в последнем я немного сомневаюсь, потому что проверка полигонов не всегда показывает наличие ошибок в пропущенных выделах.

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

Include "MAPBASIC.DEF"

Declare Sub Main

Sub Main

   Dim Marshrut, Number, Place, Station, Obhod, Method, Day, Month, Year, Ploshad, Numstr, Vstrechi, Tip, Rasst, Dal, Samec, Samka, Pol, Kvartal, Videl, storona_sveta, Biotop As Integer
Dim Datta as Date
      Dim Vid, autor, pogoda, Prim as String
   Dim xmin, ymin, xmax, ymax, x0, y0, x1, y1 As Float
   Dim DirLine, centr, rect_mbr As Object


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

      Kvartal = Val(БД_птиц.Квартал)      '' Квартал из текущей строки
      Videl = Val(БД_птиц.Выдел)      '' Выдел из текущей строки
      storona_sveta = Val(БД_птиц.Сторона_квартала)      '' Сторона света из текущей строки
			Biotop = Val(БД_птиц.Биотоп)
      Vid = БД_птиц.Вид
Marshrut = Val(БД_птиц.Маршрут)
    

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

       If storona_sveta < 1 Or Videl < 1 Or Kvartal > 115 Then
         '' Нет такого квартала, выдела или стороны света
  ElseIf Vid = "Глухарь"      Then    
           rect_mbr = MBR(tmptab.obj)
			 xmin = ObjectGeography(rect_mbr, OBJ_GEO_MINX)
         ymin = ObjectGeography(rect_mbr, OBJ_GEO_MINY)
         xmax = ObjectGeography(rect_mbr, OBJ_GEO_MAXX)
         ymax = ObjectGeography(rect_mbr, OBJ_GEO_MAXY)
			
x0 = CentroidX(rect_mbr)
         y0 = CentroidY(rect_mbr)

         x1 = x0
         y1 = x0
			
         Do Case storona_sveta
            Case 1, 3,
               x1 = x0
            Case 6, 2, 7
               x1 = xmax
            Case 5, 4, 8
               x1 = xmin
				
         End Case

         Do Case storona_sveta
            Case 4, 2
               y1 = y0
            Case 5, 1, 6
               y1 = ymax
            Case 3, 7, 8
               y1 = ymin
                    
         End Case
Do Case storona_sveta
Case 9
centr = Centroid(rect_mbr)
End Case

DirLine = Overlap(CreateLine(x0, y0, x1, y1), rect_mbr)
'' Вектор от условной середины выдела к точке пересечения с границей
         If ObjectInfo(DirLine, OBJ_INFO_NPNTS) >= 1 Then
            ''Insert Into Результат (obj) Values (DirLine)
          
Insert Into Результат (Obj, Биотоп, Выдел, Квартал, Сторона_квартала, Вид) Values (CreatePoint(ObjectNodeX(DirLine,1,2), ObjectNodeY(DirLine,1,2) ), Biotop, Videl, Kvartal, storona_sveta, Vid) 			
         End If

      End If

      Fetch Next From БД_птиц
   Loop

   Drop Table tmptab


End Sub


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

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

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

И ещё небольшое дополнение: если заменять Overlap на IntersectNodes, то после построения одной точки, при обработке следующей строки появляется ошибка на скриношоте. Это с чем связано?
Вложения
Ошибка обработки 2.jpg
Ошибка обработки 2.jpg (171.88 КБ) 10783 просмотра

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

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

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

1. Запятая после тройки
Aphina писал(а):Do Case storona_sveta
            Case 1, 3,
               x1 = x0
2. Переменной y1 лучше присвоить y0, а не x0 :)
Aphina писал(а):x0 = CentroidX(rect_mbr)
         y0 = CentroidY(rect_mbr)

         x1 = x0
         y1 = x0
3. В приведенном Вами варианте кода, использование Overlap() не имеет смысла. Вы, все таки определитесь где должна быть точка. На границе выдела или его MBR?

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

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

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

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

   x1 = x0
         y1 = x0
Да, увидела уже, исправила - заработало.
В приведенном Вами варианте кода, использование Overlap() не имеет смысла. Вы, все таки определитесь где должна быть точка. На границе выдела или его MBR?
Да, как оказалось, всё же на границе выдела.

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

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

Сообщение Boris » 22 май 2013, 02:24

с ошибкой разобрались?
если нет, то такое возникает иногда, при неупакованной таблице, в которой есть удаленные строки.
так же она может возникать в случаях, когда внутренняя координатная система ( команда Set Coordsys ) драматически отличается от координатной системы таблицы или окна. потому как сперва все координаты перевычисляются в координатную систему принятую по умолчанию, потом вычисляются, и еще раз вычисляются возвращаясь назад.

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

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

Сообщение Aphina » 22 май 2013, 09:52

с ошибкой разобрались?
Да, разобралась) Теперь точки строятся все) Но новая проблема. Точки обозначенные севером строятся не во всех выделах на севере. На некоторых выделах они строятся на западе. Я ещё могу понять, когда такое касается кривого полигона с дыркой, но юг то строится, а север - не всегда. Вот код, используемый при расчёте координат.

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

  xmin = ObjectGeography(tmptab.obj, OBJ_GEO_MINX)
         ymin = ObjectGeography(tmptab.obj, OBJ_GEO_MINY)
         xmax = ObjectGeography(tmptab.obj, OBJ_GEO_MAXX)
         ymax = ObjectGeography(tmptab.obj, OBJ_GEO_MAXY)

x0 = CentroidX(tmptab.obj)
         y0 = CentroidY(tmptab.obj)
   x2 = xmin + ((xmax -xmin)/2)

y2 = ymin + ((ymax - ymin)/2)
         Do Case storona_sveta
            Case 1, 3,
               x1 = x2
            Case 6, 2, 7
               x1 = xmax
            Case 5, 4, 8
               x1 = xmin
            
         End Case

         Do Case storona_sveta
            Case 4, 2
               y1 = y2
            Case 5, 1, 6
               y1 = ymax
            Case 3, 7, 8
               y1 = ymin
                   
         End Case
Не знаю, у меня уже совсем глаз от этой программы замылился, элементарного не вижу.

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

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

Сообщение juffin_h » 22 май 2013, 11:22

Писал же уже :roll:
Aphina писал(а):Case 1, 3,
Почему запятую после тройки не убрали :?: Это ошибка :!: Читайте справку по оператору Do Case.

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

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

Сообщение Aphina » 22 май 2013, 11:36

:oops: Ну я балда. Просмотрела, видимо, когда в очередной раз что-то редактировала. Спасибо большое)

Ответить

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

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

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