Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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))
определяется просто - комментируйте строку, выполняйте алгоритм, засекайте время. |
|
Вернуться к началу |
|
|
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 |
|
Вернуться к началу |
|
|
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 таблицы, которые сформировал таким образом. как их объединить в одну? |
|
Вернуться к началу |
|
|
|