看来R中的光栅包不区分GeoTIFF的正旋转和负旋转.我感觉这是因为R忽略了旋转矩阵中的负号.我不够精通,无法深入挖掘raster源代码进行验证,但我确实创建了一个可重现的示例来演示问题:
阅读R徽标并另存为GeoTIFF.
library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
proj4string(b) <- crs("+init=epsg:32616")
writeRaster(b, "R.tif")
Run Code Online (Sandbox Code Playgroud)
使用Python向tiff添加旋转
import sys
from osgeo import gdal
from osgeo import osr
import numpy as np
from math import *
def array2TIFF(inputArray,gdalData,datatype,angle,noData,outputTIFF):
# this script takes a numpy array and saves it to a geotiff
# given a gdal.Dataset object describing the spatial atributes of the data set
# the array datatype (as a gdal object) and the name of the output raster, and rotation …Run Code Online (Sandbox Code Playgroud) 我想在R中做一个小程序,用于交互式可视化和修改一些栅格数据集,看作彩色图像.用户应该打开一个文件(从终端可以),绘制它,用鼠标点击选择要编辑的点,然后插入新值.
到目前为止,我很容易实现.我使用包中的plot()函数raster来显示图,然后click()选择点并通过终端编辑它们的值.
我想添加在鼠标上显示值的功能.我已经搜索了如何做到这一点的方法,但这似乎不适用于标准的R包.它是否正确?
在这种情况下,我可能被迫使用外部包,例如gGobi,iPlots,Shiny或Plotly.但是,我更喜欢KISS并且只使用"标准"图形工具,例如栅格plot()函数或格子图形对象(例如来自rasterVis).
我理解一个Shiny应用程序可能是最好的,但它需要大量的时间来学习和完善.
是否有一种直接的方法将多边形SpatVector类对象(来自terra库)转换为简单特征或SpatialPolygonsDataFrames?
以前我正在使用raster::crop和raster::mask使用Spatial*类的shapefile,读入使用rgal::readOGR.
我只是"升级"我的脚本sf用于阅读和操作多边形.
raster::crop期望'范围'对象作为第二个参数.到目前为止,这是从Spatial*对象中自动提取的.所以我可以做到raster::crop(raster, polygon).
为了使用一个sf对象,我可以称之为raster::crop(raster, as.vector(st_bbox(polygon)))一个丑陋的解决方法.
由于raster::mask显然期望Raster* object or a Spatial* object唯一的解决方案是使用将sf对象强制回空间*对象as("Spatial").
我假设这个问题推广到所有raster函数?我是否忽略了某些东西,或者只是raster包裹没有(还)与sf对象一起工作?
在R中,我们可以将a raster转换为SpatialLinesDataFrame具有以下功能rasterToCountour:
library(raster)
f <- system.file("external/test.grd", package="raster")
r <- raster(f)
x <- rasterToContour(r)
class(x)
[1] "SpatialLinesDataFrame"
attr(,"package")
[1] "sp"
spplot(x)
Run Code Online (Sandbox Code Playgroud)
contourToRaster?我们可以简单地获取与沿着线的每个点相关联的字段值,但是我正在寻找在线之间插值并在定义的域上产生完整栅格的更通用的东西.
我试图缩减使用的方法在气候条件本文章使用R软件.我几乎在那里,但我错过了几个步骤
在本例中,我将一些数据上传到archive.org网站,以加载本例中使用的所需包和数据,使用以下代码:
library(raster)
library(rgdal)
download.file("https://archive.org/download/Downscaling/BatPatagonia.rds", "Bat.rds")
download.file("https://archive.org/download/Downscaling/TempMinPatNow.rds", "Tmin.rds")
BatPatagonia <- readRDS("Bat.rds")
TempMinPatNow <- readRDS("Tmin.rds")
Run Code Online (Sandbox Code Playgroud)
BatPatagonia是一个栅格文件,其中Bathymetry和从GEBCO数据集中提取和转换的区域的高度,而TempMinPatNow是从worldclim中提取的1月相同区域的最低温度.下面是数据集的图:
为了从过去的冰川最大值下调过去的数据,我需要模拟当前的气候如果海平面与过去相同的情况.为了做到这一点,我使用GEBCO数据,并且或多或少地弄清楚海岸是什么.根据上面引用的文章中的方法,这是前面的三个步骤:
第3点是我一直在努力做的事情,我将展示我如何做到前2点,并展示我一直在寻找的尝试解决第3点的问题
为了做到这一点,我采用了BatPatagonia栅格,并使用以下代码将所有超过20米的值替换为NA值:
Elev20 <- BatPatagonia
values(Elev20) <- ifelse(values(Elev20) <= 20, NA, values(Elev20))
Run Code Online (Sandbox Code Playgroud)
生成的栅格如下图所示
根据第2591页的手稿,下一步是在移动窗口中使用以下公式对超过20米的高度进行多元线性回归:
我们已经有高程数据,但我们还需要纬度和经度的栅格,为此我们使用以下代码,首先创建纬度和经度栅格:
Latitud <- BatPatagonia
Longitud <- BatPatagonia
data_matrix <- raster::xyFromCell(BatPatagonia, 1:ncell(BatPatagonia))
values(Latitud) <- data_matrix[, 2]
values(Longitud) <- data_matrix[, 1]
Run Code Online (Sandbox Code Playgroud)
我们将乘以高度超过20米的区域的光栅掩模,这样我们只得到我们需要的值:
Elev20Mask <- BatPatagonia
values(Elev20Mask) <- ifelse(values(Elev20Mask) <= 20, NA, 1)
Longitud <- Elev20Mask*Longitud
Latitud <- Elev20Mask*Latitud
Run Code Online (Sandbox Code Playgroud)
现在我将使用响应变量和预测变量构建一个堆栈:
Preds <- …Run Code Online (Sandbox Code Playgroud) 我正在使用光栅功能,如下面的行所示.我的最后一行产生了一些输出.该输出有一条线说dimensions : 240, 320, 76800 (nrow, ncol, ncell).我想重新打印该图片,但只说前200行和前300列.我怎样才能做到这一点?下面的第二行显示整个图像
f <- "pictures/image1-1421787394.jpeg"
f
r <- raster(f)
plot(r);
r
Run Code Online (Sandbox Code Playgroud)
============================= UPDATE1
我做png(filename = '~/x.png');par(mar=rep(0, 4), xpd = TRUE, oma=rep(0, 4),bty='n') ; plot(r,xlim=c(0,200),ylim=c(0,200),legend=FALSE,axes=FALSE); dev.off()了保存裁剪的图像.我能够摆脱传说,轴和黑匣子.但问题是保存的图像包含的不仅仅是裁剪部分 - 例如图像周围的白色部分.我只想保存原件的裁剪部分(保持图像尺寸200*200像素).请让我知道怎么做?
此外,如何在原始图像中添加与上述裁剪部分对应的红色方块?我的意思是我想在原始图像的顶部获得一个红色正方形(仅边缘),然后将其(原始图像+正方形)保存为新图像.
我怎么能这样做?
UPDATE2 ++++++++++++++++++++++++++++++++++++++++++++++++
添加可重复的示例来显示我的意思是白色背景
下面的最后一行绘制了裁剪图像.我希望该图像为100*100,因为我的xlim和ylim是100.但我看到白色背景,如下例所示.(你看不到背景.但如果你在你的机器上运行代码并打开图像,你会看到它)
library(raster)
r <- raster(nrow=240, ncol=320)
values(r) <- 1:ncell(r)
plot(r)
plot(r,xlim=c(0,100),ylim=c(0,100),legend=FALSE,axes=FALSE,frame.plot=F)
Run Code Online (Sandbox Code Playgroud)

有没有办法过滤掉那些不属于主路径的部分?正如您在图片中看到的,我想在保留主要路径的同时删除划掉的部分。我已经尝试使用动物园/滚动中位数但没有成功。我以为我可以使用某种内核来完成这项任务,但我不确定。我还尝试了不同的平滑方法/功能,但这些并没有提供理想的结果,而是让事情变得更糟。数据中的 dist 值可以忽略。
一种方法可能是:
所以我的寻路算法所犯的错误是“前进”然后以同样的方式返回。这种情况我试图识别和过滤掉。
path<-structure(list(counter = 1:100, lon = c(11.83000844, 11.82986091,
11.82975536, 11.82968137, 11.82966589, 11.83364579, 11.83346388,
11.83479848, 11.83630055, 11.84026754, 11.84215965, 11.84530872,
11.85369492, 11.85449806, 11.85479096, 11.85888555, 11.85908087,
11.86262424, 11.86715538, 11.86814045, 11.86844252, 11.87138302,
11.87579809, 11.87736704, 11.87819829, 11.88358436, 11.88923677,
11.89024638, 11.89091832, 11.90027148, 11.9027736, 11.90408114,
11.9063466, 11.9068819, 11.90833199, 11.91121547, 11.91204623,
11.91386018, 11.91657306, 11.91708085, 11.91761264, 11.91204623,
11.90833199, 11.90739525, 11.90583785, 11.904688, 11.90191917,
11.90143671, 11.90027148, 11.89806126, 11.89694917, 11.89249712,
11.88750445, 11.88720159, 11.88532786, 11.87757307, 11.87681905,
11.86930751, 11.86872102, 11.8676844, 11.86696599, 11.86569006,
11.85307297, 11.85078596, …Run Code Online (Sandbox Code Playgroud) 在将光栅的值提取到点时,我发现我有几个NA,而不是使用函数的参数buffer和fun参数extract,而是我想将最近的非NA像素提取到重叠的点NA.
我正在使用基本提取功能:
data.extr<-extract(loc.thr, data[,11:10])
Run Code Online (Sandbox Code Playgroud) 问题
我试图用包nfc,pgirmess,SpatialPack和spdep来计算空间相关图.但是,我很难定义距离的起点和终点.我只对较小距离的空间自相关感兴趣,但有较小的箱子.此外,由于光栅非常大(1.8百万像素),我遇到了这些软件包的内存问题,但是SpatialPack.
所以我尝试使用包栅格中的Moran函数生成我自己的代码.但我必须有一些错误,因为完整数据集的结果与其他包中的结果略有不同.如果我的代码中没有错误,它至少可以帮助其他类似问题的人.
题
我不确定,我的焦点矩阵是否错误.你能否告诉我中心像素是否需要合并?使用testdata我无法显示方法之间的差异,但在我的完整数据集中,可见差异,如下图所示.但是,箱子并不完全相同(50米对69米),所以这可以解释部分差异.然而,在第一个箱子里,这个解释似乎对我来说似乎不合理.或者我的光栅的不规则形状,以及处理NA的不同方式会导致差异吗?
测试数据
计算测试数据的代码取自http://www.petrkeil.com/?p=1050#comment-416317
# packages used for the data generation
library(raster)
library(vegan) # will be used for PCNM
# empty matrix and spatial coordinates of its cells
side=30
my.mat <- matrix(NA, nrow=side, ncol=side)
x.coord <- rep(1:side, each=side)*5
y.coord <- rep(1:side, times=side)*5
xy <- data.frame(x.coord, y.coord)
# all paiwise euclidean distances between the cells
xy.dist <- dist(xy)
# PCNM axes of the dist. matrix (from 'vegan' package)
pcnm.axes <- pcnm(xy.dist)$vectors
# using 8th …Run Code Online (Sandbox Code Playgroud) r ×10
r-raster ×10
r-sf ×2
raster ×2
data.table ×1
geotiff ×1
image ×1
interactive ×1
mouseover ×1
pde ×1
plot ×1
r-sp ×1
spatial ×1
spatialpack ×1
tidyr ×1