如何使用R创建KML文件

时间:2011-10-18 20:16:49

标签: r kml

我编写了一个R脚本来获取一些地图点数据(纬度和经度值)。我可以在R中绘制它们并将它们可视化。但现在我想使用Google地球从这些数据和视图生成KML文件。这样我就可以与同事分享,他们也可以在Google Earth上看到它。

执行此操作的最佳方法/程序包是什么?

4 个答案:

答案 0 :(得分:18)

检查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包中定义的SpatialLinesDataFrameSpatialPolygonsDataFramesp个对象。

R> class(meuse)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"

对于使用KML驱动程序进行书写,请注意几何应位于具有基准WGS84的地理坐标中。

答案 1 :(得分:5)

我认为值得一提的是plotKML包。

然而,为了便于在同事之间分享,我发现基于mapview包的leaflet包很有意思。可以将地图保存为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 here的更多示例,以及教程here。对于mapview,可以找到简介here

答案 2 :(得分:0)

如果您愿意走出R,有一个名为DNRGarmin的免费程序可以将逗号分隔的文件作为.txt并将其转换为.kml以导入到Google地球。

你可以在这里找到它:

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,

档案 - &gt;加载 - &gt;档案 - &gt; myGeoData.txt然后, 档案 - &gt;保存到 - &gt;档案 - &gt; myGeoData.kml

@ rcs的建议:WGS84也适用于这个答案。

祝你好运

答案 3 :(得分:0)

如果您/您的同事了解QGIS,这是在Google地球中显示数据的一种非常好的方式。 QGIS具有将Google地球显示为基本地图的功能,然后您可以打开空间数据,它将显示在基本地图上。当然,正如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地球中。在QGIS中,如有必要,您的数据也可以轻松保存为kmz文件。