12

単純なナビゲーション アプリケーションをペット プロジェクトとして作成することに興味があります。無料の地図データを探し回った後、米国国勢調査局の TIGER 2007 Line/Shapefile 地図データに落ち着きました。データは個々の郡の zip ファイルに分割されており、私の地域の 1 つの郡の地図データをダウンロードしました。

この地図データを使用可能な形式に読み込む最良の方法は何でしょうか?

どうすればいいですか:

  • これらのファイルを読み込む
  • それらを解析する - これらのシェープファイルを既に解析できる正規表現またはライブラリ?
  • データをアプリケーションにロードする - ポイントをメモリ内のデータ構造に直接ロードする必要がありますか? 小さなデータベースを使用しますか? 地図データのアプリケーションを終了したら、永続化する必要はありません。ユーザーはシェープファイルを再度ロードできます。

Shapefile データを読み取った後、マップをレンダリングする最良の方法は何でしょうか?

理想的には、郡の地図データのシェープファイルを読み込んで、すべてのポリラインを画面にレンダリングし、回転とスケーリングを可能にしたいと考えています。

どうすればいいですか:

  • 緯度/経度ポイントを画面座標に変換しますか? - 私が知る限り、Shapefile はそのポイントに経度と緯度を使用します。したがって、マップ機能を表示するには、これらを何らかの方法で画面座標に変換する必要があることは明らかです。
  • マップ データ (道路、境界などの一連のポリライン) を、マップ全体を簡単に回転およびスケーリングできるようにレンダリングしますか?
  • マップ全体を一連の「タイル」としてレンダリングして、表示領域内のフィーチャ/ラインのみがレンダリングされるようにしますか?

元。表示マップとしてレンダリングされた TIGER データの:
代替テキスト

これらのファイルを読み取るための最良の方法、プログラムでそれらをどのように表現するか(データベース、メモリデータ構造内)、およびマップデータを(回転/スケーリングで)レンダリングする方法について、ある程度の経験と洞察を持っている人画面上でいただければ幸いです。

編集: 明確にするために、Google または Yahoo マップ API を使用したくありません。同様に、私は OpenStreetMap を使用したくありません。これらの API/プログラムを利用するよりも、ゼロからのアプローチを探しています。これはデスクトップアプリケーションになります。

4

11 に答える 11

24

まず、2008 TIGER ファイルを使用することをお勧めします。

第二に、他の人が指摘しているように、すでにデータを読み込み、解釈し、変換し、使用しているプロジェクトがたくさんあります。ただし、このデータ用に独自のパーサーを構築するのはほとんど簡単なことではないため、プロジェクト全体を使用する予定がない限り、別のプロジェクトのコードを調べて必要なものを抽出しようとする理由はありません。

下位レベルから始めたい場合

解析中

独自の TIGER パーサーを構築する (かなり簡単 - 線分の DB だけ) と、その上に単純なレンダリング (線、多角形、文字/名前) を構築することもかなり簡単になります。レンダリング フェーズでは、さまざまな地図投影法の種類を確認する必要があります。最も頻繁に使用される (したがって、ユーザーに最もなじみ深い) のはメルカトル図法です。これはかなり単純で高速です。他のプロジェクションをサポートして遊んでみたいかもしれません。

これは、地図を投影する方法と、その投影を逆にする方法を確認するという点で、少し「楽しい」ものになります (たとえば、ユーザーが地図をクリックすると、クリックした緯度/経度が表示されます。現在の投影を逆にする必要があります)。方程式)。

レンダリング

レンダラーを開発したとき、固定サイズ (埋め込みデバイス) と固定倍率に基づいてウィンドウを作成することにしました。これは、緯度/経度でマップを中央に配置し、特定の倍率で中央ピクセル = 中央緯度/経度を使用して、メルカトル図法を使用して、各緯度/経度を表すピクセルを計算でき、その逆も可能であることを意味しました。

一部のプログラムでは、代わりにウィンドウを変化させ、倍率と固定点を使用する代わりに、2 つの固定点 (多くの場合、ウィンドウを定義する長方形の左上隅と右下隅) を使用します。この場合、ピクセルから緯度/経度への転送を決定するのは簡単です。これは、いくつかの補間計算にすぎません。回転とスケーリングにより、この伝達関数は少し複雑になりますが、それほど複雑になることはありません。補間を使用した長方形のウィンドウのままですが、ウィンドウの角が北に対して特定の向きである必要はありません。これにより、いくつかのまれなケースが追加されます (たとえば、マップを裏返しにして、地球の内側から見ているように表示することができます) が、これらは面倒ではなく、作業中に対処できます。

緯度/経度からピクセルへの転送が完了すると、通常のグラフィックスの問題 (ラインまたはポリゴンのエッジが不適切にオーバーラップする、アンチエイリアシングなど) を除いて、ラインとポリゴンのレンダリングは非常に簡単になります。しかし、多くのオープン ソース レンダラーで行われているような基本的な醜いマップのレンダリングは、かなり簡単です。

また、距離と大圏の計算を試すこともできます。たとえば、経験則として、赤道での緯度または経度の各度は約 111.1 KM です。もう一方は 111.1kM のままです。

ストレージと構造

ただし、データをどのように保存して参照するかは、そのデータをどうするかによって大きく異なります。人口統計とルーティングに同じデータベース構造を使用したい場合、多くの困難な問題が発生します。特定のデータベース構造とインデックス作成は、一方は速く、他方は遅くなります。

郵便番号を使用して近くの郵便番号のみを読み込むことは、小規模なマップ レンダリング プロジェクトでは機能しますが、全国を横断するルートが必要な場合は、別の構造が必要になります。一部の実装には、主要道路のみを含む「オーバーレイ」データベースがあり、オーバーレイへのルートがスナップされます (または複数のオーバーレイ - ローカル、地下鉄、郡、州、国を介して)。これにより、ルーティングは高速になりますが、非効率的な場合があります。

タイリング

マップを並べて表示するのは、実際には簡単ではありません。倍率を低くすると、マップ全体をレンダリングして切り取ることができます。より高い倍率では、(メモリ/スペースの制約により) 一度に全体をレンダリングできないため、スライスする必要があります。

個々のタイルをレンダリングできるようにタイルの境界で線をカットすると、完全な結果にはなりません。多くの場合、タイルの境界を越えて線がレンダリングされます (または、少なくとも線の端のデータは保持されますが、レンダリングは一度終了すると停止します)。端から落ちていることがわかります) - これにより、タイル間を移動するときに線が完全に一致しないように見えることで発生するエラーが減少します。

この問題に取り組んでいくうちに、私が話していることがわかるでしょう。

特定のタイルに入るデータを見つけることも簡単ではありません - ラインは、特定のタイルの外側に両端があるかもしれませんが、タイルを横切って移動します。これについては、グラフィックスの本を参照する必要があります ( Michael Abrash の本は重要な参考文献であり、上記のリンクから現在無料で入手できます)。主にゲームについて話していますが、ウィンドウ処理、クリッピング、ポリゴン エッジ、コリジョンなどはすべてここに当てはまります。

ただし、より高いレベルでプレイしたい場合があります。

上記を完了したら (既存のプロジェクトを調整するか、上記を自分で実行することによって)、他のシナリオやアルゴリズムを試してみることができます。

逆ジオコーディングはかなり簡単です。 緯度/経度を入力 (または地図をクリック) して、最寄りの住所を取得します。これは、TIGER データの線分に沿って住所を解釈する方法を教えてくれます。

基本的なジオコーディングは難しい問題です。 住所パーサーを作成することは便利で興味深いプロジェクトであり、TIGER データを使用してそれを緯度/経度に変換することは簡単ではありませんが、とても楽しいものです。正確な名前と形式の一致を要求することから始めて、単純で小規模なものから始め、次に「類似」一致と音声一致を調べ始めます。この分野では多くの研究が行われています。ここで検索エンジン プロジェクトを参照してください。

2 点間の最短経路を見つけることは、重要な問題です。 それを行うためのアルゴリズムは非常に多くあり、そのほとんどは特許を取得しています。これを試す場合は、独自の設計の簡単なアルゴリズムを使用してから、調査を行い、設計を最新技術と比較することをお勧めします。グラフ理論に興味があるなら、とても楽しいです。

道をたどり、先手を打って指示を出すことは、一見したように簡単ではありません。関連付けられた緯度/経度ペアの配列を含む一連の指示が与えられた場合、外部入力 (GPS またはシミュレートされた GPS) を使用してルートを「たどり」、実際の各交差点に近づくときにユーザーに指示を与えるアルゴリズムを開発します。曲がりくねった道路などにより、指示よりも多くの緯度/経度のペアがあることに注意してください。進行方向などを検出する必要があります。実装を試みるまでは見られない多くのコーナーケース。

興味のあるポイント検索。 これは興味深いです - あなたは現在の場所を見つける必要があります.起源。これは、POI データベースをこの状況で検索しやすい形式に変換する必要があるという点で興味深いものです。何百万ものエントリを調べて、距離計算 (sqrt(x^2 + y^2)) を実行し、結果を返すのに時間をかけることはできません。最初にデータの量を削減するための何らかの方法またはアルゴリズムが必要です。

巡回セールスマン。 複数の宛先を持つルーティング。通常のルーティングの難しいバージョンです。

このテーマに関する多くのプロジェクトや情報源への多数のリンクをここで見つけることができます。

頑張ってください。どんなに初歩的であろうと醜いことであろうと、他の人が利益を得ることができるように、あなたがしていることは何でも公開してください!

-アダム

于 2009-01-28T15:59:21.760 に答える
14

SharpMapは、WinForms および ASP.NET 用のオープンソース .NET 2.0 マッピング エンジンです。これにより、必要なすべての機能が提供される場合があります。ESRI シェープファイルを含む、最も一般的な GIS ベクターおよびラスター データ形式を処理します。

于 2008-10-21T17:44:44.490 に答える
7

解決策は:

  • mapserver、geoserver、degree(オープンソース)のような地理空間サーバー。

シェープファイル(および他の多くのもの)を読み取って提供できます。たとえば、geoserver(インストールされている場合)は、米国国勢調査局のTIGERシェープファイルからのデータをデモとして提供します

このソリューションを使用したWeb上の例はたくさんあります

于 2009-01-27T09:45:47.317 に答える
5

面白い質問です。これが私のやり方です。

必要なジオメトリを、どのような形式で収集してもかまいません。USGS からデータを取得しているので、次のようなデータになります。

次に、これらの形状定義を効率的にレンダリングできる形式に「コンパイル」するプログラムを作成しました。これは、データを効率的に表示するために必要な投影とデータ形式の変換を行うことを意味します。いくつかの詳細:

  • 2D アプリケーションの場合、必要なプロジェクションを使用できます: Map Projections
  • 3D の場合、これらの緯度/経度を 3D 座標に変換します。これを行う方法に関する数学は次のとおりです。球座標から通常の直交座標への変換
  • すべてのプリミティブを四分木/八分木 (2D/3D) に分割します。このツリーのリーフ ノードには、そのリーフ ノードの (軸に沿った) バウンディング ボックスと交差するすべてのジオメトリへの参照が含まれます。(これは、ジオメトリの一部を複数回参照できることを意味します。)
  • ジオメトリは、頂点のテーブルと描画コマンドのテーブルに分割されます。これは、OpenGL にとって理想的な形式です。コマンドは、頂点バッファー ( Vertex Buffer Objects ) を使用してglDrawArrays経由で発行できます。
  • 四分木/八分木をたどるには、一般的な訪問者パターンが使用されます。ウォーキングには、リーフ ノードが検出されるまで、ビジターがツリーの特定のノードと交差するかどうかをテストすることが含まれます。ビジターには、描画、衝突検出、および選択が含まれます。(ツリー リーフにはジオメトリへの重複した参照が含まれている可能性があるため、ウォーカーはノードを訪問済みとしてマークし、その後それらを無視します。次のウォークを実行する前に、これらのマークをリセットするか、別の方法で更新する必要があります。)
  • 空間分割システム (ツリーの 1 つ) と描画効率の高い表現を使用することは、高いフレームレートを達成するために重要です。これらのタイプのアプリケーションでは、フレーム レートをできるだけ高くし、最低でも 20 fps にする必要があることがわかりました。多くのパフォーマンスがあれば、見栄えの良いマップを作成する機会が多くなるという事実は言うまでもありません。(私のものは見栄えがよくありませんが、いつかそこに着くでしょう。)
  • 空間パーティショニングは、プロセッサに送信される描画コマンドの数を減らすことで、レンダリングのパフォーマンスを向上させます。ただし、ユーザーが実際にデータセット全体を表示したい場合があります (おそらく、空撮ビュー)。この場合、詳細レベルの制御システムが必要です。私のアプリケーションは街路を扱うので、高速道路と大きな道路を優先します。私の描画コードは、フレームレートが低下する前に描画できるプリミティブの数を認識しています。プリミティブもこの優先順位でソートされます。目的のフレームレートで描画できるプリミティブの数である最初のxアイテムのみを描画します。x

残りは、表示したいデータのカメラ制御とアニメーションです。

私の既存の実装の例をいくつか示します。

写真 http://seabusmap.com/assets/Picture%205.png 写真 http://seabusmap.com/assets/Picture%207.png

于 2009-01-30T05:54:20.680 に答える
2

タイガーデータをローカルに保存するために、postgisツールでPostgresqlを選択しました。

それらには印象的なツールのコレクションがあります。特にTigerGeocoderは、tigerデータをインポートして使用するための優れた方法を提供します。

あなたはpostgisと相互作用するツール、おそらくある種のマップサーバーを見る必要があるでしょう

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#などが含まれます。

編集:名前にSERVERという単語が含まれているmapserverにもかかわらず、これはデスクトップ環境で使用できます。

于 2009-01-28T08:16:47.853 に答える
2

Though you already decided to use the TIGER data, you might be interested in OSM (Open Street Map), beacuse OSM has a complete import of the TIGER data in it, enriched with user contributed data. If you stick to the TIGER format, your app will be useless to international users, with OSM you get TIGER and everything else at once.

OSM is an open project featuring a collaboratively edited free world map. You can get all this data as well structured XML, either query for a region, or download the whole world in a large file.

There are some map renderers for OSM available in various programming languages, most of them open source, but still there is much to be done.

There also is an OSM routing service avaliable. It has a web-interface and might also be queriable via a web service API. Again, it's not all finished. Users could definitely use a desktop or mobile routing application built on top of this.

Even if you don't decide to go with that project, you can get lots of inspiration from it. Just have a look at the project wiki and at the sources of the various software projects which are involved (you will find links to them inside the wiki).

于 2009-01-29T17:55:51.660 に答える
1

私がこの答えを出したとき、質問はラベル付けされました

「.Netでポリラインを使用してシェープファイル(マップデータ)をレンダリングするための最良の方法は何でしょうか?」

今は別の質問ですが、元の質問に答えを残します。

c#でプレーンGDI +を使用してベクターデータ(shpファイルからのジオメトリなど)を描画できる.netバージョンを作成しました。とても楽しかったです。

その理由は、さまざまなバージョンのジオメトリと属性を多くの追加情報で処理する必要があったため、商用の地図コンポーネントやオープンソースのコンポーネントを使用できなかったためです。

これを行うときの主なことは、ビューポートを確立し、WGIS84座標をダウンスケールおよびGDI + x、y座標に変換/変換し、再投影が必要な場合でも投影を待つことです。

于 2008-10-25T16:37:32.090 に答える
1

メルカトル図法やその他の図法の簡略化の 1 つは、緯度と経度の変換係数が一定であると仮定することです。緯度に 69.172 マイルを掛けます。経度については、マップ エリアの中緯度を選択し、(180-経度) に cosine(middle_latitude)*69.172 を掛けます。マイルに変換したら、別の変換セットを使用してスクリーン座標を取得できます。

これは、1979年に私のために働いたものです.

1 度あたりのマイル数の情報源。

于 2009-01-28T23:53:02.973 に答える
1

ソリューションにお金を払うことを厭わないなら、Safe Softwareは FME と呼ばれる製品を製造しています。このツールは、データを任意の形式から他のほぼすべての形式に変換するのに役立ちます。Google Earth 形式の KML を含めるか、JPEG (または一連の JPEG) としてレンダリングします。データを変換した後、APIを使用して Google Earth をアプリケーションに埋め込むか、タイル画像を表示するだけです。

側面として、FME は非常に強力なプラットフォームであるため、翻訳中に必ずしも必要ではないデータの部分を追加または削除できます。ソースが複数ある場合は、ソースをマージします。座標を変換します (Google Earth が正確に何を使用しているかは覚えていません)。バックアップをデータベースに保存します。しかし、真剣に、数ドルを払いたい場合は、これを検討する必要があります.

また、場所 (配置する場所) とその場所に関するその他のデータ/コメントを含むフラグ (サンプル マップと同様) を作成することもできます。これらのフラグには、さまざまな形とサイズがあります。

于 2009-01-28T16:29:30.077 に答える
1

Microsoft のビジュアル アース マッピング アプリケーションと API を使用したり、Google の API を使用したりすることもできます。私は常に ESRI 製品で商用プログラミングを行ってきましたが、オープン API はあまり扱っていません。

また、あなたはMakerを見たいと思うかもしれません!そしてファインダー!比較的新しいプログラムですが、無料だと思います。データの埋め込みが制限される場合があります。メーカーはこちらからご覧いただけます。

問題は、非商用規模では空間処理がかなり新しいことです。

于 2008-10-21T18:30:35.973 に答える
0

解決策の 1 つは、MapXtreme を使用することです。Java および C# 用の API があります。API は、これらのファイルを読み込んでレンダリングできます。

Java の場合:

http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-java

.NET の場合:

http://www.mapinfo.com/products/developer-tools/desktop%2c-mobile-%26-internet-offering/mapxtreme-2008

このソリューションをデスクトップ アプリケーションで使用したところ、うまく機能しました。レンダリング情報だけでなく、さらに多くの情報を提供します。

これを最初から行うには、かなりの時間がかかる可能性があります。ダウンロードできる評価版があります。透かしとして地図の上に「MAPXTREME」を印刷するだけだと思いますが、それ以外は完全に使用できます

于 2009-01-27T10:30:47.663 に答える