Создание растра со значениями на основе выходных данных функции

У меня есть функция, которая вычисляет цену на основе входного наклона и расстояния. Я хочу записать цену в растр как значение растра. Как я могу это сделать? Решения OpenSource и ArcMap будут работать.

slopeRaster = "slope.tif"
emptyRaster = "emptyraster.tif" # How do I create an empty raster?
road = "road.shp"

for cell in emptyraster:
    # get slope from sloperaster at cell location
    ...
    slope = ...

    # get distance to nearest road from center of cell
    ...
    distance = ...

    # calculate price for cell
    price = pricefunc(slope, distance)

    # write price to cell as value  # How do I write a value to a raster

person ustroetz    schedule 13.03.2013    source источник
comment
Вы можете сделать это в R. Вы знакомы с ним? Было бы полезно предоставить полное решение, если бы вы могли предоставить нам подробную информацию о вашей цене.   -  person Simon O'Hanlon    schedule 14.03.2013
comment
Я не использовал R. PriceFunc очень длинный. Я не думаю, что это имеет значение. В основном он принимает аргументы наклона и расстояния и возвращает для них цену.   -  person ustroetz    schedule 14.03.2013
comment
Это действительно важно, если вы хотите полное решение. Я могу только завести вас так далеко, не зная, как рассчитать цену на основе ваших входных значений.   -  person Simon O'Hanlon    schedule 14.03.2013
comment
Не могли бы вы уточнить, что вы имеете в виду под растром? Это 2D сетка? Вы хотите сохранить значение функции f в зависимости от двух параметров x и y, поэтому вы в основном хотите сохранить f(x,y)? Это можно сделать со словарем.   -  person Dr. Jan-Philip Gehrcke    schedule 14.03.2013


Ответы (1)


Вы можете сделать это довольно легко в R. Я рекомендую вам скачать и установить его (это бесплатно и с открытым исходным кодом). Единственное, что вам нужно будет сделать, это решить, как закодировать вашу функцию цены в R, поэтому я предложил вам опубликовать этот код. После того, как вы определили свой pricefunc, вы можете запустить эти команды из командной строки R.

# Install required packages
install.packages( c("raster" , "spatstat" , "sp" , "rgdal") , dep = TRUE )

# Load required packages
require( raster )
require( spatstat )
require( sp )
require( rgdal )

# Read in your data files (you might have to alter the directory paths here, the R default is to look in your $USERHOME$ directory R uses / not \ to delimit directories
slp <- raster( "slope.tif" )
roads <- readShapeLines( "road.shp" )


# Create point segment pattern from Spatial Lines
distPSP <- as.psp( roads )


#   Create point pattern from slope raster values
slpPPP <- as.ppp( values(slp) )


#   Calculate distances from lines for each cell
distances <- nncross( slpPPP , distPSP )


# Create raster with calcualted distances
rDist <- raster( slp )
values( rDist ) <- distances


# Define your princefunc() here. It should take two input values, slope and distance and return one value, which I have called price
pricefunc <- function( slp , dist ){
    ...my code
        ... more code
    ...more code
    return( price )
}


# Calculate price raster using your price function and save as output.tif
rPrice <- overlay( slp , rDist , fun = function( x , y ){ pricefunc( x , y ) } , filename = "output.tif" ) 
person Simon O'Hanlon    schedule 14.03.2013
comment
Спасибо за ваш подробный пример на R. Однако я хочу сохранить код на Python. Функция стоимости чрезвычайно длинная и не может быть так просто переписана в R. - person ustroetz; 14.03.2013
comment
Так почему же говорят, что решения OpenSource будут работать? Я потратил свое время впустую, если бы работали только решения Python. Однако все функции R можно вызывать с помощью пакета RPy. Возможно, вы захотите взглянуть на него и вызвать эти функции в Python с помощью этого пакета. - person Simon O'Hanlon; 14.03.2013
comment
Под этим я подразумевал OpenSource в Python. Извините за недостаточно конкретную информацию. Я сказал, прежде чем вы опубликовали свой ответ, что функция очень длинная. Так что было очевидно, что я не буду переписывать свою функцию. - person ustroetz; 14.03.2013
comment
было очевидно, что я не буду переписывать свою функцию Не совсем так. Ну что ж. - person Simon O'Hanlon; 14.03.2013