如何使用R创建KML文件

16

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

最好的方法/包是什么?

5个回答

24

查看 rgdal 包中的 writeOGR 函数。这里是一个简单的例子:

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") 

所导出的对象是SpatialPointsDataFrameSpatialLinesDataFrameSpatialPolygonsDataFrame对象,如sp包中定义的那样。

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

使用 KML 驱动程序进行编写时,请注意几何图形应该采用 WGS84 基准的地理坐标。


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

编辑于2022年5月16日:似乎plotKML已经不再在CRAN上了,但您可以从CRAN存档中使用旧版本的软件包。请参阅安装从CRAN删除的软件包

然而,为了方便与同事分享,我发现基于leaflet包的mapview包很有趣。您可以将地图保存为HTML文档,并选择各种背景地图选项;无需Google Earth,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的介绍可以在这里找到


1
plotKML已经从CRAN中移除了,提醒一下 :( - estebangatillo
感谢@estebangatillo提供的有用评论。我对我的答案进行了编辑,希望能够给人们提供使用CRAN存档的替代方案的想法。 - Valentin_Ștefan

1

如果您愿意跳出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,

文件 -> 从文件加载 -> 文件 -> myGeoData.txt 然后, 文件 -> 另存为 -> 文件 -> myGeoData.kml

@rcs的建议关于WGS84也适用于此答案。

祝你好运


1
由于CRAN中已删除了rgdal软件包,因此@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") 

0

如果您或您的同事熟悉QGIS,这是在Google Earth中显示数据的非常好的方法。 QGIS具有将Google Earth显示为底图的功能,然后您可以打开空间数据,它将显示在底图上。当然,这需要您的数据像rcs所说的那样正确投影。

在这里,您需要使用maptools包和Spatial Points包将您的点导出为shape文件:

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文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接