【问题标题】:Plot a kml route (exported from marble) onto an openstreetmap将 kml 路线(从大理石导出)绘制到 openstreetmap
【发布时间】:2014-01-29 09:47:00
【问题描述】:

我正在尝试在 R 中绘制路线。.kml 文件来自 Marble,一个虚拟地球应用程序。它看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
<Document>
    <visibility>1</visibility>
    <Folder>
        <name>Route Request</name>
        <visibility>1</visibility>
        <Placemark>
            <name>Bari</name>
            <visibility>1</visibility>
            <ExtendedData>
                <Data name="routingVisited">
                    <value>false</value>
                </Data>
            </ExtendedData>
            <Point>
                <coordinates>16.8511800000,41.1177300000,8.0000000000</coordinates>
            </Point>
        </Placemark>
        <Placemark>
            <name>Trani</name>
            <visibility>1</visibility>
            <ExtendedData>
                <Data name="routingVisited">
                    <value>false</value>
                </Data>
            </ExtendedData>
            <Point>
                <coordinates>16.4153700000,41.2727300000,10.0000000000</coordinates>
            </Point>
        </Placemark>
    </Folder>
        <Document>
        <name>47.1 km (OSRM)</name>
        <visibility>1</visibility>
        <Placemark>
            <name>Route</name>
            <visibility>1</visibility>
            <LineString>
                <coordinates>16.8512040000,41.1174370000 16.8508380000,41.1173690000 16.8504820000,41.1172040000 16.8494450000,41.1164640000 16.8489240000,41.1160100000 16.8488120000,41.1158720000 16.8488340000,41.1158380000 16.8513550000,41.1143390000 16.8521900000,41.1143730000 16.8524160000,41.1143590000 16.8526040000,41.1143640000 16.8526740000,41.1143290000 16.8526970000,41.1142450000 16.8528600000,41.1126580000
…
…

我可以用read.OGR读取文件:

library(rgdal)
> r1 <- "bari-trani.kml"
> kml1 <- readOGR(r1, layer = "Route Request") # start and end
OGR data source with driver: KML 
Source: "bari-trani.kml", layer: "Route Request"
with 2 features and 2 fields
Feature type: wkbPoint with 3 dimensions
> kml2 <- readOGR(r1, layer = "47.1 km (OSRM)") # route information
OGR data source with driver: KML 
Source: "bari-trani.kml", layer: "47.1 km (OSRM)"
with 24 features and 2 fields
Feature type: wkbLineString with 2 dimensions

我还可以绘制路线:

> plot(kml1)
> lines(kml2, col = "red")

我还学习了如何创建地图。我使用Openstreetmap 包:

library(OpenStreetMap)
> topleft <- c(42.08428793301783, 11.9741182832513)
> bottomright <- c(37.49482899208904, 19.1591768770013)
> map <- openmap(topleft, bottomright, type = "osm-bw")
> plot(map)

但是,我无法将路线显示在地图上。在地图之后绘制路线不会显示任何内容。有没有办法做到这一点?

【问题讨论】:

    标签: r kml data-visualization openstreetmap


    【解决方案1】:

    您的map 对象具有以下投影:

    R> map$tiles[[1]]$projection
    CRS arguments:
     +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0
    +k=1.0 +units=m +nadgrids=@null +no_defs 
    

    和边界框:

    R> map$bbox
    $p1
    [1] 1332953 5173614
    $p2
    [1] 2132790 4508306
    

    大部分 OSM,包括主平铺系统,都使用spherical Mercator projection。 请注意,按照规范,KML 仅使用一个投影,EPSG:4326(又名WGS84)。

    您可以使用spTransform(来自包sp/rgdal)重新投影您的数据(未经测试):

    library("sp")
    library("rgdal")
    
    crs <- CRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0
    +k=1.0 +units=m +nadgrids=@null +no_defs")
    spTransform(kml1, crs)
    

    另见here

    【讨论】:

    • 我必须添加“”,但您的答案对我有用:crs &lt;- CRS("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs")。同时我也找到了另一个解决方案,就是改造地图:map &lt;- openproj(openmap(topleft, bottomright, type = "osm-bw"))
    • 哦,我忘了引号...现在修复了
    • @rcs:在最后一行转换原始点后,如何检索新的项目点以绘制它们?
    • spTransform 返回与输入相同的对象类型(SpatialPointsSpatialLines 等)。这些对象可以直接用相应的plot 方法(plot(obj))绘制。可以使用coordinates(obj)提取坐标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多