1.открываем базу данных;
2. читаем таблицу построчно, в строке находим номер квартала и выдела,
3. строим оконтуривающий прямоугольник для выбранного выдела;
4.для объекта MBR (прямоугольник) узнаются координаты узлов, потом находится центр прямоугольника и середины сторон ( это будут точки с направлением на
север-юг-запад-восток).
5. строится отрезок: одна точка - середина прямоугольника, вторая точка зависит от содержимого колонки, в которой указано направление на стороны света;
6. ищем пересечение - отрезка и выдела, координаты точки пересечения - это и есть нужная точка
7. все точки - для каждой строки из xls строим с помощью INSERT в
новую таблицу.
8. результат работы утилиты: таблица с точками, для каждой точки в
колонках описаны все атрибутивные данные.
Код: Выделить всё
Include "mapbasic.def"
Dim rect_mbr, st_sv As Object, x1, x2, y1, y2, x3, y3, cx, cy, centr As Float, r As Integer
Dim sv as alias
Dim tail as string
Dim al as alias
Dim videl as string
Dim kvartal as string
Dim storona as string
Dim tab as string
Open Table "БД_птиц" Interactive
Fetch First From БД_птиц
Select J, кварталы From БД_птиц 'Where кварталы = 1
r = TableInfo ("БД_птиц", TABLE_INF0_NROWS)
While r <= 10725 'пока не закончатся отведённые строки
tab = "выборка"
al = tab+".кварталы"
kvartal = al
Select * from Выделы Where Поле2 = videl and Номер_квартала = kvartal 'выборка выдела по стороне квартала
rect_mbr = Str$(Selection.obj)
Add Map Layer Результат
rect_mbr = MBR(Выделы.obj) 'окунтуривающий прямоугольник для выдела
y1 = ObjectGeography(rect_mbr.obj, OBJ_GEO_MINY) 'минимальные и максимальные координаты этого выдела
y2 = ObjectGeography(rect_mbr.obj, OBJ_GEO_MAXY)
x1 = ObjectGeography(rect_mbr.obj, OBJ_GEO_MINX)
x2 = ObjectGeography(rect_mbr.obj, OBJ_GEO_MAXX)
x3 = x2 - x1
y3 = y2 - y1
cx = x1+((x2 - x1)/2) 'координаты центра
cy = y1 + ((y2 - y1)/2)
tail = "выбор"
sv = tail+".Бд_птиц"
Do Case Select * from ".БД_птиц" Where I = tail 'выборка на сторону света
Case tail = 1
"st_sv = CreateLine (cx, cy, x3, y2)"
Case tail = 2
"st_sv = CreateLine (cx ,cy, x2, y3)"
Case tail = 3
"st_sv = CreateLine (cx, cy, x3, y1)"
Case tail = 4
"st_sv = CreateLine (cx, cy, x1, y3)"
Case tail = 5
"st_sv = CreateLine (cx, cy, x1, y2)"
Case tail = 6
"st_sv = CreateLine (cx, cy, x2, y2)"
Case tail = 7
"st_sv = CreateLine (cx, cy, x2, y1)"
Case tail = 8
"st_sv = CreateLine (cx, cy, x1, y1)"
Case tail = 9
"st_sv = CreateLine (cx, cy, cx, cy)"
nodes = IntersectNodes(Выделы.obj , st_sv, INCL_CROSSINGS) 'получение точки на пересечении границы выдела и стороны света
x = ObjectNodeX(nodex, 1, 1)
y = ObjectNodeY(nodex, 1, 1)
p = CreatePoint(x, y)
INSERT INTO Результат(obj) values(p)
r = r + 1
Wend
Исправление: добавила БД_птиц в отдельный архив.