Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Gazi
Зарегистрирован: 14.02.2010 Сообщения: 30
|
Добавлено: Вс Фев 14, 2010 5:52 pm Заголовок сообщения: Выбор точек случайным образом внутри области |
|
|
Доброго времени суток!
Пишу код на MapBasic, на карте выбираю точку, мне возвращаются ее координаты и объекты с остальных слоев (если есть). Далее сохраняю их в таблице (для слоев использую значения 0 отсутствия и 1 наличия объектов в данной точке).
Далее хочу выбрать на карте город, вокруг него создать зону, скажем в 5 км, и случайным образом выбирать точки, проделывая описанные выше действия. Можно ли сделать такое в MapBasic?
Думал определить зону с помощью переменной типа Object, но не знаю как это сделать. В справочнике нашел функцию Rnd(), но не знаю как ее применить к этой задаче.
Буду рад помощи |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Пн Фев 15, 2010 10:26 am Заголовок сообщения: |
|
|
Вы нашли генератор случайных чисел. Зачем он в Вашем случае? Нужно создать зону вокруг города как буфер? Посмотрите на функцию Create Object As Buffer |
|
Вернуться к началу |
|
|
Gazi
Зарегистрирован: 14.02.2010 Сообщения: 30
|
Добавлено: Пн Фев 15, 2010 11:04 am Заголовок сообщения: |
|
|
создать буфер не проблема. как дальше с ним работать (выбирать случайным образом точки с далнейшим сохранением в таблице)? Это конечно можно делать руками, но если мне нужно тысячу значений ? Как-то тыкать мышкой внутри буфера не практично... |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Пн Фев 15, 2010 11:34 am Заголовок сообщения: |
|
|
а ну тогда вариант - выбрать все точки внутри буфера через Select, а потом выбрать произвольную строку из N имеющихся строк в выборке, это уже с помощью Rnd |
|
Вернуться к началу |
|
|
Gazi
Зарегистрирован: 14.02.2010 Сообщения: 30
|
Добавлено: Пн Фев 15, 2010 9:20 pm Заголовок сообщения: |
|
|
нашел другое решение: выбираем две точки выше и ниже нужного объекта (по диагонали), задаем в программе их координаты и с помощью функции rnd() и цикла заполняем табличку
но возникла другая проблемка.
' Обработка результатов поиска.
For i = 1 to i_found
' Определяем имя таблицы, содержащей найденный объект.
s_table = SearchInfo(i, SEARCH_INFO_TABLE)
If s_table = "Автодороги" then
rd=1
Else rd=0
End If
Insert into Dora
Values (x,y,rd)
При сохранении в таблице вместо одной строчки сохраняются две одинаковые, если переменная rd=0 и три строчки при rd=1, причем одна с параметром 1 (наличие автодороги в данной точке) и две строчки с параметром 0.
Посоветуйте что-нибудь |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Вт Фев 16, 2010 10:55 am Заголовок сообщения: |
|
|
так вы же в цикле заполняете таблицу DORA. вот и вставляются i_found строк
ps про выбор случайных точек - я решила, что случайным образом выбираются точки из существующих точечных объектов, а оказывается нужно произвольно ткнуть в область ) |
|
Вернуться к началу |
|
|
Gazi
Зарегистрирован: 14.02.2010 Сообщения: 30
|
Добавлено: Пт Фев 26, 2010 12:30 pm Заголовок сообщения: |
|
|
спасибо, разобрался.
Проблема решилась так: создал массив, заполненный нулями, проводил поиск и найденным объектам присваивал значение 1 с последуещей записью в нулевой масссив. Потом записывал в таблицу.
Кто нибудь подскажет как очищать таблицу при открытии?
Open Table "C:\Coord"
delete from coord
в таком варианте удаляются строки, но пустые ячейки остаются, а нужная информация записывается после них |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Пт Фев 26, 2010 1:02 pm Заголовок сообщения: |
|
|
Pack Table <table> |
|
Вернуться к началу |
|
|
Gazi
Зарегистрирован: 14.02.2010 Сообщения: 30
|
Добавлено: Пн Мар 08, 2010 8:06 pm Заголовок сообщения: |
|
|
подскажите, в таком варианте расстояние записывается в отдельную таблицу:
Fetch First From Coord
Do While Not EOT(Coord)
start_x = Coord.Xcoord
start_y = Coord.Ycoord
dist = Distance (start_x, start_y, end_x, end_y,"km")
Insert into CoordT3 (Distance) Values (dist)
Fetch Next From Coord
Loop
Если сделать так (записывать в таблицу, откуда беру значения), получается какой-то бесконечный цикл, совершенно другие значения записываются ниже существующих:
Alter Table Coord (Add Distance Integer)
Commit Table Coord
Fetch First From Coord
Do While Not EOT(Coord)
start_x = Coord.Xcoord
start_y = Coord.Ycoord
dist = Distance (start_x, start_y, end_x, end_y,"km")
Insert into Coord (Distance) Values (dist)
Fetch Next From Coord
Loop
Commit Table Coord |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Вт Мар 09, 2010 10:26 am Заголовок сообщения: |
|
|
Ой, так зачем вы вставляете НОВЫЕ строки в таблицу, если вам нужно ОБНОВИТЬ строку - значение для указанной колонки в текущей строке?
Пользуйте UPDATE вместо INSERT. Не забудьте указать в команде номер обновляемой строки. |
|
Вернуться к началу |
|
|
Gazi
Зарегистрирован: 14.02.2010 Сообщения: 30
|
Добавлено: Вт Мар 09, 2010 11:40 am Заголовок сообщения: |
|
|
У меня в первом случае формируется массив расстояний в отдельной таблице. Его я хотел записать в исходную таблицу.
Если я правильно понял, нужно изменить строчку вот так:
Update Coord Set Distance = dist
в таком варианте добавляется столбик, но туда записывается n-е количество раз одно и тоже значение |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Вт Мар 09, 2010 12:15 pm Заголовок сообщения: |
|
|
Не забудьте указать в команде номер обновляемой строки
команда в справке расписана:
Update Coord Set Distance = dist Where RowID = idnum
где idnum - вычисленный в цикле Do While номер текущей строки (idnum = Coord.RowId)
В описании Update упомянут этот момент, когда номер строки не прописан, обновляются все строки таблицы, читайте внимательнее, прежде чем применять. |
|
Вернуться к началу |
|
|
14Division
Зарегистрирован: 26.11.2009 Сообщения: 3
|
Добавлено: Пт Мар 12, 2010 12:58 pm Заголовок сообщения: |
|
|
подскажите как из одной таблицы Table2 отдельные столбцы с данными Column1 иColumn2 перенести в другую таблицу Table1 - Column3,4? |
|
Вернуться к началу |
|
|
reasonat
Зарегистрирован: 01.07.2009 Сообщения: 224 Откуда: Екатеринбург
|
Добавлено: Пт Мар 12, 2010 3:06 pm Заголовок сообщения: |
|
|
Почитайте в справочнике про Add Column. Должна подойти. |
|
Вернуться к началу |
|
|
14Division
Зарегистрирован: 26.11.2009 Сообщения: 3
|
Добавлено: Пт Мар 12, 2010 5:24 pm Заголовок сообщения: |
|
|
функция по описанию подходит и на форуме эта тема поднималась http://www.map-info.ru/phpbb2/viewtopic.php?t=1035&highlight=add+column
но не могли бы вы объяснить:
Set To expression
[ Where { dest_column = source_column | Within | Contains | Intersects } ]
[ Dynamic ] }
expression и dest_column = source_column, что тут надо вставить?
Из таблицы City столбец S1 вставить в таблицу City1, как это правильно задать?
Add Column City1 (SK Integer)
From City
Set to City1 (?)
Where ... (?) |
|
Вернуться к началу |
|
|
|