まず、2008 TIGER ファイルを使用することをお勧めします。
第二に、他の人が指摘しているように、すでにデータを読み込み、解釈し、変換し、使用しているプロジェクトがたくさんあります。ただし、このデータ用に独自のパーサーを構築するのはほとんど簡単なことではないため、プロジェクト全体を使用する予定がない限り、別のプロジェクトのコードを調べて必要なものを抽出しようとする理由はありません。
下位レベルから始めたい場合
解析中
独自の TIGER パーサーを構築する (かなり簡単 - 線分の DB だけ) と、その上に単純なレンダリング (線、多角形、文字/名前) を構築することもかなり簡単になります。レンダリング フェーズでは、さまざまな地図投影法の種類を確認する必要があります。最も頻繁に使用される (したがって、ユーザーに最もなじみ深い) のはメルカトル図法です。これはかなり単純で高速です。他のプロジェクションをサポートして遊んでみたいかもしれません。
これは、地図を投影する方法と、その投影を逆にする方法を確認するという点で、少し「楽しい」ものになります (たとえば、ユーザーが地図をクリックすると、クリックした緯度/経度が表示されます。現在の投影を逆にする必要があります)。方程式)。
レンダリング
レンダラーを開発したとき、固定サイズ (埋め込みデバイス) と固定倍率に基づいてウィンドウを作成することにしました。これは、緯度/経度でマップを中央に配置し、特定の倍率で中央ピクセル = 中央緯度/経度を使用して、メルカトル図法を使用して、各緯度/経度を表すピクセルを計算でき、その逆も可能であることを意味しました。
一部のプログラムでは、代わりにウィンドウを変化させ、倍率と固定点を使用する代わりに、2 つの固定点 (多くの場合、ウィンドウを定義する長方形の左上隅と右下隅) を使用します。この場合、ピクセルから緯度/経度への転送を決定するのは簡単です。これは、いくつかの補間計算にすぎません。回転とスケーリングにより、この伝達関数は少し複雑になりますが、それほど複雑になることはありません。補間を使用した長方形のウィンドウのままですが、ウィンドウの角が北に対して特定の向きである必要はありません。これにより、いくつかのまれなケースが追加されます (たとえば、マップを裏返しにして、地球の内側から見ているように表示することができます) が、これらは面倒ではなく、作業中に対処できます。
緯度/経度からピクセルへの転送が完了すると、通常のグラフィックスの問題 (ラインまたはポリゴンのエッジが不適切にオーバーラップする、アンチエイリアシングなど) を除いて、ラインとポリゴンのレンダリングは非常に簡単になります。しかし、多くのオープン ソース レンダラーで行われているような基本的な醜いマップのレンダリングは、かなり簡単です。
また、距離と大圏の計算を試すこともできます。たとえば、経験則として、赤道での緯度または経度の各度は約 111.1 KM です。もう一方は 111.1kM のままです。
ストレージと構造
ただし、データをどのように保存して参照するかは、そのデータをどうするかによって大きく異なります。人口統計とルーティングに同じデータベース構造を使用したい場合、多くの困難な問題が発生します。特定のデータベース構造とインデックス作成は、一方は速く、他方は遅くなります。
郵便番号を使用して近くの郵便番号のみを読み込むことは、小規模なマップ レンダリング プロジェクトでは機能しますが、全国を横断するルートが必要な場合は、別の構造が必要になります。一部の実装には、主要道路のみを含む「オーバーレイ」データベースがあり、オーバーレイへのルートがスナップされます (または複数のオーバーレイ - ローカル、地下鉄、郡、州、国を介して)。これにより、ルーティングは高速になりますが、非効率的な場合があります。
タイリング
マップを並べて表示するのは、実際には簡単ではありません。倍率を低くすると、マップ全体をレンダリングして切り取ることができます。より高い倍率では、(メモリ/スペースの制約により) 一度に全体をレンダリングできないため、スライスする必要があります。
個々のタイルをレンダリングできるようにタイルの境界で線をカットすると、完全な結果にはなりません。多くの場合、タイルの境界を越えて線がレンダリングされます (または、少なくとも線の端のデータは保持されますが、レンダリングは一度終了すると停止します)。端から落ちていることがわかります) - これにより、タイル間を移動するときに線が完全に一致しないように見えることで発生するエラーが減少します。
この問題に取り組んでいくうちに、私が話していることがわかるでしょう。
特定のタイルに入るデータを見つけることも簡単ではありません - ラインは、特定のタイルの外側に両端があるかもしれませんが、タイルを横切って移動します。これについては、グラフィックスの本を参照する必要があります ( Michael Abrash の本は重要な参考文献であり、上記のリンクから現在無料で入手できます)。主にゲームについて話していますが、ウィンドウ処理、クリッピング、ポリゴン エッジ、コリジョンなどはすべてここに当てはまります。
ただし、より高いレベルでプレイしたい場合があります。
上記を完了したら (既存のプロジェクトを調整するか、上記を自分で実行することによって)、他のシナリオやアルゴリズムを試してみることができます。
逆ジオコーディングはかなり簡単です。 緯度/経度を入力 (または地図をクリック) して、最寄りの住所を取得します。これは、TIGER データの線分に沿って住所を解釈する方法を教えてくれます。
基本的なジオコーディングは難しい問題です。 住所パーサーを作成することは便利で興味深いプロジェクトであり、TIGER データを使用してそれを緯度/経度に変換することは簡単ではありませんが、とても楽しいものです。正確な名前と形式の一致を要求することから始めて、単純で小規模なものから始め、次に「類似」一致と音声一致を調べ始めます。この分野では多くの研究が行われています。ここで検索エンジン プロジェクトを参照してください。
2 点間の最短経路を見つけることは、重要な問題です。 それを行うためのアルゴリズムは非常に多くあり、そのほとんどは特許を取得しています。これを試す場合は、独自の設計の簡単なアルゴリズムを使用してから、調査を行い、設計を最新技術と比較することをお勧めします。グラフ理論に興味があるなら、とても楽しいです。
道をたどり、先手を打って指示を出すことは、一見したように簡単ではありません。関連付けられた緯度/経度ペアの配列を含む一連の指示が与えられた場合、外部入力 (GPS またはシミュレートされた GPS) を使用してルートを「たどり」、実際の各交差点に近づくときにユーザーに指示を与えるアルゴリズムを開発します。曲がりくねった道路などにより、指示よりも多くの緯度/経度のペアがあることに注意してください。進行方向などを検出する必要があります。実装を試みるまでは見られない多くのコーナーケース。
興味のあるポイント検索。 これは興味深いです - あなたは現在の場所を見つける必要があります.起源。これは、POI データベースをこの状況で検索しやすい形式に変換する必要があるという点で興味深いものです。何百万ものエントリを調べて、距離計算 (sqrt(x^2 + y^2)) を実行し、結果を返すのに時間をかけることはできません。最初にデータの量を削減するための何らかの方法またはアルゴリズムが必要です。
巡回セールスマン。 複数の宛先を持つルーティング。通常のルーティングの難しいバージョンです。
このテーマに関する多くのプロジェクトや情報源への多数のリンクをここで見つけることができます。
頑張ってください。どんなに初歩的であろうと醜いことであろうと、他の人が利益を得ることができるように、あなたがしていることは何でも公開してください!
-アダム