Страница 3 из 3

Re:

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

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

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

Добавлено: 15 май 2013, 11:13
trir
Ну, можно все данные загрузить БД и решить поставленную задачу, использовав только SQL...

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

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

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

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

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

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

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

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

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

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

Добавлено: 20 май 2013, 16:43
Aphina
Собственно программа заработала и на условие и выглядит сейчас следующим образом. Не знаю, почему у меня сразу 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


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

Добавлено: 20 май 2013, 17:08
Aphina
И ещё небольшое дополнение: если заменять Overlap на IntersectNodes, то после построения одной точки, при обработке следующей строки появляется ошибка на скриношоте. Это с чем связано?

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

Добавлено: 21 май 2013, 14:14
juffin_h
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?

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

Добавлено: 21 май 2013, 15:23
Aphina

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

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

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

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

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

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

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

  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
Не знаю, у меня уже совсем глаз от этой программы замылился, элементарного не вижу.

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

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

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

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