C++Builder を使い、駅すぱあとWebサービス(クラウド型API)を利用し
「駅情報」「路線情報」「会社情報」などの情報をRESTで取得する事が可能です。
今回テストしたデバイスはWindows(64Bit)とiOS10.1です。
[駅すぱあとWebサービス]
駅すぱあとWebサービスAPIを利用するには、ユーザー登録が必要です。
「駅情報」や「路線情報」のサービスに関しては無料のフリープランで商用利用可能ですので
まずフリープランの登録を行いました。
https://ekiworld.net/
上記サイトにアクセスし登録を行うとメールが送られてきます。
メールにはアクセスキー、ご登録ドメイン、ドキュメント(リファレンスマニュアル)が書かれています。
その中のアクセスキーが重要で このアクセスキーを使い各APIにアクセスできるようになります。
[駅すぱあとWebサービスフリープランで利用できるサービス]
上記のようなサービスです。
std::mapを使い エンドポイント一覧情報をもたせました。
////
enum TEki_apis_ {info, corporation, search_course_light, rail, line, station, station_light};
std::map FEndPoint{
{TEki_apis_::info, "/station/info"},
{TEki_apis_::corporation, "/corporation"},
{TEki_apis_::search_course_light, "/search/course/light"},
{TEki_apis_::rail, "/rail"},
{TEki_apis_::line, "/line"},
{TEki_apis_::station, "/station"},
{TEki_apis_::station_light, "/station/light"}};
[TRESTClientを使いクラウドAPI接続](code example)
TRESTClient、TRESTRequestを使い駅すぱあとWebサービスの各APIに接続しJSONを取得します
////
void __fastcall TEki_Api::UpdateExcect()
{
UnicodeString sUrl = FstBaseURL + FstEndPoint + "?key=" + FstEkiKey + CreateParameters(FEkiApis);
TThread::CreateAnonymousThread([this, sUrl](){
std::unique_ptr cl1{/*std::make_unique(*/new TRESTClient(nullptr)}; // TRESTClient* cl1 = new TRESTClient(nullptr);
std::unique_ptr re1{/*std::make_unique(*/new TRESTRequest(nullptr)}; //TRESTRequest* re1 = new TRESTRequest(nullptr);
re1->Client = cl1.get();
TJSONValue* jo{nullptr};
cl1->BaseURL = sUrl;
try{
re1->Execute();
jo = re1->Response->JSONValue;
}
catch(Exception& e1){}
TThread::Synchronize(TThread::CurrentThread, [&](){
http_json_out(jo);
});
})->Start();
}
[駅すぱあとWebサービス JSON](code example)
各API仕様を元にJSON情報を取得します
void __fastcall TForm1::DoEditStation(TObject *Sender)
{
UnicodeString s_js_function_;
unsigned int iMaxRecord{0};
if (!(Sender == nullptr)) {
TJSONObject* jv = static_cast(Sender);
String a = (static_cast( jv->GetValue("ResultSet") ))->ToString();
TJSONObject* jv2 = static_cast( jv->GetValue("ResultSet") );
Memo1->Lines->Append("max=" + static_cast(jv2->GetValue("max") )->Value());
iMaxRecord = StrToIntDef(static_cast(jv2->GetValue("max") )->Value(), 0);
TJSONArray* jv3 = static_cast( jv2->GetValue("Point") );
TJSONObject* jv4;
TJSONObject* jv5;
TJSONObject* jvGeoPoint_;
ListView1->BeginUpdate();
switch (iMaxRecord) {
case 0:
break;
case 1:
jv4 = static_cast( jv2->GetValue("Point") );
jv5 = static_cast( jv4->GetValue("Station") );
jvGeoPoint_ = static_cast( jv4->GetValue("GeoPoint") );
s_js_function_ = Format("toNearest(%s, %s)", ARRAYOFCONST((
jvGeoPoint_->GetValue("lati_d")->ToString(),
jvGeoPoint_->GetValue("longi_d")->ToString() )));
StationItemAdd(jv5, s_js_function_);
break;
default:
for (int i=0; i Count; i++){
jv4 = static_cast(jv3->Get(i));
jv5 = static_cast( jv4->GetValue("Station") );
jvGeoPoint_ = static_cast( jv4->GetValue("GeoPoint") );
s_js_function_ = Format("toNearest(%s, %s)", ARRAYOFCONST((
jvGeoPoint_->GetValue("lati_d")->ToString(),
jvGeoPoint_->GetValue("longi_d")->ToString())));
StationItemAdd(jv5, s_js_function_);
}
}
ListView1->EndUpdate();
ListView1->Visible = true;
ListView1->Width = FselEdit->Width;
ListView1->Position->X = FselEdit->Position->X;
ListView1->Position->Y = FselEdit->Position->Y + FselEdit->Height;
if (iMaxRecord > 0)
{
ListView1->ScrollTo(0);
}
}
}
[駅すぱあと路線図フリープラン]
駅すぱあと路線図を使うにはまた別の申し込みが必要です
これも同じく申し込み後メールでアクセスキーが送られてきます。
「Rosen JS」 と言うJavaScriptで作られた地図機能APIが提供されます。
C++Builder iOSのTLocationSensorを用いて緯度経度を取得しその情報を使い、
TWebBrowser(ブラウザ)からJSの関数EvaluateJavaScript()でキックすることにしました。