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


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.