0

複数のKMLレイヤーを使用してデータを表示するgoogle-earthAPIを使用するウェブがあります。

ユーザーの操作により、目印の表示情報を変更するために、スタイルや名前などの目印のいくつかのプロパティを変更する必要があります。

場合によっては、KMLで指定されているジオメトリAltitudeの情報に含まれている目印の情報を変更したいと思います。Point実際はそうですがclampedToGround、他の要素の上に表示されるように、任意の数に変更したいと思います。

これは、目印情報を変更する方法の例です。

var pm = ge.getElementByUrl(UrlOfLayer#IdOfPlacemark);
pm.setStyleUrl(UrlOfLayer#IdOfStyleMap);
pm.setName(NewName);

これは完全に機能しており、すべての変更が問題なく適用されます。KMLの目印の構造は次のとおりです。

<Placemark id="1">
   <name>Name</name>
   <visibility>1</visibility>
   <open>0</open>
   <Point>
      <extrude>1</extrude>
      <tessellate>1</tessellate>
      <altitude>clampedToGround</altitude>
      <coordinates>1,1,1</coordinates>
   </Point>
   <styleUrl>#style</styleUrl>
</Placemark>

この構造と取得したJavascriptの目印を使用すると、、などgetElementByUrlでフィールド名、可視性などにアクセスできます。ただし、点情報は目印のオブジェクト内に含まれているため、これは機能しません。getName()getVisibility()Geometry

を使用してジオメトリ情報にアクセスできますpm.getGeometry()が、その後、Google Earthのドキュメントにあるように、「ポイント」にアクセスできなくなります。

KmlGeometryオブジェクトは抽象オブジェクトであり、直接使用することはできません。派生したすべてのGeometryオブジェクトのプレースホルダーオブジェクトを提供します。

ポイント情報が使用されているいくつかの例を見ると、ポイントを作成するためにのみ使用され、その後、ジオメトリに含まれていますが、私の場合、座標情報を取得できないため、Javascriptでポイントを作成できません。新しいポイントがそれを上書きします。

それで、この目的を達成するために私が見つけることができなかったアクセサはありますか?

4

1 に答える 1

1

その点については、ドキュメントが少し不明確です。オブジェクトを直接インスタンス化KmlGeometryすることはできないと言ってよいでしょう。実際、オブジェクトにはいくつかのメソッドがあり、[すべてのメンバーのリスト]リンクをクリックするとドキュメントで確認できます(最も関連性の高いメソッドはから継承されます)。KmlGeometryKmlObject

さまざまなジオメトリタイプはすべてから継承されKmlGeometryますが、このジオメトリはであることがわかっているので、KmlPointそれをとして扱うことができますKmlPoint(他の言語では、変数を明示的にキャストする必要があるかもしれませんが、良くも悪くも、Javascriptの方が寛容です) 。あなたの場合、あなたはすることができます

var point = pm.getGeometry();
point.setAltitude(newAltitudeValue);
point.setLatLng(...);

など。すべての通常のKmlPointメソッドを使用できます。

ちなみに、特定のタイプのジオメトリがわからない場合(たとえば、ジオメトリがクリックイベントのターゲットとして返され、何でもかまいません)、getType継承元でいつでも尋ねることができますKmlObject(この場合pm.getGeometry().getType()'KmlPoint')、それからあなたはそれに基づいて行動することができます。完全な反射システムではありませんが、機能します。

補遺: KMLの例には次の行が含まれています

<altitude>clampedToGround</altitude>

これは有効なKMLではありません。あなたがおそらく意味するのは

<altitudeMode>clampToGround</altitudeMode>

Earthは、理解できない要素を破棄します(ただし、バリデーターはこのエラーを表示します)が、clampToGroundとにかくデフォルトのaltitudeModeであるため、この場合は特に重要ではありません。clampToGroundこれは、 「高度の指定を無視することを示す」(ドキュメントによる)ため、高度の変更がドロップされる原因であるため、ポイントは、その高度の値に関係なく、地上レベルに配置されます。

高度を変更できるようにするには、altitudeModeを使用して、またはaltitudeModeとして、フィードしているKMLを変更するかrelativeToGroundabsoluteAPIを使用して高度を変更します。

pm.getGeometry().setAltitudeMode(ge.ALTITUDE_RELATIVE_TO_GROUND);

そうすれば、設定した高度が機能するpm.getGeometry().setAltitude(...)はずです。

于 2012-07-31T21:59:45.507 に答える