首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Mathematica中处理KMZ

在Mathematica中处理KMZ
EN

Stack Overflow用户
提问于 2011-06-03 00:52:29
回答 4查看 794关注 0票数 4

我被转换卡住了。

我有一个KMZ文件,里面有一些坐标。我是这样读这个文件的:

代码语言:javascript
复制
m=Import["~/Desktop/locations.kmz","Data"]

我得到的东西是这样的:

代码语言:javascript
复制
{{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 @将它们提取到一个列表中,但是我迷失在无法提取Geometry“规则”的基础部分。

谢谢你的帮助

罗恩

EN

回答 4

Stack Overflow用户

发布于 2011-06-03 01:24:43

虽然Leonid的答案是正确的,但您可能会发现它不适用于您的代码。原因是Import命令的输出包含字符串,如"LayerNames",而不是符号,如LayerNames。我已经上传了一个KML文件到我的网站空间,所以我们可以尝试使用一个实际的Import命令。尝试如下所示:

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

同样,请注意"Geometry"是一个字符串。实际上,(在InputForm中) in的内容如下所示:

代码语言:javascript
复制
{{"LayerName" -> "Waypoints", 
  "Geometry" -> {Point[{-82.5, 32.5, 0}]}, 
  "Labels" -> {}, "LabeledData" -> {}, 
  "ExtendedData" -> {}, "PlacemarkNames" -> {"asheville"}, 
  "Overlays" -> {}, "NetworkLinks" -> {}}}

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

票数 5
EN

Stack Overflow用户

发布于 2011-06-03 02:45:07

对列昂尼德和马克的答案的一个简化,我相信可以安全地做出是删除了花哨的Verbatim构造。这就是:

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

代码语言:javascript
复制
Join @@ Cases[expr, (Geometry -> x_) :> (x /. Point -> Sequence), Infinity]

莱昂尼德的第二个操作:

代码语言:javascript
复制
Join @@ Cases[expr, (PlacemarkNames -> x_) :> x, Infinity]

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

代码语言:javascript
复制
pointList = Cases[in, ("Geometry" -> x_) :> x, Infinity, 1]

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

票数 4
EN

Stack Overflow用户

发布于 2011-06-03 01:03:24

给定您的表达式

代码语言:javascript
复制
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 -> {}}}

这将提取这些点:

代码语言:javascript
复制
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}}

这将提取地标:

代码语言:javascript
复制
In[124]:= Flatten[Cases[expr, Verbatim[Rule][PlacemarkNames, x_] :> x, Infinity], 1]

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

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

代码语言:javascript
复制
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}}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6217584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档