从.kml文件创建R的x和y距离坐标

时间:2011-10-26 18:32:17

标签: r gis kml

我想使用.kml轨道文件来制作一组x,y坐标,以便在R中使用。

我现在拥有的是GoogleEarth音轨,我相信它是一个LineString。我听说rgdal package通常是人们使用的,但它不适用于Mac版本的R.如果可能,我想在Mac上执行此操作,我会在其余的分析中执行此操作。如果有必要,我可以使用Windows在R64上进行转换,然后将坐标带到我的Mac上,但这似乎......笨重。

.kml代码的开头如下所示:

    <?xml version="1.0" encoding="UTF-8"?>  
<kml xmlns="http://www.opengis.net/kml/2.2"  
xmlns:gx="http://www.google.com/kml/ext/2.2"  xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
    <Document>  
    <name>Perimeter_Track.kml</name>
<Placemark>
    <name>ACTIVE LOG</name>
    <LineString>
        <coordinates>
            -157.80736808,21.4323436,20.324951171875  

我想将它转换为距我地图中某个点的公里的x,y坐标。成品将是水体的线轮廓,其上覆盖有物种丰度数据。

我已经尝试了几种方法:
1.将.kml文件转换为.csv并使用read.csv将其导入r;
2.使用getKMLcoordinates包中的maptools导入坐标。

(1)的问题是,当我尝试将.kml coords转换为csv时,我在转换器程序(kmlcsv)中出现错误,表示无法读取文件(我不知道为什么 - 错误日志不可用)。

当我尝试(2)时,我得到奇怪排列的坐标 spa<-getKMLcoordinates("Perimeter_Track.kml", ignoreAltitude=TRUE)
summary(spa)
返回:

 Length Class  Mode   
     

[1,] 128 -none- numeric

     

[2,] 242 -none- numeric

     

[3,] 34 -none- numeric

     

[4,] 126 -none- numeric

我认为这是因为.kml文件实际上是四个独立的轨道,由小间隙隔开(即,它们将GPS关闭一小段时间,然后再次启动)。我是否需要单独导入这些以获得整体形状?如果是这样,我该怎么做?

我希望最终能够在x乘以y km的网格上获得此形状,其中坐标以km为单位而不是GPS coords。如果有人对如何做到这一点有任何见解,我很乐意听取您的意见! 非常感谢提前。

2 个答案:

答案 0 :(得分:3)

即使预编译的软件包不可用,您仍然可以在mac上安装rgdal来源,如下所示:

  1. http://www.kyngchaos.com/software/frameworks安装“GDAL complete”框架。

  2. 将刚刚安装的程序的位置添加到unix路径中。在mac终端中,执行:

    PATH=/Library/Frameworks/GDAL.framework/unix/bin:/Library/Frameworks/PROJ.framework/unix/bin$PATH
    
  3. http://cran.r-project.org/web/packages/rgdal/index.html从CRAN下载rgdal软件包的来源。

  4. 打开R并构建/安装rgdal包。请注意,我们必须为刚刚安装的部分内容指定位置。

    install.packages('~/Downloads/rgdal_0.7-1.tar.gz', repos=NULL, type='source', configure.args=c('--with-proj-include=/Library/Frameworks/PROJ.framework/unix/include', '--with-proj-lib=/Library/Frameworks/PROJ.framework/unix/lib'))
    
  5. 这在我的Mac OS X 10.6上安装得很好。祝你好运!


    因此,您的数据的基本概念可能是:

    library(rgdal)
    library(maptools)
    
    # Load KML coordinates
    coords = getKMLcoordinates('data.kml')
    coords = SpatialPoints(coords, CRS('+proj=longlat'))
    
    # Load US Maps (get from www.gadm.org)
    load('USA_adm1.RData') 
    hawaii = gadm[gadm$NAME_1 == 'Hawaii', ]
    
    # Transform coordinates
    hawaii.proj = spTransform(hawaii, CRS=CRS('+init=epsg:2784 +units=km'))
    coords.proj = spTransform(coords, CRS=CRS('+init=epsg:2784 +units=km'))
    
    # Plot
    dev.new(width=4, height=4)
    plot(hawaii.proj, axes=T, xlim=c(450,550), ylim=c(0,60))
    points(coords.proj, pch=16, col='red')
    

    enter image description here

    生活的好地方!

答案 1 :(得分:1)

使用rgdal中的readOGR读取某个“sp”类对象(可能是这里的SpatialLinesDataFrame)后,可以使用spTransform函数将其从lat-long转换为笛卡尔系统。

将其转换为哪个系统取决于它在地球上的位置。有一堆标准变换依赖于称为“UTM”区域的经度(Universal Transverse Mercator)。只需查看经度区域,找到EPSG代码,然后启动spTransform。

对于英国,有一个名为Ordnance Survey Grid的标准网格系统,其EPSG代码为27700.因此,为了将lat-long(EPSG:4326)中的某些内容转换为OSGB仪表,我这样做:

mapOS = spTransform(mapLL,CRS=CRS("+init=epsg:27700"))

spTransform的帮助中有很多例子。

请注意,只有当您的数据位于地球的一小部分时,这才是最好的...