0

現在、私のアプリケーションには興味深い問題があります。この問題は OpenMap で発生しますが、おそらくサードパーティのライブラリに適用される可能性があります。

この特定の例では、コードで OpenMap ツールを作成し、そのレイヤーを (バックグラウンドで) ロードして、特定のポイントのスクリーンショットを撮る必要があります。

ただし、問題は、OpenMap ライブラリが独自のスレッドを作成してこれらのレイヤーをロードするため、すぐにコードに戻ってスクリーンショットを撮ることであり、ほとんどの場合、スクリーンショットは空または不完全です。

アプリケーションの擬似コードは次のようになります。

check database for layers
load layers using OpenMap
take screenshot of map at point of interest

ある種のスレッド管理が適切であると仮定しましたが、ライブラリがアクセスできない独自のスレッドを使用している場合、これをどのように行うことができますか? また、OpenMap には、これらのスレッドが終了したことを示す戻り値やフラグがありません (私が確認しました)。

助言がありますか?

ありがとうございました

4

3 に答える 3

1

レイヤーは OpenMap 用に作成できるため、投影クエリに応答して java.awt.Graphics オブジェクトにレンダリングできます。OMGraphicHandler レイヤーを拡張し、prepare() メソッドをオーバーライドして、Layer に設定されたプロジェクションの OMGraphicList を返すようにします。Layer.renderDataForProjection() を呼び出すと、prepare で返された OMGraphicList がレンダリングされます。

com.bbn.openmap.image.ImageServer は、レイヤーの画像の作成を管理するために使用するのに適したオブジェクトです。

于 2010-01-21T02:42:48.593 に答える
1

OpenMap はわかりませんが、サードパーティのライブラリに何らかのコールバックを登録するのが通常の方法です。Java では、インターフェイスを実装し、API メソッドを呼び出すオブジェクトでリスナーとして登録することを意味します。ライブラリの内部スレッド処理については、(ほとんど?) 知る必要はありません (または知る必要はありません)。

于 2010-01-20T17:36:18.173 に答える
1

MapBean が画像の生成を完了する前に、サードパーティの jpeg エクストラクタが画像をプルするという同じ問題がありました。後で呼び出しに関するヒントに従い、レイヤー処理コードとグラフィック コードへのエクスポートの間に次のコードを追加しました。


//...OpenMap editing code stops here ...

final Runnable doWaitUntilTheMapBeanIsFinishedRendering = new Runnable() {
   public void run()
   {
       System.out.println("Ding, fries are done!");
   } 
};

try
{
    SwingUtilities.invokeAndWait( doWaitUntilTheMapBeanIsFinishedRendering );
}
catch( Exception e )
{
    e.printStackTrace();
}

byte[] image = JPEGImageFormatter.getImageFromMapBean( mapbean );
于 2011-10-26T00:49:51.550 に答える