我编写了一个 R 脚本来获取一些地图点数据(纬度和经度值)。我能够在 R 中绘制它们并将它们可视化。但现在我想从这些数据生成一个 KML 文件并使用 Google Earth 进行查看。这样我就可以与同事分享,他们也可以在 Google 地球上看到它。
执行此操作的最佳方法/包是什么?
检查
writeOGR
包中的rgdal
功能。这是一个简单的例子:
library("sp")
library("rgdal")
data(meuse)
coordinates(meuse) <- c("x", "y")
proj4string(meuse) <- CRS("+init=epsg:28992")
meuse_ll <- spTransform(meuse, CRS("+proj=longlat +datum=WGS84"))
writeOGR(meuse_ll["zinc"], "meuse.kml", layer="zinc", driver="KML")
导出的对象是
SpatialPointsDataFrame
包中定义的 SpatialLinesDataFrame
、SpatialPolygonsDataFrame
或 sp
对象。
R> class(meuse)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"
对于使用 KML 驱动程序进行写入,请注意几何图形应与基准面 WGS84 处于地理坐标中。
我认为还值得一提的是 plotKML 包。
编辑 2022-05-16:似乎
plotKML
不再出现在 CRAN 上,但您可以使用 CRAN 存档中的 较旧的软件包版本。请参阅安装从 CRAN 中删除的软件包。
但是,为了在同事之间轻松共享,我发现基于 leaflet 包的 mapview 包很有趣。可以将地图另存为 HTML 文档,并提供各种背景地图选项;无需 Google 地球,HTML 地图将在您的浏览器上运行。
一些例子:
library(sp)
library(rgdal)
library(raster)
library(plotKML)
library(mapview)
# A SpatialPointsDataFrame example
data(meuse)
coordinates(meuse) <- ~x+y
proj4string(meuse) <- CRS("+init=epsg:28992") # CRS Amersfoort (Netherlands)
# make a KML file from SpatialPointsDataFrame object
# will get a warning like "Reprojecting to +proj=longlat +datum=WGS84 ..."
# as it is expected to work with geographical coordinates with datum=WGS84,
# but seems that it takes care of the reprojecting.
plotKML::kml(meuse,
file.name = "meuse_cadium.kml",
points_names = meuse$cadmium,
colour = "#FF0000",
alpha = 0.6,
size = 1,
shape = "http://maps.google.com/mapfiles/kml/pal2/icon18.png")
# Or, an easy to make interactive map with mapView()
mapView(meuse)
# A RasterLayer example
data(meuse.grid)
gridded(meuse.grid) <- ~x+y
proj4string(meuse.grid) <- CRS("+init=epsg:28992")
dist_rst <- raster(meuse.grid["dist"])
# make a KML file from RasterLayer object
plotKML::kml(dist_rst,
file.name = "dist_rst.kml",
colour_scale = SAGA_pal[[1]])
# Or, easy to make interactive map with mapView() - display raster and add the points
mapView(dist_rst, legend=TRUE) + meuse
# However, note that for bigger raster datasets mapView() might reduce from resolution
更多示例请参见
plotKML
此处。
对于
mapview
,可以在这里找到介绍。
如果您愿意走出 R,有一个名为 DNRGarmin 的免费程序可以将逗号分隔的文件作为 .txt 并将其转换为 .kml 以导入到 google Earth。
您可以在这里找到它:
http://www.dnr.state.mn.us/mis/gis/tools/arcview/extensions/DNRGarmin/DNRGarmin.html
所以在 R 中:
my.geo.data <- all.my.data[ c("unique.id", "lats", "longs")]
write.csv( my.geo.data, file = "myGeoData.txt")
打开DNRGarmin,
文件 -> 加载自 -> 文件 -> myGeoData.txt 然后, 文件 -> 保存到 -> 文件 -> myGeoData.kml
@rcs 的建议:WGS84 也适用于这个答案。
祝你好运
如果您/您的同事了解 QGIS,这是在 Google Earth 中显示数据的非常好的方法。 QGIS 具有将 Google Earth 显示为底图的功能,然后您可以打开您的空间数据,它将显示在底图上。当然,它需要您的数据按照 rcs 的说法正确投影。
这里您需要使用maptools包和Spatial Points包将点导出为形状文件:
library(maptools)
library(sp)
## define projection
myProjection <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
## your points in format dataframe
coordinates.df <- as.data.frame(MyCoordinates)
## the number of points you have as dataframe
number <- as.data.frame(NumberOfPoints)
## convert points to Spatial Points Dataframe
myPoints.spdf <- SpatialPointsDataFrame(coordinates.df, number, proj4string = CRS(myProjection))
## save shapefile
writeSpatialShape(myPoints.spdf, "MyPointsName")
您的点现在可以在 QGIS 中打开并显示在 Google Earth 中。如果需要,在 QGIS 中,您的数据还可以轻松保存为 kmz 文件。
由于
rgdal
软件包已从 CRAN 中删除,@rcs 提供的答案不再有效。在这种情况下,您可以使用 sf
包,例如
library("sp") #For loading the meuse data
library("sf")
data(meuse)
class(meuse)
#data.frame to sf conversion
meuse <- meuse %>%
st_as_sf(coords=c("x","y"), crs=28992)
#Project it to geograpich coordinate system
meuse_ll <- st_transform(meuse, st_crs("+proj=longlat +datum=WGS84"))
#Write it as kml file
st_write(meuse_ll["zinc"], "meuse.kml", layer="zinc", driver="KML")