4

我被困在转换上。

我有一个带有一些坐标的 KMZ 文件。我读了这样的文件:

m=Import["~/Desktop/locations.kmz","Data"]

我得到这样的东西:

{{LayerName->Point Features,
  Geometry->{
    Point[{-120.934,49.3321,372}],
    Point[{-120.935,49.3275,375}],
    Point[{-120.935,49.323,371}]},
  Labels->{},LabeledData->{},ExtendedData->{},
  PlacemarkNames->{1,2,3},
  Overlays->{},NetworkLinks->{}
}}

我想从每个点中提取 {x,y,z} 以及与这些点关联的地标名称 {1,2,3}。即使我可以从 Geometry->{} 中获取点也可以,因为我可以使用 List@@@ 将它们提取到一个列表中,但是我迷失在无法提取几何的基本部分“规则”。

谢谢你的帮助,

罗恩

4

4 回答 4

5

虽然 Leonid 的回答是正确的,但您可能会发现它不适用于您的代码。原因是您的Import命令的输出包含字符串,例如"LayerNames", 而不是符号,例如LayerNames. 我已将 KML 文件上传到我的网站空间,因此我们可以使用实际Import命令进行尝试。尝试以下操作:

in = Import["http://facstaff.unca.edu/mcmcclur/my.kml", "Data"];
pointList = "Geometry" /.  
    Cases[in, Verbatim[Rule]["Geometry", _], Infinity];
pointList /. Point[stuff_] -> stuff

再次注意,这"Geometry"是一个字符串。其实内容in看起来是这样的(in InputForm):

{{"LayerName" -> "Waypoints", 
  "Geometry" -> {Point[{-82.5, 32.5, 0}]}, 
  "Labels" -> {}, "LabeledData" -> {}, 
  "ExtendedData" -> {}, "PlacemarkNames" -> {"asheville"}, 
  "Overlays" -> {}, "NetworkLinks" -> {}}}

上下文:KML 指的是 Keyhole 标记语言。Keyhole 是一家开发工具的公司,在被谷歌收购后最终成为谷歌地球。KMZ 是 KML 的压缩版本。

于 2011-06-02T17:24:43.297 回答
4

我相信可以安全地简化 Leonid 和 Mark 的答案是删除花哨的Verbatim构造。那是:

Leonid 的第一个操作可以写成:

Join @@ Cases[expr, (Geometry -> x_) :> (x /. Point -> Sequence), Infinity]

列昂尼德的第二次行动:

Join @@ Cases[expr, (PlacemarkNames -> x_) :> x, Infinity]

我在导入 Mark 的数据时遇到了麻烦,但据我猜测,可以这样写:

pointList = Cases[in, ("Geometry" -> x_) :> x, Infinity, 1]

我会让这个答案的投票告诉我我是否正确。

于 2011-06-02T18:45:07.150 回答
3

鉴于你的表情

expr = {{LayerName -> Point Features, 
       Geometry -> {
         Point[{-120.934, 49.3321, 372}], 
         Point[{-120.935, 49.3275, 375}],
         Point[{-120.935, 49.323, 371}]},
     Labels -> {}, LabeledData -> {}, ExtendedData -> {}, 
     PlacemarkNames -> {1, 2, 3}, Overlays -> {}, NetworkLinks -> {}}}

这将提取点:

In[121]:= 
   Flatten[Cases[expr, Verbatim[Rule][Geometry, x_] :> (x /. Point -> Sequence),
        Infinity], 1]

Out[121]= {{-120.934, 49.3321, 372}, {-120.935, 49.3275,375}, {-120.935, 49.323, 371}}

这将提取地标:

In[124]:= Flatten[Cases[expr, Verbatim[Rule][PlacemarkNames, x_] :> x, Infinity], 1]

Out[124]= {1, 2, 3}

这是一个更优雅的方法,利用我们正在寻找的规则,它将提取两者:

In[127]:= 
{Geometry, PlacemarkNames} /.Cases[expr, _Rule, Infinity] /. Point -> Sequence

Out[127]= 
{{{-120.934, 49.3321, 372}, {-120.935, 49.3275,375}, {-120.935, 49.323, 371}}, {1, 2, 3}}
于 2011-06-02T17:03:23.773 回答
0

怎么样Transpose[{"PlacemarkNames", "Geometry"} /. m[[1]]]

于 2011-06-04T02:34:55.497 回答