• ベストアンサー

C言語で地図を描きたい

C言語で、地図を描くプログラムを作ろうと考えていますが、 どなたか参考になりそうなソースや文献などご存知でしょうか。 東京湾などの形状を描くつもりですが、将来的に 詳細/広域切り替え機能も必要になります。 海岸線を正確に描くためには、 画面外にある地形座標とも線を繋ぐ必要がありますが これをどう処理しようか考えあぐねています。 標準出力にXY座標を与えて線を描く関数や、 緯度経度をXY座標に変換する関数は用意しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • haniriito
  • ベストアンサー率57% (12/21)
回答No.2

地図ソフト、おもしろそうですね。私も作ってみたいソフトの一つです。 参考になるフリーソフトのソースや解説の場所をお知りになりたいと思いますが、私の知る限りではちょっと分かりません。 下の点についてコメントします。 >使えるリソースが限られているので、地図の一部しか描けないわけですが、膨大なベクトルデータ群から画面内に入りそうなベクトルだけを抽出するのは至難の業のようです。 基本的は地図全体をメッシュに分けて、そのメッシュにひっかかるベクトルデータをあらかじめデータベースとして持っておくしかないと思います。 そして広域・詳細表示の切り替えをサポートするには、それぞれの拡大・縮小にあわせて、異なるメッシュサイズのデータベースを保存しておき、現在の表示サイズに近いメッシュサイズのデータベースから、表示する範囲と重なるメッシュのみを描画する、ということになるのではないでしょうか。 世界地図を描くことを考えるとします。小さい町を表示するときは、例えば1km×1kmのメッシュサイズのデータを参照し、そのメッシュが画面の表示範囲と引っかかる最大4メッシュに引っかかるベクトルデータをすべて描けばよいです。もちろん表示範囲のクリッピングはしてください。その該当するメッシュ内のベクトルデータ数が数千程度に収まるのであれば描画処理はそんなにおもくないでしょう。もちろん、プロセッサの処理に応じて一度に描画できるベクトル数(=許容できる待ち時間)は変わってくるでしょう。 世界の全体を描画するとき、全体を1つのメッシュとしたデータを参照しますが、このときその地図データに含まれるであろう数百万、数千万のすべてのベクトルデータを表示するのはナンセンスですね。世界地図全体でしたら、建物や道路は表示しなくて良いかもしれません。小さい川も表示しなくて良いし、入り組んだ海岸線も要らないでしょう。つまり、細かいベクトルデータはそのサイズのメッシュのデータベースからはあらかじめ除いておき、やはり実処理(描画)時間として許容できるベクトル数に収まるようにしておくべきでしょうね。 こう考えると、地図ソフトで一番難しいのは、大小異なるメッシュサイズに対応するデータベースに、どの程度の粒度のベクトルデータを保存しておくか?という点になるのではないかと思います。 話はそれますが、3Dゲームなどで「バンプマッピング」という手法があるそうです。テクスチャをポリゴンの貼り付け表示するときに、近くで大きなポリゴンに貼り付けるときは精細なテクスチャを貼り付け、遠くで小さく表示されるポリゴンについては粗いおおざっぱなテクスチャを貼り付ける、ということをやるようで、そのためにあらかじめ精細なテクスチャデータから少しずつ粗くしてテクスチャデータをあらかじめ作成しておいて、必要に応じた解像度のテクスチャを利用するという方法です。 今回の件の参考になれば・・・ ご検討をお祈りしています。

earl_gray
質問者

お礼

同じく地図に興味があおりなんですね。地図の世界に踏み込みましたが、なんだか面白みを感じています。更に調べてみましたが、いわゆるGIS(地理情報システム)の分野のようです。 今回質問しております地図描画について、更に踏み込んで調べたところ、一つの方向性が見えてきましたのでご紹介します。 電子地図の分野では、shapefile形式が事実上の標準となっており、日本地図や世界地図などの詳細なベクトルデータが公開されいています。 このデータをC言語で操作することができる Shapefile C Library API がオープンソースで公開されており、これを使えば地図全体から指定座標内に含まれる、あるいは通過する線分を抽出することができます。これで、リソースに限りがあっても、一度切り出す作業さえしてしまえばとりあえず表示領域だけの演算で済むはずです。 多くの場合、頂点データは位置データが緯度、経度で表されて いますが、これを地図と同じメルカトル座標系に変換すればディスプレイに投影できます。これは同じくオープンソースの drawmap に座標変換関数があります。 なお地図の座標を示すのに使われる緯度経度(Latitude/Longitude)は通常度分秒(Degrees/Minutes/Seconds)で表記されますが、座標計算の前に一旦度(Degree)に変換する必要があります。こちらもネットで探せばCの関数は見つかります。 グラフィックライブラリなどを活用して標準出力にX,Y座標を指定して線を書かせることができれば、理論的には地図プログラムが実現できるものと思われます。 その他参考文献を探しましたが、次のものが該当するようです。 Dr. Mark de Berg, Dr. Marc van Kreveld著 Computational Geometry Algorithms and Applications Joseph O'rourke 著 COMPUTATIONAL GEOMETRY IN C 英文のため難しいですが、1冊目は和訳した本もあるようです。2冊目は題目から推定するとCプログラムが掲載されているはずです。これを応用すれば、フルスクラッチで切り出し描画のアルゴリズムが作れると思います。。。 まだまだ勉強途中ではありますが、ご参考になりましたら幸いです。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

表示範囲が長方形だとして。 線分を考える。曲線だったら、線分として近似できる程度に分割する。 線分が、表示範囲の中か、交差しているか、外かを判定する。 中ならそのまま線を引く。 交差していたら、交点を求めて、範囲内だけ線を引く。 外なら線は引かない。 という処理になるのではないでしょうか。 交点の求め方とかは、中学か高校の数学レベルの問題ですし、画像処理ライブラリとか探せば関数一つで解決するかもしれません。

earl_gray
質問者

お礼

ご回答ありがとうございます。 画面外にある点が関係する線分が画面内に現れると、画面外であっても計算はしなければなりません。 ところが逆に、形状データのベクトルが画面内に入るかは計算しないと分からないので、結局は全世界のデータを演算しなければならなくなります。 使えるリソースが限られているので、地図の一部しか描けないわけですが、膨大なベクトルデータ群から画面内に入りそうなベクトルだけを抽出するのは至難の業のようです。 ここは画像処理ライブラリのみならず、地図描画ライブラリも必要としそうです。一度、フリーのGISシステムのソースコードを見てみる必要がありそうですね。ありがとうございました。

関連するQ&A

  • pictureboxに表示した地図画像に座標を一致させる方法

    趣味で簡単な地図ソフトをvisualbasic2005で作ってみようと、地図センターで1/25000の地形図をダウンロード購入しpictureboxに表示はしたのですが、画面上で座標を一致させる事ができません。プログラムでやりたい事は以下の2点です。 1.マウスムーヴイベントでUTM座標を表示する。 2.入力したUTM座標値で地図上に目印を表示する。 地形図を加工等したりサイトを検索しましたができませんでした。 測量の知識は若干あったので経度緯度からUTM座標への計算はできました。 よろしくお願いします。

  • 緯度経度入りの世界地図をネットで

    緯度経度付きの世界地図又は日本地図がインターネットに公開されていませんか。 九州・北海道を含み島を除く日本本島の大体の緯度経度の範囲(誤差の大きさを視覚的に知った上で)を知りたい。 日本の最北、最南点や県ごとの緯度経度並びに、住所から求める正確な緯度経度等のホームページは検索できました。しかし私の希望は九州・北海道を含み島を除く日本本島の大体の緯度経度をその誤差を視覚的に認識したうえで簡単に知ることです。そのために、緯度経度の線が入った地図が見たいのです。 よろしくお願いします。

  • GPSカーナビと電子地図帳との経緯度の違いについて

    当方カーナビ、レーダー取締機を所有していますが、同じ場所で表示されるGPS経緯度が異なります。あるカーナビとあるレーダーが一致したりします。レーダーどうしも異なったりします。 {約10秒(300m)}レーダーもメーカーによって異なります。ゴルフナビも異なります また、ゼンリンの地図とgoogleの地図も同一点が同じように10秒ほど異なります。 大きく分けて2種類のように感じます 知らない郊外(山野等)へ行くとき、位置の特定をするのに、法務局の地図から、座標を読み取り 緯度経度に変換し、現地に行ったり、また逆に、現地の緯度経度から、座標に変換し地図にプロットしたいのですが、これでは意味がありません。 旧座標系、世界測地系、ゼンリン独自の座標系等で勝手に管理しているのでしょうか? そこで 1.何故違いが出るのか 2.どのGPS座標を使用すれば、変換して法務局の地図に(世界測地系)表示出来るのか? 3.ゼンリンとGOOGLEの緯度経度の変換式があるのか?   どなたか、教えて下されば有り難いです。 宜しくお願い致します。

  • 数値地図2500のshpファイルの変換式

    1998年度の数値地図2500のshpファイルデータから 緯度・経度(世界測地系)を計算する式を教えてください たとえば、あるポイントデータ(09LD423フォルダ)は -31928,-43500 という座標(m)を持っています。平面直交座標9系の 緯度:36.0 経度:139.5 から計算するみたいなのですが、 計算法が間違えているのかどうもgoogolemapに載せた時にズレます。 何か初歩的な間違えをしているのでしょうか?

  • 正距方位図法の計算式

    お世話になります。 任意の地点からの正距方位図法で地図を描画する為の計算式を教えて下さい。 具体的には、任意の地点を原点とし、変数に緯度経度を入れると、XY座標が得られるものです。 よろしくお願いします。

  • 国土地理院“電子国土”の地図で、緯度経度で示す範囲の地図を1つのファイルにしたい。

    標記地図は縮尺を変えた印刷が可能です。しかしそれは1つの画面に表示されている範囲に限られており、紙サイズはA4だけである。 縮尺を小さくし、広域範囲を一つの画面に示すと、地図に表示されるのは市町村境と川と大きな道路、鉄道と大きな範囲の地名だけになる。 1万分の1の地図で、緯度経度で示す対角の2点を与えて、その範囲を一つのJPGファイルにする方法はありませんか?

  • 地図ソフトについて

    いまどき,地図情報はネットでもソフトでもGoogle系でもいくらでもありますが,AlpsMapのような感じ(といっても普通の地図ソフトの感じ)で,その上にいろんな情報を載せることができる機能がある地図ソフトがないでしょうか.簡易なGISのようなものですが,マッピングするような機能です。例えば航空写真があり,写真の4スミの緯度経度座標が分かっていると,地図上に透かしたように重ねて表示してくれるというような機能です。 あと,1回購入して年間保守費用を支払えば,地図の内容が更新できるというようなものはないでしょうか。 よろしくお願いします。

  • 携帯のホームページに地図を埋め込みたい

    携帯のホームページに地図を「埋め込みたい」と考えています。 提供側も使用する側も無料のサービスで実現できるものはありますでしょうか。 ●緯度経度を指定することで、該当する場所の地図を表示したい 緯度・経度が入力されている表を元に地図を見る必要があるため、 あらかじめ、地図画像を用意しておいて、その画像を送るということは出来ません。 ●地図へのリンクではなく埋め込みたい 地図の下に、色々なコメント・情報を表示したいと考えています。 したがって、地図のページへリンクで飛ぶものではなく、 今のページに埋め込みたいと考えています。 ●ユーザーが縮尺を変更したり、地図を移動できることは、 優先順位としては低い。 以上、お心当たりのある方がいらっしゃれば教えて頂けると助かります。 どうぞ宜しくお願いします。

  • 地図の座標値が分かる WEB サイト

    インターネットの WEB サイトで,目標地点の座標値(緯度・経度の度分秒の値)を教えてくれるところを探しています.要は,郵便番号や番地を元にして,いろいろな地点の座標地を調べたいのです. MAPOO http://www.mapoo.or.jp/ は地図の右上に座標値が表示されるのでそれなりには使えているのですが,郵便番号や住所・番地での検索できず,検索の使い勝手がいまひとつ気に入りません(地図そのものも,あまり綺麗じゃない…).たとえば MapFan や Mapion の使い勝手で,座標値を調べられるサイトはないでしょうか?

  • パソコンを使用して地図に緯度/経度のマスメを入れるには

     パソコンを使用して地図をスキャナーで読み込んで そこに緯度/経度のマスメを入れたいのですが どのようにしたらよいのでしょうか?  必要な 機材、ソフト、具体的なやり方など をお願いします。