Составление простого растра по очень большой БД

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
biogis
Интересующийся
Сообщения: 32
Зарегистрирован: 05 мар 2010, 20:24
Репутация: 2
Откуда: Санкт-Петербург
Контактная информация:

Составление простого растра по очень большой БД

Сообщение biogis » 21 фев 2023, 18:49

Добрый вечер!
Имеется БД местонахождений биообъектов из iNaturalist, содержащая порядка 60 миллионов записей в формате CSV, включающих и координатную информацию о местоположениях биообъектов – http://www.inaturalist.org/observations ... s-dwca.zip - На основании этих данных надо составить глобальный растр в общегеографической проекции с пространственным разрешением 30 секунд, формат geotif. В клетки растра надо ввести суммарное число местонахождений биообъектов, приходящихся на соответствующую клетку растра.
Вроде бы простая задача, но объем записей огромен. Пока не понятно: в каком софте эту БД открывать и обрабатывать с целью получения искомого растра.

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Составление простого растра по очень большой БД

Сообщение gamm » 21 фев 2023, 19:50

1) у вас такой раст мало куда влезет, а если и влезет, то работать с ним тяжело будет, надо резать на тайлы (квадратики), SRTM (3-сек), например, нарезается градус на градус, т.е. 1200х1200, вам можно 10х10 градусов, например. Поэтому вопрос номер один - что вы с ним делать собираетесь?

2) очевидно, что таблицу нужно импортировать в любую современную базу, арифметикой посчитать номера строк и столбцов, а потом запросом посчитать для них количества. Postgress точно потянет, скорее всего и MySQL тоже, а то и Access. Потом арифметикой считаем номера тайлов, и в цикле выдаем xyz файл для каждого. Можно просто программу написать на С++, и сделать то же самое за один проход, раскидав xyz по файлам.

3) Читаем xyz из п.2 в C++/R/Python, и создаем растровые тайлы.

biogis
Интересующийся
Сообщения: 32
Зарегистрирован: 05 мар 2010, 20:24
Репутация: 2
Откуда: Санкт-Петербург
Контактная информация:

Re: Составление простого растра по очень большой БД

Сообщение biogis » 22 фев 2023, 07:02

Спасибо!
1) итоговый глобальный растр, на самом деле, будет очень небольшой. Разрешение 30 секунд - то есть примерно 1-километровый. Проблема только в присвоении ячейкам значений количества приходящихся на них местонахождений (observations).
Растр нужен для нормализации и межрегионального сравнения данных о распространении отдельных видов с учетом активности корреспондентов БД в каждом регионе. Этот суммарный растр плотностей наблюдений как раз и должен служить показателем региональной активности корреспондентов. Пример использования: в Мичигане по изучаемому виду 100 наблюдений, в провинции Гуанчжоу - 10. Вопрос: где встречаемость вида выше? Допустим, растр показывает, что плотность регистрации прочих объектов на единицу площади в Мичигане в 50 раз выше, чем в Гуанчжоу - то есть активность корреспондентов в 50 раз выше. Тогда можно примерно считать, что встречаемость объекта в Гуаньчжоу в 5 раз выше, чем в Мичигане: 10/(100/50)=5. - Примерно так.
2) Access попробовал использовать - он такую БД не открывает.
3) при 30-секундном разрешении тайлы не потребуются - всё уложится в один растр.

trir
Гуру
Сообщения: 5286
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Составление простого растра по очень большой БД

Сообщение trir » 22 фев 2023, 12:51


gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Составление простого растра по очень большой БД

Сообщение gamm » 22 фев 2023, 13:31

сделал на скорую руку на R, но он память кушает очень. Пришлось сохранять промежуточный результат, и перезапускать, даже 64Гб не хватает. Грузилось примерно полчаса, остальное минуты. В одну клетку что-то многовато попало, а так вроде ничего. На разные детали типа вида не смотрел, все свалено в одну кучу.

промежуточный
tiff

Код: Выделить всё

fn="I:/temp2/observations.csv"
beg.time=Sys.time()
p=read.csv(fn,header=TRUE,sep=",",quote = "\"",dec = ".",fill=TRUE,comment.char="",as.is=TRUE)
end.time=Sys.time(); print(end.time-beg.time)
p1=p[,c("decimalLatitude","decimalLongitude")]

fn2="I:/temp2/observations.RData"
save(p,file=fn2)
rm(p)
gc()

p2=as.matrix(p1)
m1=cbind(p2,p2,p2[,1])
colnames(m1)[3:5]=c("Col","Row","One")
step=1/(60*2)
m1[,"Col"]=round((m1[,"decimalLongitude"]+180)/step)
m1[,"Row"]=round((m1[,"decimalLatitude"] + 90)/step)
m1[,"One"]=1
sel=!is.na(m1[,"decimalLongitude"]) & !is.na(m1[,"decimalLatitude"])
m2=m1[sel,]

beg.time=Sys.time()
m3=aggregate(m2[,"One"],by=list(Col=m2[,"Col"],Row=m2[,"Row"]),length)
end.time=Sys.time(); print(end.time-beg.time)

fn="I:/temp2/observations_counts.RData"
save(m3,file=fn)

=======================================================================
library(raster)

fn="I:/temp2/observations_counts.RData"
load(file=fn)

r1=raster(nrows=21600,ncols=43200,xmn=-180,xmx=180,ymn=-90,ymx=90)
r1[]=0

col=pmax(1,m3[,"Col"])
row=pmax(1,m3[,"Row"])
cnt=m3[,"x"]
pos=(row-1)*ncol(r1)+col
beg.time=Sys.time()
r1[pos]=cnt
end.time=Sys.time(); print(end.time-beg.time)
dataType(r1)="INT4S"

fn.out="I:/temp2/observations.tif"
beg.time=Sys.time()
tmp=writeRaster(r1,filename=fn.out,format="GTiff",overwrite=TRUE)
end.time=Sys.time(); print(end.time-beg.time)
А в целом уважаемый trir как всегда прав, вся сила в SQL :mrgreen:

biogis
Интересующийся
Сообщения: 32
Зарегистрирован: 05 мар 2010, 20:24
Репутация: 2
Откуда: Санкт-Петербург
Контактная информация:

Re: Составление простого растра по очень большой БД

Сообщение biogis » 22 фев 2023, 15:23

Спасибо!) Я, к сожалению, с этим софтом не работаю.
На пробнике север с югом для точек поменялись местами – получилось зеркально) То что все виды (корреспонденты) суммируются - так и надо. У меня при экспорте растра в Idrisi в сумме получилось 38636978.063869 (real) наблюдений – меньше, чем в БД. Да, заметил - максимальное число наблюдений на клетку составило 37831 – очень много, но, возможно, что так и есть в каких-то крупных городах - надо смотреть.
И да, - надо осваивать софт под большие данные. Или дружить)

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Составление простого растра по очень большой БД

Сообщение gamm » 22 фев 2023, 15:44

насчет количества - около 100,000 строк было без координат (меньше, но точно не помню). Насчет зеркального отражения - вполне может быть, я заполнял как матрицу, у нее нумерация зеркальная.

trir
Гуру
Сообщения: 5286
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Составление простого растра по очень большой БД

Сообщение trir » 23 фев 2023, 00:28

надо осваивать софт под большие данные
60 миллионов записей - это не большие данные, обычная СУБД спокойно справляется

biogis
Интересующийся
Сообщения: 32
Зарегистрирован: 05 мар 2010, 20:24
Репутация: 2
Откуда: Санкт-Петербург
Контактная информация:

Re: Составление простого растра по очень большой БД

Сообщение biogis » 23 фев 2023, 03:57

gamm писал(а):
22 фев 2023, 15:44
Насчет зеркального отражения - вполне может быть, я заполнял как матрицу, у нее нумерация зеркальная
Транспонировал пробный растр. Попробую использовать. О результатах сообщу, если интересно. Еще раз спасибо!)

tikhpetr
Гуру
Сообщения: 1087
Зарегистрирован: 30 окт 2014, 16:33
Репутация: 153
Откуда: г. Жуковский МО

Re: Составление простого растра по очень большой БД

Сообщение tikhpetr » 23 фев 2023, 04:40

gamm, Убили Вы меня. Промозглой февральской ночью финкой в переулке. Вся бездна незнания вскрылась моего. Что можно почитать? Не сочтите за труд!

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Составление простого растра по очень большой БД

Сообщение gamm » 23 фев 2023, 08:48

попробовал немного поправить код - более правильно считать номера ячеек, и рпзвернул растр по вертикали. Посмотрите, если что-то еще надо, пишите. Интересно, по старой памяти, я же тоже типа эколог.
промежуточный
растр
Посмотрел картинку, вроде теперь Америка на месте. Вообще, похоже что много данных есть только по Северной Америке, Европе, Австралии и Японии, остальное просто белые пятна.

Код: Выделить всё

fn="I:/temp2/observations.csv"
beg.time=Sys.time()
p=read.csv(fn,header=TRUE,sep=",",quote = "\"",dec = ".",fill=TRUE,comment.char="",as.is=TRUE)
end.time=Sys.time(); print(end.time-beg.time)
p1=p[,c("decimalLatitude","decimalLongitude")]

fn2="I:/temp2/observations.RData"
save(p,file=fn2)
rm(p)
gc()

p2=as.matrix(p1)
m1=cbind(p2,p2,p2[,1])
colnames(m1)[3:5]=c("Col","Row","One")
step=1/(60*2)
m1[,"Col"]=floor((m1[,"decimalLongitude"]+180)/step)+1
m1[,"Row"]=floor((m1[,"decimalLatitude"] + 90)/step)+1
m1[,"One"]=1
sel=!is.na(m1[,"decimalLongitude"]) & !is.na(m1[,"decimalLatitude"])
m2=m1[sel,]

beg.time=Sys.time()
m3=aggregate(m2[,"One"],by=list(Col=m2[,"Col"],Row=m2[,"Row"]),length)[quote=tikhpetr post_id=183684 time=1677116414 user_id=17276]Что можно почитать?[/quote]
end.time=Sys.time(); print(end.time-beg.time)

fn="I:/temp2/observations_counts.RData"
save(m3,file=fn)

=======================================================================
library(raster)

fn="I:/temp2/observations_counts.RData"
load(file=fn)

r1=raster(nrows=21600,ncols=43200,xmn=-180,xmx=180,ymn=-90,ymx=90)
r1[]=0

col=pmax(1,m3[,"Col"])
row=pmax(1,m3[,"Row"])
cnt=m3[,"x"]
pos=(nrow(r1)-row+1)*ncol(r1)+col
beg.time=Sys.time()
r1[pos]=cnt
end.time=Sys.time(); print(end.time-beg.time)
dataType(r1)="INT4S"

fn.out="I:/temp2/observations.tif"
beg.time=Sys.time()
tmp=writeRaster(r1,filename=fn.out,format="GTiff",overwrite=TRUE)
end.time=Sys.time(); print(end.time-beg.time)
tikhpetr писал(а):
23 фев 2023, 04:40
Что можно почитать?
я читал в основном чужие исхоники, и писал свои. Но сейчас это уже никому не нужно, за редким исключением, всем нужна готовая кнопка (и в 95% случаев она действительно где-то есть). Потому такие знания уже не нужны, так что не горюйте :mrgreen:

biogis
Интересующийся
Сообщения: 32
Зарегистрирован: 05 мар 2010, 20:24
Репутация: 2
Откуда: Санкт-Петербург
Контактная информация:

Re: Составление простого растра по очень большой БД

Сообщение biogis » 23 фев 2023, 11:09

gamm писал(а):
23 фев 2023, 08:48
Посмотрите
Спасибо! - качаю подкорректированный растр.
gamm писал(а):
23 фев 2023, 08:48
похоже что много данных есть только по Северной Америке, Европе, Австралии и Японии
Так и есть. Ещё Южная Корея. В Африке в ЮАР побольше, чем в других странах континента. - Все эти различия следует учитывать для нормализации данных и составления выборки в ЭГ анализе. Для чего и нужен растр плотностей наблюдений. Проверю растр на своих объектах и сообщу. Как с Вами связаться?
gamm писал(а):
23 фев 2023, 08:48
такие знания уже не нужны
Нужны) новые продвинутые кнопки строятся на новых знаниях и подходах, а познание бесконечно

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Составление простого растра по очень большой БД

Сообщение gamm » 23 фев 2023, 11:55

biogis писал(а):
23 фев 2023, 11:09
Как с Вами связаться?
Хотел написать, но на Вашем сайте почты не нашел. Пишите сюда glmmivanov@yandex.ru

P.S. Знакомые эксерсизы, sampling efforts нужен оказался :D

tikhpetr
Гуру
Сообщения: 1087
Зарегистрирован: 30 окт 2014, 16:33
Репутация: 153
Откуда: г. Жуковский МО

Re: Составление простого растра по очень большой БД

Сообщение tikhpetr » 24 фев 2023, 11:54

gamm, Вам Бог завез с математикой. Мне со слухом. Игорь и Эдуард, извините за флейм. По состоянию на февраль 2023 года я могу опознать около 30-40 почерков. Только это нахрен никому не нать.

tikhpetr
Гуру
Сообщения: 1087
Зарегистрирован: 30 окт 2014, 16:33
Репутация: 153
Откуда: г. Жуковский МО

Re: Составление простого растра по очень большой БД

Сообщение tikhpetr » 24 фев 2023, 11:55

З.Ы. Сам пока работаю без подчерка.

Ответить

Вернуться в «Общие вопросы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей