Створення великої кількості випадкових точок у бінарному растрі?


9

Я хочу створити набір даних векторних точок 10000 точок (або більше) в межах двійкового растру, де точки повинні бути обмежені областями, де значення растрового значення дорівнює 1.

Я спробував наступні кроки.

  1. Полігонізуйте растр
  2. QGIS: Вектор -> Інструменти дослідження -> Випадкові бали

Це чудово працює до 2000 балів, але все, що вище, просто призводить до краху QGIS.

Чи є спосіб створити векторний набір даних з великою кількістю точкових функцій, обмежених бінарним растром (або полігонізованою його версією)?

У моєму розпорядженні є такі інструменти, які віднесені до найменш сприятливих: QGIS, Python, R, ArcGIS

Це те, про що я йду, лише з 10-кратними точковими функціями.

1к випадкових балів


Наскільки зазвичай ваш растр, як правило?
Spacedman

Таблиця в наведеному вище прикладі - 19200 x 9600. Типовий растр - близько 10000 x 10000 пікселів.
Керстен

Гаразд, чим більше оперативної пам'яті має ваша машина, тим краще. Я не смію тестувати на растрі 10 000x10,000 на моєму маленькому ПК тут, хоча ви завжди можете розділити растр, зразок на частини та приєднатися ...
Spacedman

чому полігонізувати растр? чи не заперечуєте ви, щоб ця відповідь корисна для вас? gis.stackexchange.com/questions/22601/…
Луїджі Піреллі

Тому що тоді я можу використовувати функцію "Випадкові точки в полігоні", тоді як у QGIS немає "Випадкових точок всередині конкретних значень растра".
Керстен

Відповіді:


7

Ось спосіб у R:

Зробіть тестовий растр, 20х30 комірок, зробіть 1/10 комірок, встановлених на 1, графік:

> require(raster)
> m = raster(nrow=20, ncol=30)
> m[] = as.numeric(runif(20*30)>.9)
> plot(m)

Для існуючого растру у файлі, наприклад, geoTIFF, ви можете просто зробити:

> m = raster("mydata.tif")

Тепер отримаємо матрицю координат xy 1 комірок, побудуємо ці точки, і ми бачимо, що у нас є клітинні центри:

> ones = xyFromCell(m,1:prod(dim(m)))[getValues(m)==1,]
> head(ones)
       x    y
[1,] -42 85.5
[2,] 102 85.5
[3,] 162 85.5
[4,]  42 76.5
[5,] -54 67.5
[6,]  30 67.5
> points(ones[,1],ones[,2])

Крок 1. Створіть 1000 (xo, yo) пар, розміщених у центрі 0, у розмірі однієї комірки. Зауважте використання resдля отримання розміру комірки:

> pts = data.frame(xo=runif(1000,-.5,.5)*res(m)[1], yo=runif(1000,-.5,.5)*res(m)[2])

Крок 2. Визначте, у яку комірку входить кожна з перерахованих вище точок, випадковим чином відібравши 1000 значень від 1 до числа 1 комірок:

> pts$cell = sample(nrow(ones), 1000, replace=TRUE)

Нарешті обчисліть координату, додавши центр зсуву до зміщення. Сюжет для перевірки:

> pts$x = ones[pts$cell,1]+pts$xo
> pts$y = ones[pts$cell,2]+pts$yo
> plot(m)
> points(pts$x, pts$y)

Ось 10000 балів (замініть 1000 вище на 10000), накреслені pch=".":

бали в одиницях

Набагато миттєвий за 10 000 очок на растрі 200х300, половина очок як одиниця . Збільшиться в часі лінійно, скільки думаю в растрі, я думаю.

Щоб зберегти як файл форми, перетворіть його на SpatialPointsоб'єкт, надайте йому правильну посилання на систему координат (те саме, що і ваш растр) та збережіть:

> coordinates(pts)=~x+y
> proj4string(pts)=CRS("+init=epsg:4326") # WGS84 lat-long here
> shapefile(pts,"/tmp/pts.shp")

Це створить файл форми, який включає в себе атрибути номер комірки та зміщення.


Це виглядає дуже перспективно. Мій R став трохи іржавим: як я міг би експортувати точки у векторний формат (Shapefile, geojson, gml, ... що б там не було насправді) - мені потрібно зберегти місця зразкових точок для подальшого використання.
Керстен

Правки показують, як читати растр і перетворювати бали у shapefile ...
Spacedman

3

Кожен раз, коли я працюю з великими наборами даних, я люблю запускати інструменти / команди за межами QGIS, наприклад, з автономного сценарію або з оболонки OSGeo4W . Не стільки тому, що QGIS виходить з ладу (навіть якщо на ньому написано "Не відповідає", це, ймовірно, все ще обробляє дані, які ви можете перевірити в диспетчері завдань ), а тому, що для обробки даних доступно більше ресурсів процесора, таких як оперативна пам'ять. Сам QGIS витрачає неабиякий фрагмент пам'яті.

У будь-якому випадку, щоб запустити інструмент поза QGIS ( вам потрібно було б встановити QGIS через інсталятор OSGeo4W ), дотримуйтесь перших двох кроків, як описано в цій публікації @gcarrillo: Проблема з імпортом qgis.core під час написання автономного сценарію PyQGIS (Я пропоную завантажити та використовувати його .bat файл).

Після встановлення PATHS введіть pythonу командний рядок. Для зручності скопіюйте наступний код в текстовий редактор , наприклад Блокнот, редагувати такі параметри, як ім'я шляху ваш шейпфайл і т.д. , а потім вставити все це в командному рядку правою кнопкою миші> Вставити :

import os, sys
from qgis.core import *
from qgis.gui import *
from PyQt4.QtGui import *

from os.path import expanduser
home = expanduser("~")

QgsApplication( [], False, home + "/AppData/Local/Temp" )

QgsApplication.setPrefixPath("C://OSGeo4W64//apps//qgis", True)
QgsApplication.initQgis()
app = QApplication([])

sys.path.append(home + '/.qgis2/python/plugins')
from processing.core.Processing import Processing
Processing.initialize()
from processing.tools import *

shape = home + "/Desktop/Polygon.shp"
result = home + "/Desktop/Point.shp"
general.runalg("qgis:randompointsinlayerbounds", shape, 10000, 0, result)

Використовуючи скрипт, я запустив інструмент « Довільні точки в шарах меж шару » для досить великого формфайлу, і на генерування 10k балів знадобилося менше 20 секунд. Запуск його всередині QGIS займав майже 2 хвилини, так що принаймні для мене є суттєва різниця.


1
Відмінна альтернатива, +1. Щойно тестував це для мого застосування, і хоча це трохи повільніше, ніж підхід R, він створює бажані результати.
Керстен

@Kersten - Дивовижно, радий, що це працює :)
Жозеф

1

Ви також можете використовувати GRASS GIS безпосередньо для цієї роботи - Стратифікована випадкова вибірка: Випадкова вибірка з векторної карти з просторовими обмеженнями :

https://grass.osgeo.org/grass72/manuals/v.random.html#stratified-random-sampling:-random-sampling-from-vector-map-with-spatial-constraints

Крім того, у команді реалізовано випадкову вибірку з векторної карти за атрибутом та декілька інших методів.

Примітка. Версія v.random, викрита в QGIS під час обробки, не відображає повну функціональність, а лише спрощений вигляд.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.