www.map-info.ru :: Просмотр темы - Выбор точек случайным образом внутри области
                               РќР° главную страницу сайта

 
                                
ВходВход    РегистрацияРегистрация    ПрофильПрофиль    ПользователиПользователи    ГруппыГруппы    FAQFAQ    ПоискПоиск  
На страницу Пред.  1, 2, 3
 
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
Предыдущая тема :: Следующая тема  
Автор Сообщение
Gazi



Зарегистрирован: 14.02.2010
Сообщения: 30

СообщениеДобавлено: Пн Май 17, 2010 8:04 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

расчет не совсем "голый". заданную область разбиваю на сетку размером 1000*1000 и прохожу циклом по ней (и того 1млн значений). Для каждой точки определяю координаты (отдельно занимает 1-2 мин). После этого прохожу по слоям и определяю, есть ли в данной точке объекты (в данном случае реки, села). если есть - в таблицу записываю 1, в противном случае - 0 (вот тут долго обрабатывается). привожу алгоритм:

...
dim p() as integer
dim obj() as string

redim p(n)
redim obj(n)

obj(1)="Реки"
obj(2)="Села"
....
nn=1000

xg1=24.5319
yg1=48.4709
xg2=24.5779
yg2=48.4441

dx=xg2-xg1
dy=yg2-yg1

stepx=dx/nn
stepy=dy/nn

x=xg1-stepx
y=yg1-stepy

print "----------------------------------------"

For jj=1 to nn
x=xg1-stepx
y=y+stepy

For ii=1 to nn
x=x+stepx

i_found = SearchPoint(i_win_id, x, y)

If i_found <> 0 Then

For k = 1 to ubound(p)
p(k)=0
next

For k = 1 to i_found
s_table = SearchInfo(k, SEARCH_INFO_TABLE)

for j=1 to n
if s_table = obj(j) then
print "point "+i+" found "+s_table
p(j) = 1
exit for
end if
next

Next

Insert into Coordp Values (x,y,p(1),p(2))

end if
Next
Next

далее провожу расчет расстояний, тут можно воспользоваться советом про Access, но загвоздка в предыдущем пункте.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Вт Май 18, 2010 8:35 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Попробуйте определить на какой строке тормозит:
1) i_found = SearchPoint(i_win_id, x, y)
2) Insert into Coordp Values (x,y,p(1),p(2))

определяется просто - комментируйте строку, выполняйте алгоритм, засекайте время.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Gazi



Зарегистрирован: 14.02.2010
Сообщения: 30

СообщениеДобавлено: Ср Май 19, 2010 11:29 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

сделал, что рекомендовали.
1) в первом пункте обработка длится 1-2 мин, но впоследствии таблица оказывается пустой;
2) закомментировав Insert into Coordp Values (x,y,p(1),p(2))
расчет длится 2,5 часа. значит тормозит строка:
i_found = SearchPoint(i_win_id, x, y)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Андрей Могильный



Зарегистрирован: 21.03.2006
Сообщения: 864

СообщениеДобавлено: Ср Май 19, 2010 2:33 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Попробуйте заменить ее конструкцией Select с оператором Intersects
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Gazi



Зарегистрирован: 14.02.2010
Сообщения: 30

СообщениеДобавлено: Пн Июн 28, 2010 10:35 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Нужно в таблице найти номер строки, которому соответствует пересечение двух координат х и у. К таблице не присоединены графические объекты, поэтому команда Find не доступна. Можно как-то иначе сделать?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Вт Июн 29, 2010 7:06 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Если поля с координатами в таблице есть, ищите их запросом. Если нет - то никак
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gazi



Зарегистрирован: 14.02.2010
Сообщения: 30

СообщениеДобавлено: Ср Июн 30, 2010 3:40 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

я так и делал, только как мне узнать номер строки?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
reasonat



Зарегистрирован: 01.07.2009
Сообщения: 224
Откуда: Екатеринбург

СообщениеДобавлено: Ср Июн 30, 2010 3:54 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

если выборка сработала, то обработчик SelChangedHandler покажет номер выбранной строки
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gazi



Зарегистрирован: 14.02.2010
Сообщения: 30

СообщениеДобавлено: Вс Июл 04, 2010 1:16 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Спасибо, с кодом разобрался.

Declare Sub Main
Declare Sub SelChangedHandler

dim ID as integer

Sub Main
dim i as integer
Set Handler SelChangedHandler Off
Select * from Coord where Xcoord=24.5412 And Ycoord=48.3089 into tmptable
Set Handler SelChangedHandler On

print chr$(12)
for i=1 to tableinfo(tmptable,TAB_INFO_NROWS)
select * from tmptable where rowid=i
print ID
next
close table tmptable
end program
end Sub

Sub SelChangedHandler
ID=CommandInfo(CMD_INFO_ROWID)
End Sub

Но когда я задаю координаты (у меня после запятой 4 цифры, в таблице 4 и больше) часто ничего не находит. Можно как-то принудительно задать выбор только по 4 цифрам после запятой?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Arhara



Зарегистрирован: 18.02.2009
Сообщения: 400
Откуда: Moscow, RF

СообщениеДобавлено: Пн Июл 05, 2010 4:28 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

Функция Round() не подойдет?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gazi



Зарегистрирован: 14.02.2010
Сообщения: 30

СообщениеДобавлено: Чт Июл 08, 2010 11:00 am    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

в теле программы добавил

x1=Coord.Xcoord
'столбец Xcoord таблицы Coord
y1=Coord.Xcoord
p=Round (x1, 0.0001)
s=Round (y1, 0.0001)

но это результата не дало. Вы это имели ввиду или предполагалось использование Round() другим образом?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gazi



Зарегистрирован: 14.02.2010
Сообщения: 30

СообщениеДобавлено: Вт Июл 13, 2010 1:26 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

В самой таблице округляет до 4 знаков, но если выбрать ячейку - то знаков после запятой намного больше и поиск не работает.

Create Table Coord
(Xcoord Float,
Ycoord Float)

Можно ли явно указать количество знаков после запятой в Float?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Gazi



Зарегистрирован: 14.02.2010
Сообщения: 30

СообщениеДобавлено: Вт Авг 03, 2010 2:52 pm    Заголовок сообщения: Добавить ответ со ссылкой на данный текст

если сохранить данные в .csv, а потом открыть с помощью мапинфо и сохранить как таблицу - остается 4 знака после запятой и поиск работает.

подскажите, есть 2 таблицы, которые сформировал таким образом. как их объединить в одну?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
   Список форумов www.map-info.ru | Форум - программирование в среде MapInfo Добавить ответ
На страницу Пред.  1, 2, 3
Страница 3 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Top.Mail.Ru