2016-03-28 11 views
1

を位置付ける使用してポリゴンを描画する:セシウム - この質問は、これら2に関連しているカメラLAT-ロン-Altキーが

  1. Cesium how to scale a polygon to match Lat-Lon positions while zoom-in/zoom-out
  2. Cesium - using camera to scale a polygon to match Lat-Lon positions while zoom-in/zoom-out

私はlat-取得するには、次の午前のサンプルコードカメラからの緯度経度はgold standard that appears to be baked into the existing camera controllerにあります。このコードでは、カメラの距離からlat-lon-altの位置を取得し、選択した元のlat-lonの位置とほぼ正確な値と地球の表面より上の高さを取得できます。完璧!

すべての例とドキュメントでは、次数から度または点を使用してポリゴンの作成を示しています。

今何ですか?たぶん私は何かが不足しているかもしれませんが、私が考えたのは特定のx、y、z座標を使ってポリゴンを作成できるということでした。そのため、ポリゴンはズームイン、ズームアウト、カメラの動き。これらの値があるので、それらの値でポリゴンを描画する秘密は何ですか? =======================

enter image description here


はFYI、これらは私が現在持っている価値あります==新しい情報が=========================== redPolygonため

コードは動作します:

var redPolygon = viewer.entities.add({ 
    name : 'Red polygon on surface', 
    polygon : { 
     hierarchy : Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0, 
                 -115.0, 32.0, 
                 -102.0, 31.0, 
                 -102.0, 35.0, 
                 -102.0, 35.0]), 
     material : Cesium.Color.RED 
    } 
}); 

viewer.flyTo(redPolygon); 

bluePolygonが動作しないためのコード:

var bluePolygon = viewer.entities.add({ 
    name : 'Blue polygon on surface', 
    polygon : { 
     //hierarchy: collection.latlonalt, 
     hierarchy: Cesium.Cartesian3.fromArray(collection.latlonalt), 
     material : Cesium.Color.BLUE 
    } 
}); 

viewer.flyTo(bluePolygon); 

私はhierarchy: collection.latlonalt,を使用している場合は、私は次のエラーが表示されます

enter image description here

だから私はcollection.latlonaltが私であるhierarchy: Cesium.Cartesian3.fromArray(collection.latlonalt),にコードを変更Cartesian3配列:

enter image description here

しかし何も描かれない。エラーはありません。これは私がコンソールに表示するものである。

enter image description here

ただ、テストのために、私はredPolygonにAZの位置を追加すると、このよう.fromArrayに.fromDegreesArrayを変えてみました:

var redPolygon = viewer.entities.add({ 
    name : 'Red polygon on surface', 
    polygon : { 
     hierarchy : Cesium.Cartesian3.fromArray([-115.0, 37.0, 10.0, 
               -115.0, 32.0, 10.0, 
               -102.0, 31.0, 10.0, 
               -102.0, 35.0, 10.0, 
               -102.0, 35.0, 10.0]), 
     material : Cesium.Color.RED 
    } 
}); 

viewer.flyTo(redPolygon); 

「didnのこといずれかの仕事。

答えて

2

セシウムにはPolygon Demoによって使用されるCartesian3.fromDegreesArrayのようなヘルパー機能がありますが、実際のデカルト3値を手にしているので、これらのヘルパー機能は必要ありません。例えば

、ポリゴンデモコードは次のようになります。上記のコードで

var redPolygon = viewer.entities.add({ 
    name : 'Red polygon on surface', 
    polygon : { 
     hierarchy : Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0, 
                 -115.0, 32.0, 
                 -107.0, 33.0, 
                 -102.0, 31.0, 
                 -102.0, 35.0]), 
     material : Cesium.Color.RED 
    } 
}); 

、この場合fromDegreesArrayはわずか5たくさん/ LAN値のペアのリストを取り、JavaScriptの配列に変換しCartesian3クラスの5つのインスタンスのうちの1つです。この5つのCartesian3の配列は、hierarchyの値としてポリゴン定義に格納されます。実行時にその定義を調べると、オリジナルのlon/lat値は破棄され、ヘルパー関数のおかげで実際のCartesian3に置き換えられます。

あなたのコードでは、ユーザーがここまでクリックしたCartesian3の配列が必要です。これは空の配列として開始され、少なくとも3回のクリックを集め、各クリックを上記の質問に示すようにデカルト3に変換し、配列に値がpushとなるようにする必要があります。配列に3回以上のクリックが蓄積されたら、その配列をポリゴン定義のhierarchyフィールドとして渡すことができます。

このようにして、クリックハンドラがクリックあたりの正確なデカルト位置を収集するための詳細な作業を行っているので、fromDegreesArrayを呼び出すことは避けました。この収集は、カメラがクリック間を移動する場合に、各クリック時に行わなければならない。したがって、「進行中」の配列は、すべてのクリックが集められ、ポリゴンが作成されるまで、クリック間で生き残る必要があります。

EDITここでは、説明しようとしているコード構造の例を示します。実際のクリックハンドラはここでは表示されません。あなたのCartesian3の値が既にマウスクリックから外れているようです。代わりに、ポリゴンを作成するために使用される3つの値を示します。それはhierarchyに割り当てられているとき

var viewer = new Cesium.Viewer('cesiumContainer'); 

// Create an empty array of click positions at the start. 
var clickPositions = []; 

// When the first mouse click is received, convert to Cartesian3, and push it into the array. 
var click1 = new Cesium.Cartesian3(-2155350.2, -4622163.4, 3817393.1); 
clickPositions.push(click1); 

// Later, more mouse clicks are received and pushed into the array. 
var click2 = new Cesium.Cartesian3(-2288079.8, -4906803.1, 3360431.4); 
clickPositions.push(click2); 

var click3 = new Cesium.Cartesian3(-1087466.8, -5116129.4, 3637866.9); 
clickPositions.push(click3); 

// Finally, draw the polygon. 
var redPolygon = viewer.entities.add({ 
    name : 'Red polygon on surface', 
    polygon : { 
     hierarchy : clickPositions, 
     material : Cesium.Color.RED 
    } 
}); 

通告は何もclickPositionsに起こりません。 Cartesian3の値の配列はすでにセシウムが必要とする形になっています。

+0

ねえ、emacky!たぶん私はまだ何か間違っているが、それは描画ではない。 'NEW INFORMATION'の私の編集を参照してください。 – Patricia

+0

こんにちは、私の答えの一番下に新しいコードブロックを追加しました。 – emackey

+0

AWESOME !!!!私は、 "このエラーはほとんどの場合、NaNまたは未定義の値によって引き起こされている"ことを、他のいくつかの答えで見ました。ある時点でポイントを追加する必要があるかどうか疑問に思っていましたが、テストではそれが得られていませんでした。これは完璧です。 – Patricia

関連する問題