我被转换卡住了。
我有一个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 @将它们提取到一个列表中,但是我迷失在无法提取Geometry“规则”的基础部分。
谢谢你的帮助
罗恩
发布于 2011-06-03 01:24:43
虽然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"是一个字符串。实际上,(在InputForm中) in的内容如下所示:
{{"LayerName" -> "Waypoints",
"Geometry" -> {Point[{-82.5, 32.5, 0}]},
"Labels" -> {}, "LabeledData" -> {},
"ExtendedData" -> {}, "PlacemarkNames" -> {"asheville"},
"Overlays" -> {}, "NetworkLinks" -> {}}}上下文: KML指的是Keyhole标记语言。Keyhole是一家开发工具的公司,在被谷歌收购后,这些工具最终成为了谷歌地球。KMZ是KML的压缩版本。
发布于 2011-06-03 02:45:07
对列昂尼德和马克的答案的一个简化,我相信可以安全地做出是删除了花哨的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-03 01:03:24
给定您的表达式
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}}https://stackoverflow.com/questions/6217584
复制相似问题