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@@@ を使用してリストに抽出できるので問題ありませんが、Geometry を抽出できない基本的な部分で迷っています。 "ルール"。

助けてくれてありがとう、

ロン

4

4 に答える 4

5

Leonidの答えは正しいですが、コードでは機能しないことがわかるでしょう。その理由は、Importコマンドの出力に"LayerNames"、などの記号ではなく、などの文字列が含まれているためですLayerNamesImportKMLファイルをウェブスペースにアップロードしたので、実際のコマンドを使用してこれを試すことができます。次のようなものを試してください。

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はKeyholeMarkupLanguageを指します。Keyholeは、Googleに買収された後、最終的にGoogleEarthになるツールを開発した会社でした。KMZはKMLのzipバージョンです。

于 2011-06-02T17:24:43.297 に答える
4

安全に作成できると私が信じているレオニードとマークの答えを単純化することは、派手なVerbatim構成を削除することです。あれは:

しし座流星群の最初の操作は次のように書くことができます。

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

しし座流星群の2番目の操作:

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 に答える