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

а вы попробуйте найти в этом запросе пространственную информацию.
Геоинформационные системы (ГИС) и Дистанционное зондирование Земли
я его давно выучил, и уже 25 лет других ему учуtrir писал(а):И после этого мне будут говорить, что теория реляционных баз данных не относится к ГИС. Учите SQL!
Можно. Но зачем? Это довольно простая задача, дольше загружать выгружать будешь.trir писал(а):Ну, можно все данные загрузить БД и решить поставленную задачу, использовав только SQL...
вы удивитесь, но любую задачу можно решить на машине Тьюринга с одной головкой. Вообще без всяких SQL и прочих васиков.trir писал(а):Ну, можно все данные загрузить БД и решить поставленную задачу, использовав только SQL...
Разберется и перестанет спотыкатьсяtrir писал(а):Нету, но человек только начал знакомится с ГИС и уже спотыкается на SQL-запросах, а что дальше будет?
Код: Выделить всё
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
2. Переменной y1 лучше присвоить y0, а не x0Aphina писал(а):Do Case storona_sveta
Case 1, 3,
x1 = x0
3. В приведенном Вами варианте кода, использование Overlap() не имеет смысла. Вы, все таки определитесь где должна быть точка. На границе выдела или его MBR?Aphina писал(а):x0 = CentroidX(rect_mbr)
y0 = CentroidY(rect_mbr)
x1 = x0
y1 = x0
Код: Выделить всё
x1 = x0
y1 = x0
Да, как оказалось, всё же на границе выдела.В приведенном Вами варианте кода, использование Overlap() не имеет смысла. Вы, все таки определитесь где должна быть точка. На границе выдела или его MBR?
Да, разобралась) Теперь точки строятся все) Но новая проблема. Точки обозначенные севером строятся не во всех выделах на севере. На некоторых выделах они строятся на западе. Я ещё могу понять, когда такое касается кривого полигона с дыркой, но юг то строится, а север - не всегда. Вот код, используемый при расчёте координат.с ошибкой разобрались?
Код: Выделить всё
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
Почему запятую после тройки не убралиAphina писал(а):Case 1, 3,
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость
© GIS-Lab и авторы, 2002-2017. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов (подробнее).