地図データを読み取り、表現し、レンダリングする最良の方法は何ですか?
質問
ペットプロジェクトとして単純なナビゲーションアプリケーションを作成することに興味があります。無料の地図データを検索した後、米国国勢調査局に決定しました。 TIGER 2007 Line / Shapefileマップデータ。データは個々の郡のzipファイルに分割され、私の地域の単一の郡のマップデータをダウンロードしました。
このマップデータを使用可能な形式に読み込む最良の方法は何ですか?
方法:
- これらのファイルを読み込む
- 解析-正規表現またはこれらのシェープファイルを既に解析できるライブラリ?
- データをアプリケーションにロードする-ポイントをメモリ内のデータ構造に直接ロードする必要がありますか?小さなデータベースを使用しますか?地図データのアプリケーションを閉じたら、永続化する必要はありません。ユーザーはシェープファイルを再度ロードできます。
シェープファイルデータを読み取った後、マップをレンダリングする最良の方法は何ですか?
理想的には、郡のマップデータシェープファイルを読み取り、すべてのポリラインを画面にレンダリングし、回転とスケーリングを許可したいです。
方法:
- 緯度/経度ポイントをスクリーン座標に変換しますか? -私が知る限り、Shapefileはそのポイントに経度と緯度を使用します。したがって、明らかに、これらを何らかの方法でスクリーン座標に変換して、マップフィーチャーを表示する必要があります。
- マップデータ(道路、境界などの一連のポリライン)を、マップ全体を簡単に回転およびスケーリングできるようにレンダリングしますか?
- マップ全体を一連の「タイル」としてレンダリングします。表示領域内のフィーチャ/ラインのみがレンダリングされますか?
例表示マップとしてレンダリングされたTIGERデータの一部:
これらのファイルを読む最良の方法、プログラムでそれらを表す方法(データベース、メモリデータ構造)、および(回転/スケーリングを使用して)レンダリングする方法に関する経験と洞察力のある人画面上の地図データをいただければ幸いです。
編集:明確にするために、GoogleまたはYahooマップAPIを使用したくありません。同様に、OpenStreetMapを使用したくありません。これらのAPI /プログラムを利用するよりも、ゼロからのアプローチを探しています。これは、デスクトップアプリケーションになります。
解決
まず、 2008 TIGERファイル。
第二に、他の人が指摘しているように、すでにデータを読み込んで解釈し、変換し、使用しているプロジェクトがたくさんあります。ただし、このデータ用に独自のパーサーを作成することはほとんど簡単なので、プロジェクト全体を使用する予定がない限り、別のプロジェクトのコードを調べて必要なものを抽出しようとする理由はありません。
下位レベルから開始する場合
解析
独自のTIGERパーサーの構築(非常に簡単-線分だけのDB)、およびその上に単純なレンダリング(線、ポリゴン、文字/名前)の構築もかなり簡単になります。さまざまな地図投影タイプをご覧ください。レンダリング段階。最も頻繁に使用される(したがってユーザーに最も馴染みのある)のは、メルカトル図法-かなりシンプルで高速です。他の投影法をサポートして遊ぶこともできます。
これは、地図を投影する方法、およびその投影を逆にする方法(ユーザーが地図をクリックした場合、クリックした緯度/経度を表示したい-反転が必要)現在の投影方程式)。
レンダリング
レンダラーを開発したとき、ウィンドウのサイズを固定サイズ(埋め込みデバイス)、固定倍率に決定することにしました。これは、特定の倍率で地図を緯度/経度で中央に配置し、中心ピクセル=中心緯度/経度で配置し、メルカトル図法を使用して、どのピクセルが各緯度/経度を表すかを計算できることを意味しました。
代わりにウィンドウを変更できるプログラムもあり、倍率と固定点を使用する代わりに、2つの固定点(多くの場合、ウィンドウを定義する長方形の左上隅と右下隅)を使用します。この場合、ピクセルの緯度/経度転送を決定するのは簡単になります-これはほんの数回の補間計算です。回転とスケーリングにより、この伝達関数はもう少し複雑になりますが、それほど複雑になるべきではありません-補間のある長方形のウィンドウですが、ウィンドウのコーナーは北に対して特定の方向にある必要はありません。これにより、いくつかのコーナーケースが追加されます(たとえば、マップを裏返しにして、地球の内側から見たように表示できます)が、これらは面倒ではなく、作業中に対処できます。
緯度/経度からピクセルへの転送が完了すると、通常のグラフィックスの問題(ラインまたはポリゴンの不適切な重なり、アンチエイリアスなど)を除き、ラインとポリゴンのレンダリングは非常に簡単です。しかし、多くのオープンソースレンダラーによって行われるような基本的ないマップのレンダリングは、かなり簡単です。
距離と大円の計算を行うこともできます。たとえば、赤道での緯度または経度はすべて約111.1KMですが、どちらかに近づくと変化します。もう一方は111.1kMのままです。
ストレージと構造
ただし、データを保存および参照する方法は、データをどのように使用するかによって大きく異なります。人口統計とルーティングに同じデータベース構造を使用する場合、多くの困難な問題が発生します。特定のデータベース構造とインデックス作成は、一方が高速で他方が低速です。
郵便番号を使用し、近くの郵便番号のみを読み込むことは、小さな地図レンダリングプロジェクトでは機能しますが、国を横断するルートが必要な場合は、別の構造が必要です。一部の実装には、主要道路のみを含み、ルートをスナップする「オーバーレイ」データベースがありますオーバーレイ(または複数のオーバーレイ-ローカル、メトロ、郡、州、国)これにより、高速になりますが、ルーティングが非効率になる場合があります。
タイリング
地図のタイル張りは実際には簡単ではありません。低倍率では、マップ全体をレンダリングして切り取ることができます。より高い倍率では、(メモリ/スペースの制約のため)全体を一度にレンダリングできないため、スライスする必要があります。
個々のタイルをレンダリングできるようにタイルの境界でラインを切断すると、完全な結果が得られません-多くの場合、ラインはタイルの境界を超えてレンダリングされます(または、少なくとも、行末のデータは保持されますが、レンダリング端から落ちたことが検出されると停止します)-これにより、タイルを移動するときに完全に一致しないように見えるラインで発生するエラーが減少します。
この問題に取り組むと、私が話していることがわかります。
特定のタイルに入るデータを見つけることも簡単ではありません-ラインは両端が特定のタイルの外側にあるが、タイルを横切って移動する場合があります。これについてはグラフィックスの本を参照する必要があります( Michael Abrashの本は独創的なリファレンスです、無料で入手できます前のリンクで)。主にゲームについて説明していますが、ウィンドウ、クリッピング、ポリゴンエッジ、衝突などはすべてここに適用されます。
ただし、より高いレベルでプレイしたい場合があります。
上記の作業が完了したら(既存のプロジェクトを適応させるか、上記の作業を自分で行う)、他のシナリオやアルゴリズムを試してみることもできます。
逆ジオコーディングは比較的簡単です。緯度/経度を入力(または地図をクリック)して、最も近い住所を取得します。これにより、TIGERデータのラインセグメントに沿ったアドレスの解釈方法がわかります。
基本的なジオコーディングは難しい問題です。アドレスパーサーの作成は便利で興味深いプロジェクトであり、TIGERデータを使用してそれをlat / lonに変換するのは簡単ではありませんが、とても楽しいです。正確な名前と形式の一致を要求することにより、シンプルで小さなものから始めて、「いいね」の一致と音声の一致を調べ始めます。この分野では多くの研究が行われています-検索エンジンプロジェクトをご覧ください。
2点間の最短経路を見つけることは簡単な問題です。それを行うためのアルゴリズムは数多くあり、そのほとんどが特許取得済みです。独自のデザインの簡単なアルゴリズムでこれを試してみてから、いくつかの調査を行い、デザインを最新技術と比較することをお勧めします。グラフ理論に興味があるなら、とても楽しいです。
パスをたどり、先制的に指示を与えるは、最初の赤面に見えるほど簡単ではありません。 lat / lonペアの関連付けられた一連の指示が与えられたら、外部入力(GPS、またはシミュレートされたGPS)を使用してルートを「追跡」し、各実際の交差点に近づくときにユーザーに指示を与えるアルゴリズムを開発します。道路の曲がりなどにより、指示よりも緯度/経度のペアが多いことに注意してください。また、進行方向などを検出する必要があります。実装を試みるまで表示されない多くのコーナーケース。
興味のある場所の検索。これは面白いです。起源の特定の距離(カラスが飛ぶように、またはより難しい-走行距離)。これは、POIデータベースをこの状況で簡単に検索できる形式に変換する必要があるという点で興味深いものです。時間をかけて何百万ものエントリを調べ、距離計算(sqrt(x ^ 2 + y ^ 2))を行い、結果を返すことはできません。最初にデータ量を削減する方法またはアルゴリズムが必要です。
旅行中のセールスマン。複数の宛先を持つルーティング
他のヒント
SharpMap は、WinFormsおよびASP.NET用のオープンソースの.NET 2.0マッピングエンジンです。これにより、必要なすべての機能が提供されます。 ESRIシェープファイルを含む、最も一般的なGISベクターおよびラスターデータ形式を扱います。
解決策は:
- mapserver、geoserver、degreeなどの地理空間サーバー(オープンソース)。
シェープファイル(および他の多くのもの)を読み取って提供できます。たとえば、ジオサーバー(インストール時)は、米国国勢調査局TIGERシェープファイルからのデータをデモとして提供します
- openlayersのようなJavaScriptカートグラフィックライブラリ(
リンクテキスト
このソリューションを使用したウェブ上の例はたくさんあります
面白い質問。方法は次のとおりです。
必要なジオメトリをあらゆる形式で収集します。USGSからデータを取得しているので、次のようになります。
- SHPファイル( ESRIシェイプファイル技術説明)
- DBFファイル( Xbaseデータファイル(* .dbf))
次に、「コンパイル」するプログラムを作成しました。これらの形状定義を、レンダリングに効率的なフォームに変換します。これは、データを効率的に表示するために必要な投影およびデータ形式変換を行うことを意味します。詳細:
- 2Dアプリケーションでは、任意の投影法を使用できます。地図投影。
- 3Dの場合、これらの緯度/経度を3D座標に変換します。これを行う方法についての数学を次に示します。からの変換 球面座標から通常の直交座標へ。
- すべてのプリミティブを四分木/八分木(2D / 3D)に分割します。このツリーのリーフノードには、そのリーフノードの(軸に揃えられた)境界ボックスと交差するすべてのジオメトリへの参照が含まれます。 (これは、1つのジオメトリを複数回参照できることを意味します。)
- ジオメトリは、頂点のテーブルと描画コマンドのテーブルに分割されます。これはOpenGLにとって理想的な形式です。コマンドは glDrawArrays から発行できます。頂点バッファを使用します(頂点バッファオブジェクト)。 >
- 一般的な訪問者パターンは、quadtree / octreeを歩くために使用されます。ウォーキングでは、訪問者がリーフノードに到達するまでツリーの指定されたノードと交差するかどうかをテストします。訪問者には、描画、衝突検出、および選択が含まれます。 (ツリーの葉にはジオメトリへの重複参照が含まれている可能性があるため、歩行者はノードを訪問済みとしてマークし、その後それらを無視します。これらのマークは次のウォークを行う前にリセットまたは更新する必要があります。)
- 高フレームレートを実現するには、空間分割システム(ツリーの1つ)と描画効率の高い表現を使用することが重要です。これらのタイプのアプリケーションでは、最低でも20 fpsのできるだけ高いフレームレートが必要であることがわかりました。多くのパフォーマンスが、見栄えの良いマップを作成する多くの機会を与えるという事実は言うまでもありません。 (私のものは格好良くはありませんが、いつかそこに着くでしょう。)
- 空間分割は、プロセッサに送信される描画コマンドの数を減らすことで、レンダリングのパフォーマンスを向上させます。ただし、ユーザーが実際にデータセット全体(おそらくarialビュー)を表示したい場合があります。この場合、詳細レベルの制御システムが必要です。私のアプリケーションは道路を扱っているため、高速道路とより大きな道路を優先します。描画コードは、フレームレートが低下する前に描画できるプリミティブの数を知っています。プリミティブもこの優先度でソートされます。最初の
x
アイテムのみを描画します。x
は、希望するフレームレートで描画できるプリミティブの数です。
残りは、表示するデータのカメラ制御とアニメーションです。
既存の実装の例を次に示します。
写真http://seabusmap.com/assets/Picture%205.png
tigerデータをローカルに保存するには、 Postgresql を postgis ツール。 これらには印象的なツールのコレクションがあり、特に Tiger Geocoder は、tigerデータをインポートおよび使用する優れた方法を提供します。 postgisとやり取りするツール、おそらく mapserver http://postgis.refractions.net/documentation/ から: 現在、PostGISで動作するいくつかのオープンソースツールがあります。 uDigプロジェクトは、PostGISと直接連携できる完全な読み取り/書き込みデスクトップ環境で動作しています。インターネットマッピングの場合、ミネソタ大学のMapserverはPostGISをデータソースとして使用できます。 GeoTools Java GISツールキットは、GeoServer Web Feature Serverと同様にPostGISをサポートしています。 GRASSはデータソースとしてPostGISをサポートしています。 JUMP JavaデスクトップGISビューアには、PostGISデータを読み取るためのシンプルなプラグインがあり、QGISデスクトップはPostGISを適切にサポートしています。 PostGISデータは、OGR C ++ライブラリとコマンドラインツールを使用して(およびバンドルされたShapeファイルダンパーを使用して)、いくつかの出力GIS形式にエクスポートできます。そしてもちろん、PostgreSQLで動作する言語であればPostGISでも動作します。リストにはPerl、PHP、Python、TCL、C、C ++、Java、C#などが含まれます。 edit:名前にSERVERという単語を含むmapserverをデプトします。これはデスクトップ環境で使用できます。
既にTIGERデータを使用することを決定したが、 OSM(Open Street Map)に興味があるかもしれません。 OSMにはTIGERデータの完全なインポートがあり、ユーザーが提供したデータで強化されています。 TIGER形式に固執すると、OSMを使用するとTIGERと他のすべてを一度に取得できるため、アプリは国際的なユーザーには役に立たなくなります。
OSMは、共同編集された無料の世界地図を備えたオープンプロジェクトです。このすべてのデータは、構造化されたXMLとして取得できます。リージョンのクエリを実行するか、大きなファイルで全世界をダウンロードできます。
さまざまなプログラミング言語で利用可能なOSM用のマップレンダラーがいくつかあり、そのほとんどはオープンソースですが、まだやるべきことがあります。
OSMルーティングサービスも利用可能です。 Webインターフェイスを備えており、WebサービスAPIを介してクエリを実行することもできます。繰り返しますが、すべてが終わっているわけではありません。ユーザーは、この上に構築されたデスクトップまたはモバイルルーティングアプリケーションを間違いなく使用できます。
そのプロジェクトに参加することに決めなかったとしても、そこから多くのインスピレーションを得ることができます。 プロジェクトWiki と、関連するさまざまなソフトウェアプロジェクトのソースをご覧ください。 Wiki内のそれらへのリンク)。
MicrosoftのビジュアルアースマッピングアプリケーションとAPIを使用するか、GoogleのAPIを使用することもできます。私は常に商業的にESRI製品を使用してプログラミングしてきましたが、オープンAPIをそれほど使ったことはありません。
また、Makerを見たいかもしれません!とファインダー!それらは比較的新しいプログラムですが、無料だと思います。データの埋め込みが制限される場合があります。メーカーはこちらにあります。
問題は、非商業規模では空間処理がかなり新しいことです。
ソリューションにお金を払ってもかまわない場合は、 Safe Software はFMEと呼ばれる製品を生産します。このツールは、あらゆる形式のデータを他の形式に変換するのに役立ちます。 KMLにGoogle Earth形式を含めるか、JPEG(または一連のJPEG)としてレンダリングします。データの変換後、 API を使用して、Google Earthをアプリケーションに埋め込むか、単に表示することができますタイル画像。
FMEではなく非常に強力なプラットフォームであるため、翻訳中に、必ずしも必要ではないデータの一部を追加または削除できます。ソースが複数ある場合は、ソースをマージします。座標を変換します(Google Earthが正確に何を使用しているか覚えていません)。バックアップをデータベースに保存します。しかし真剣に、あなたが数ドルを払う意思があるなら、あなたはこれを調べるべきです。
場所(配置場所)および場所に関するその他のデータ/コメントを含むフラグ(サンプルマップのように)を作成することもできます。これらのフラグにはさまざまな形とサイズがあります。
メルカトル図法または他の投影法を簡略化する1つは、緯度と経度の定数変換係数を仮定することです。緯度に69.172マイルを掛けます。経度については、マップエリアの中緯度を選択し、(180経度)にcosine(middle_latitude)* 69.172を掛けます。マイルに変換したら、別の変換セットを使用して画面座標を取得できます。
これは1979年に私のために働いたものです。
この答えを出したとき、質問にラベルが付けられました
" .Netでポリラインを持つシェープファイル(マップデータ)をレンダリングする最良の方法は何ですか?
今は別の質問ですが、元の質問に対する回答は残しておきます。
描画できる.netバージョンを書きました ベクトルデータ(からのジオメトリなど) C#でプレーンGDI +を使用するshpファイル)。それ とても楽しかったです。
その理由は、 の異なるバージョンを処理する 多くのジオメトリと属性 追加情報の 市販の地図コンポーネントを使用しない、または オープンソースのもの。
これを行う際の主なことは ビューポートを確立し、 WGIS84座標の変換/変換 ダウンスケールおよびGDI + x、yへ 調整して投影を待つ 再投影する必要がある場合でも。
1つの解決策は、MapXtremeを使用することです。 JavaとC#のAPIがあります。 APIはこれらのファイルをロードしてレンダリングできます。
Javaの場合:
.NETの場合:
このソリューションをデスクトップアプリケーションで使用しましたが、うまくいきました。レンダリング情報のみを提供します。
これを最初から行うには、かなり時間がかかります。ダウンロード可能な評価版があります。 「MAPXTREME」と印刷されるだけだと思います。透かしとして地図上に表示されますが、それ以外は完全に使用可能です