MySQLについて


GoogleMapなどの緯度経度の数値を入れる場合、データ型はどうするのが良いのでしょうか。

GoogleMapで表示される数値(小数点以下14桁程度)は全て保存したいたいと考えています。
値を入れないときもあります。

緯度、経度は別のデータとしての保存を考えています。

現在「lat DECIMAL(20,17)」としているのですが、
値を入れない場合、「0.00000000000000000」となってしまいます。

おすすめや一般的な方法を教えてください。

よろしくお願いします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2008/09/22 18:12:09
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:gaziro2000 No.1

回答回数56ベストアンサー獲得回数2

ポイント35pt

GoogleMAPって、少数点以下6桁しか持ってないのでは?

うちは、decimal(9,6)にしてます。

ジオクリ http://www.geoclip.jp/

.

ちなみにそれ以外に、度分秒のデータも同時にDBに書いています。

いちいち変換するの面倒なので・・・ご参考まで。

.

是非、サービスができたら教えて下さい。

id:worldtravel

ありがとうございます。


ちなみに小数点以下ですが

「googlemap 緯度 経度 取得」で検索した1位のページを参考に...

http://www.geekpage.jp/web/google-maps-api/get-xy.php

地図をクリックすると小数点以下は14桁まで表示されているようです。

(このぺーじは地図の下に表示されます)


http://maps.google.co.jp/

でリンク用のURLを取得しようとすると6桁のようです。


他の方のご意見もお待ちしています。

よろしくお願いします。

2008/09/22 17:24:06
id:systemkun No.2

回答回数3ベストアンサー獲得回数0

ポイント35pt

私もGoogle Maps APIを使ってWeb上で地図を表示させるプログラムを作ったことがあります。


その時は建物が特定できる程度の精度があればよかったので、

MySQLで保存する場合はdoubleで十分確保できました。


自分がAPIを使っていたときは、小数点以下は12桁でした。

それにしても、Google Mapsの仕様変更は激しいですね。


念のためどのくらいの精度なのか計算すると。


地球の円周を計算しやすく40,000kmとし、

緯度、経度の小数点精度を8桁とすると、

小数点第8桁における誤差は、


40,000 / 360 = 111.111km = 111,111m( = 経度1度あたりの長さ)


111,111 / 100,000,000 = 0.000111 m = 0.111mm( = 経度 1億分の1度の長さ)


とこの時点でミリ単位以下の精度ですので心配いりませんよ。


もし、度分秒単位も取得できるようでしたら、gaziro2000のされた通りそちらも保存されるといいと思います。

id:worldtravel

計算までありがとうございます。

14桁なんて保存しても私のやりたいことには意味がなさそうです...

double でも十分なのですね。

ありがとうございました。

2008/09/22 18:12:03
  • id:aki1960
    GoogleMapに限らず、相手先の都合によって仕様がどう変わるかわからないものは、I/F上は文字列として扱うのがベターです。
    数値型として規定してしまうと、格納時に型チェックが必要になりますし、チェックして弾いたデータは捨てられる可能性があります。
    (アベンドするよりマシかもしれませんが。)
  • id:worldtravel
    ありがとうございます。

    どうぞ回答欄へお願いします。


    まず、「相手先の都合によって仕様がどう変わるかわからない」というのは
    もしかしたら緯度は「-012.3456...」などとなるかもしれない。
    というようなことでしょうか。
    だとしましたら、現時点では、現在の形式を格納することだけを前提にお願いします。


    また文字列にすると数値とするより余分に容量を使ったり
    検索する際に遅くなるなどならないでしょうか、
    素人質問ですいません。

    また、格納時よりも圧倒的に呼び出すほうが多いので、
    格納時に正確に入れて、読み出すときは負荷を軽く。と考えているのですが
    これは問題でしょうか。

    お願いします。
  • id:gaziro2000
    ちょっと計算してませんし、用途が何かわからないのですが、
    小数点7桁目以降の精度を持ったとして、それは何mになるのでしょうか?
    最大でも1m位の精度が出ればOKでは?
    .
    文字列化するのは余計大変だと思うので今回のケースでは、私はdecimalで良いと思います。
    実効上必要な精度が出る程度の小数点まで取得して、後は捨てる。というのが良いかとおもいます。
    .
    ま、心配だったら、DECIMAL(20,17)でも良いのでは?
    0.00000000000000000となったところでディスク容量を数バイト食う程度なのでは?と思います。
  • id:worldtravel
    そうですね。
    7桁目で何mなのでしょうか...

    計算してみます。
  • id:aki1960
    ご質問のGoogleMapの緯度経度に限らず、一般的な話なのでこちらにかかせていただきました。
    システム間のI/Fは、仕様書を取り交わして作成したにも関わらず、認識齟齬によってエラーが発生することが多々あります。
    その際DBもアベンドし、データをロストするような設計では一般的にはマズイはず。という観点からです。
    緯度経度情報が数値でなくなる、なんてことは考えにくいことではあっても、自分達が管理しているシステムではない以上、いつ何が飛んできても、アベンドしないようにしとく。てな意味合いです。
    先方がなんらかの改修を行った際に、本来緯度経度がi/Fされてくるべき場所に別の情報が入ってる、なんてことはあり得ますし、相手が改修するタイミングなんてわかりませんから、I/Fテストもできませんし。
    まぁ、何の目的で作るシステムなのか、にもよりますけど、今回は老婆心だと思ってください。

  • id:worldtravel
    aki1960 さん

    どうもありがとうございます。
    aki1960 さんの仰ることは十分理解できました。

    実際スクレーピングした内容を表示するサイトを作ったときに
    仰る通り知らない間に何も表示されていない。
    ということになったことがあります。

    そのようなミスが許されないものを作るときは
    仰ることを実行します。

    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません
${title} {{if price }}
${price}円
{{/if}}