mizukiさん 2012/05/01(火)の質問で既に[解決]となっているのに、恐縮です。
実は、植物の標本管理システムを作成していて、GISデータのない写真について、国土地理院の地図をクリックしてその緯度経度を取り込むたく四苦八苦していたところに、mizukiさんの質問があり、脇で興味深く拝見をさせていただいたり、途中経過を自分なりに試したりしていました。
しかし、結局、自分の能力では、解決・実現できませんでした。
mizukiさんの解決した方法は、googleマップではなく、国土地理院の地図でも可能なのでしょうか。
こんにちは,Mr.XRAYです.
>mizukiさん 2012/05/01(火)の質問で既に[解決]となっているのに、恐縮です。
探しました.日付だけというは結構... (笑).多分間違いないでしょう.
これは,以下のスレッドのことでしょうか?
[WebBrowserで得たデータをDelphiで取得]
https://www.petitmonte.com/bbs/answers?question_id=7635
これは,質問の内容が変化していますね.
(1) WebBrowserのINPUTBOXに表示するようにしました ---> その処理方法
(2) あるサイトのサンプルコードを動作させるための手順
処理の内容そのものに関連性があるかも知れませんが,趣旨が少し違うようです.
「国土地理院地図」がどういうものか知りませんが.
>googleマップではなく、国土地理院の地図でも可能なのでしょうか。
「可能かどうか」ということであれば,おそらく,
「可能かどうか,現時点では分からないし,判断は不可能に近い」
ということになるのではないかと思います.
もちろん,佐藤さんの文章を理解して,判断できる方もいるかも知れません.
「国土地理院地図」というものが↓これのことなら、
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;
つまり、目標の場所が地図の中心(十字カーソルの位置)になるようにマウスで
地図をドラッグして動かしたあとで、マウスボタンを離した時のイベントで
この関数を呼び出すことが出来れば目的達成かな?
もしもさん、ありがとうございました。
教えていただいた、ソースを使わせていただいて思った処理ができました。
国土地理院の構築ガイド見ると、クリックした位置情報も取れそうですが、とりあえず実用的には「もしもさん」の方法で十分です。
ありがとうございました。
佐藤様 ご質問があったのに気づきませんでした。
もしも様(または佐藤様)サンプルコードを拝見し、こんなことができるのであれば使ってみたいと思いました。 これを動かすために全コードをどのようにしたのか教えていただけませんでしょうか? 解決済みとなっており恐縮ですがお願いします。
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.
佐藤様 早速のご回答をありがとうございました。当方の環境はDelphi6 Personalですので少し前でしたら頭を悩ましたと思いますが今は前回の経験がありましたのでUses節を変更するだけですぐに動きました。GoogleMapは特に都市部では強力ですが山間地などでは国土地理院の地図が力を発揮すると思いますので使わせていただきます。素人の質問に快くお答えいただき大変ありがとうございました。
参考までに、私は次のコードでボタンクリックの代わりに、地図のスクロールの都度位置情報を表示させています。
procedure TForm1.WebBrowser1CommandStateChange(ASender: TObject;
Command: Integer; Enable: WordBool);
begin
try
Get_Longitude_Latitude;
except
//何もしない
end;
end;
佐藤様 イベントの取得方法の自動化、勉強になりました。早速つかわせていただきます。
ツイート | ![]() |