开发者

Processing KMZ in Mathematica

开发者 https://www.devze.com 2023-03-10 04:46 出处:网络
I\'m stuck on a conversion. I have a KMZ file with some coordinates.I read the file like this: m=Import[\"~/Desktop/locations.kmz\",\"Data\"]

I'm stuck on a conversion.

I have a KMZ file with some coordinates. I read the file like this:

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

I get something like this:

{{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->{}
}}

I want to extract the {x,y,z} from each of the points and also the placemark names {1,2,3} associated with the points. Even if I can just get the points out of Geometry->{} that would be fine because I can extract them into a list with List@@@, but I'm lost开发者_如何学编程 at the fundamental part where I can't extract the Geometry "Rule".

Thanks for any help,

Ron


While Leonid's answer is correct, you will likely find that it does not work with your code. The reason is that the output of your Import command contains strings, such as "LayerNames", rather than symbols, such as LayerNames. I've uploaded a KML file to my webspace so we can try this using an actual Import command. Try something like the following:

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

Again, note that "Geometry" is a string. In fact, the contents of in look like so (in InputForm):

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

Context: KML refers to Keyhole Markup Language. Keyhole was a company that developed tools that ultimately became Google Earth, after they were acquired by Google. KMZ is a zipped version of KML.


A simplification to Leonid and Mark's answers that I believe can be made safely is to remove the fancy Verbatim construct. That is:

Leonid's first operation can be written:

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

Leonid's second operation:

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

I had trouble importing Mark's data, but from what I can guess, one could write:

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

I'll let the votes on this answer tell me if I am correct.


Given your expression

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 -> {}}}

This will extract the points:

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}}

And this will extract the placemarks:

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

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

Here is a more elegant method exploiting that we are looking for rules, that will extract both:

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}}


How about Transpose[{"PlacemarkNames", "Geometry"} /. m[[1]]] ?

0

精彩评论

暂无评论...
验证码 换一张
取 消