Страница 3 из 3
Re:
Добавлено: 15 май 2013, 08:34
gamm
trir писал(а):И после этого мне будут говорить, что теория реляционных баз данных не относится к ГИС. Учите SQL!
я его давно выучил, и уже 25 лет других ему учу
а вы попробуйте найти в этом запросе пространственную информацию.
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
Да, увидела уже, исправила - заработало.
В приведенном Вами варианте кода, использование 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
Писал же уже
Aphina писал(а):Case 1, 3,
Почему запятую после тройки не убрали

Это ошибка

Читайте справку по оператору
Do Case.
Re: Очень нужна помощь с MapBasic
Добавлено: 22 май 2013, 11:36
Aphina

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