国土地理院地図をクリックして緯度・経度を取得したい

解決


佐藤  2012-06-18 03:23:18  No: 42486

mizukiさん 2012/05/01(火)の質問で既に[解決]となっているのに、恐縮です。
実は、植物の標本管理システムを作成していて、GISデータのない写真について、国土地理院の地図をクリックしてその緯度経度を取り込むたく四苦八苦していたところに、mizukiさんの質問があり、脇で興味深く拝見をさせていただいたり、途中経過を自分なりに試したりしていました。
しかし、結局、自分の能力では、解決・実現できませんでした。
mizukiさんの解決した方法は、googleマップではなく、国土地理院の地図でも可能なのでしょうか。


Mr.XRAY  2012-06-18 23:08:56  No: 42487

こんにちは,Mr.XRAYです.

>mizukiさん 2012/05/01(火)の質問で既に[解決]となっているのに、恐縮です。

探しました.日付だけというは結構... (笑).多分間違いないでしょう.
これは,以下のスレッドのことでしょうか?

[WebBrowserで得たデータをDelphiで取得]
https://www.petitmonte.com/bbs/answers?question_id=7635

これは,質問の内容が変化していますね.

(1) WebBrowserのINPUTBOXに表示するようにしました  ---> その処理方法
(2) あるサイトのサンプルコードを動作させるための手順

処理の内容そのものに関連性があるかも知れませんが,趣旨が少し違うようです.
「国土地理院地図」がどういうものか知りませんが.

>googleマップではなく、国土地理院の地図でも可能なのでしょうか。

「可能かどうか」ということであれば,おそらく,
「可能かどうか,現時点では分からないし,判断は不可能に近い」
ということになるのではないかと思います.

もちろん,佐藤さんの文章を理解して,判断できる方もいるかも知れません.


もしも  2012-06-19 08:51:38  No: 42488

「国土地理院地図」というものが↓これのことなら、
http://watchizu.gsi.go.jp/watchizu.html?longitude=139.81&latitude=35.71
クリックした地図の位置の緯度・経度を取得するのはかなり面倒みたいだけど、
地図の中央の十字カーソルの位置の緯度・経度なら次の関数で簡単に取得できる。

procedure TForm1.Get_Longitude_Latitude;
var
  Document: IHTMLDocument3;
  ND,NM, ED,EM: Integer;
  NS,ES: Double;
begin
  Document := WebBrowser1.Document as IHTMLDocument3;
  if Assigned(Document) then begin
    ND := StrToInt(Document.getElementById('ND').innerText);
    NM := StrToInt(Document.getElementById('NM').innerText);
    NS := StrToFloat(Document.getElementById('NS').innerText);
    ED := StrToInt(Document.getElementById('ED').innerText);
    EM := StrToInt(Document.getElementById('EM').innerText);
    ES := StrToFloat(Document.getElementById('ES').innerText);
    Edit1.Text := Format('北緯%3d度%.2d分%f秒', [ND,NM,NS]);
    Edit2.Text := Format('東経%3d度%.2d分%f秒', [ED,EM,ES]);
  end;
end;

つまり、目標の場所が地図の中心(十字カーソルの位置)になるようにマウスで
地図をドラッグして動かしたあとで、マウスボタンを離した時のイベントで
この関数を呼び出すことが出来れば目的達成かな?


佐藤  2012-06-20 16:30:55  No: 42489

もしもさん、ありがとうございました。
教えていただいた、ソースを使わせていただいて思った処理ができました。
国土地理院の構築ガイド見ると、クリックした位置情報も取れそうですが、とりあえず実用的には「もしもさん」の方法で十分です。
ありがとうございました。


mizuki  2012-06-20 23:09:28  No: 42490

佐藤様  ご質問があったのに気づきませんでした。
もしも様(または佐藤様)サンプルコードを拝見し、こんなことができるのであれば使ってみたいと思いました。  これを動かすために全コードをどのようにしたのか教えていただけませんでしょうか?  解決済みとなっており恐縮ですがお願いします。


佐藤  2012-06-21 00:29:48  No: 42491

mizukiさん質問がきっかけで、こちらのプログラムも解決しました。
自分は、しばらくHTMLから遠ざかっていましたが、以前のmizukiの質問・回答、今回の「もしも」さんの回答をDelphiとHTMLを組合わせると、いろいろなことが出来ることを再確認しました。
それにしても、「もしも」さんの回答は鮮やかでした。ありがとうございました。

当方で行ったことを簡略化すると次のとおりです。

Formのusesに  MSHTML を追加。
Button1: TButton;   Edit1: TEdit;  Edit2: TEdit; WebBrowser1: TWebBrowser;を配置する。
以下、コートは次のとおりです。

----------------------------------

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw, Vcl.StdCtrls, MSHTML;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    WebBrowser1: TWebBrowser;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure Get_Longitude_Latitude;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Get_Longitude_Latitude;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  WebBrowser1.Navigate('http://watchizu.gsi.go.jp/watchizu.html?longitude=139.81&latitude=35.71');
end;

procedure TForm1.Get_Longitude_Latitude;
var
  Document: IHTMLDocument3;
  ND,NM, ED,EM: Integer;
  NS,ES: Double;
begin
  Document := WebBrowser1.Document as IHTMLDocument3;
  if Assigned(Document) then begin
    ND := StrToInt(Document.getElementById('ND').innerText);
    NM := StrToInt(Document.getElementById('NM').innerText);
    NS := StrToFloat(Document.getElementById('NS').innerText);
    ED := StrToInt(Document.getElementById('ED').innerText);
    EM := StrToInt(Document.getElementById('EM').innerText);
    ES := StrToFloat(Document.getElementById('ES').innerText);
    Edit1.Text := Format('北緯%3d度%.2d分%f秒', [ND,NM,NS]);
    Edit2.Text := Format('東経%3d度%.2d分%f秒', [ED,EM,ES]);
  end;
end;

end.


mizuki  2012-06-21 01:08:14  No: 42492

佐藤様  早速のご回答をありがとうございました。当方の環境はDelphi6  Personalですので少し前でしたら頭を悩ましたと思いますが今は前回の経験がありましたのでUses節を変更するだけですぐに動きました。GoogleMapは特に都市部では強力ですが山間地などでは国土地理院の地図が力を発揮すると思いますので使わせていただきます。素人の質問に快くお答えいただき大変ありがとうございました。


佐藤  2012-06-21 05:37:46  No: 42493

参考までに、私は次のコードでボタンクリックの代わりに、地図のスクロールの都度位置情報を表示させています。

procedure TForm1.WebBrowser1CommandStateChange(ASender: TObject;
  Command: Integer; Enable: WordBool);
begin
  try
    Get_Longitude_Latitude;
  except
  //何もしない
  end;
end;


mizuki  2012-06-25 20:31:35  No: 42494

佐藤様  イベントの取得方法の自動化、勉強になりました。早速つかわせていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加