WinBinderを使うと、PHPで作成したインターネット利用アプリを簡単に Windows アプリに移植できる。ここでは、「PHPで住所から緯度経度を求める」でつくったプログラムを Windows アプリとして移植してみよう。
0001: <?php
0002: /** adr2geo.phpw
0003: * 住所から緯度経度を求める(MapFanを利用)
0004: *
0005: * @copyright (c)studio pahoo
0006: * @author パパぱふぅ
0007: * @version 1.0 2006/02/06
0008: */
0009: include "./include/winbinder.php"; //WinBinder ライブラリをインクルード
0010: mb_internal_encoding("Shift_JIS"); //内部コードは SHIFT-JISに統一
0011:
0012: //通常のユーザー関数定義 =====================================================
0013: //グローバル変数
0014: $url = "http://www.mapfan.com/keywordsrch.cgi"; //mapfan
0015: $method = "POST";
0016: $post["SRCHKIND"] = "SRCH_ADR";
0017:
0018: /**
0019: * HTTP通信を行う
0020: * @param string $url "http://" から始まるURL
0021: * @param string $method GET,POST,HEAD (省略時はGET)
0022: * @param string $headers その他の任意のヘッダ (省略時は"")
0023: * @param array $post POST変数を格納した連想配列("変数名"=>"値") (省略時はNULL)
0024: * @param string $cookie Cookie(利用するときは常に$method="POST") (省略時は"")
0025: * @return string 取得したコンテンツ/FALSE 取得エラー
0026: */
0027: function http($url, $method="GET", $header="", $post=NULL, $cookie="") {
0028: if ($cookie != "") $method = "POST";
0029:
0030: $URL = parse_url($url);
0031:
0032: $URL["query"] = isset($URL["query"]) ? $URL["query"] : ""; //クエリ
0033: $URL["port"] = isset($URL["port"]) ? $URL["port"] : 80; //ポート番号
0034:
0035: //リクエストライン
0036: $request = $method . " " . $URL["path"] . $URL["query"] . " HTTP/1.1\r\n";
0037:
0038: //リクエストヘッダ
0039: $request .= "Host: " . $URL["host"] . "\r\n";
0040: $request .= "User-Agent: PHP/" . phpversion() . "\r\n";
0041:
0042: //Basic認証用のヘッダ
0043: if (isset($URL["user"]) && isset($URL["pass"])) {
0044: $request .= "Authorization: Basic " . base64_encode($URL["user"] . ":" . $URL["pass"]) . "\r\n";
0045: }
0046:
0047: //追加ヘッダ
0048: $request .= $headers;
0049:
0050: //POSTの時
0051: if (strtoupper($method) == "POST") {
0052: while (list($name, $value) = each($post)) {
0053: $POST[] = $name . "=" . urlencode($value);
0054: }
0055: $postdata = implode("&", $POST);
0056: $request .= "Content-Type: application/x-www-form-urlencoded\r\n";
0057: $request .= "Content-Length: " . strlen($postdata) . "\r\n";
0058: if ($cookie != "") $request .= "Cookie: $cookie\r\n";
0059: $request .= "\r\n";
0060: $request .= $postdata;
0061: } else {
0062: $request .= "\r\n";
0063: }
0064:
0065: //接続
0066: $fp = fsockopen($URL["host"], $URL["port"]);
0067: //エラー処理
0068: if (!$fp) return FALSE;
0069:
0070: //リクエスト送信
0071: fputs($fp, $request);
0072:
0073: //応答データ受信
0074: $response = "";
0075: while (!feof($fp)) $response .= fgets($fp);
0076:
0077: fclose($fp);
0078:
0079: return $response;
0080: }
0081:
0082:
0083: /**
0084: * 住所→緯度・経度変換
0085: * @param string $adr 住所
0086: * @return string 緯度・経度(テキスト)
0087: */
0088: function geo($adr) {
0089: global $post, $url, $method;
0090:
0091: $post["PARAM"] = mb_convert_encoding($adr, "EUC-JP", "Shift_JIS");
0092:
0093: $result = http($url, $method, "", $post);
0094:
0095: preg_match("/(Location: http)(.*)/", $result, $arr);
0096:
0097: if (isset($arr[2]) == FALSE) {
0098: echo "住所を正確に入力してください";
0099: exit(1);
0100: }
0101: $url2 = "http" . $arr[2];
0102:
0103: $result = file_get_contents($url2);
0104:
0105: //緯度経度
0106: preg_match("/var MAP = \"E([0-9]*)\.([0-9]*)\.([0-9]*)\.([0-9]*)N([0-9]*)\.([0-9]*)\.([0-9]*)\.([0-9]*)\"/", $result, $arr);
0107: $str = sprintf("東経 %d度%d分%d.%d秒、北緯 %d度%d分%d.%d秒 \n",
0108: $arr[1], $arr[2], $arr[3], $arr[4], $arr[5], $arr[6], $arr[7], $arr[8]);
0109:
0110: // preg_match("/var MAP = \"([A-Z|0-9|\.]*)\"/", $result, $arr);
0111: // printf("(%s)<br />\n", $arr[1]);
0112:
0113: //$s = mb_convert_encoding("/〒([0-9|\-]*)/", "EUC-JP", "Shift_JIS");
0114: //preg_match($s, $result, $arr);
0115: //printf("郵便番号 %s<br />\n", $arr[1]); //おまけ
0116:
0117: return $str;
0118: }
0119:
0120: // WinBinder 専用 ============================================================
0121: //イベントIDの定義
0122: if (!defined("IDCLOSE")) define("IDCLOSE", 9);
0123: if (!defined("ID_ABOUT")) define("ID_ABOUT", 1);
0124: if (!defined("IDC_EDIT_ADR")) define("IDC_EDIT_ADR", 1001);
0125: if (!defined("IDC_BUTTON_EXEC")) define("IDC_BUTTON_EXEC", 1002);
0126: if (!defined("IDC_LABEL_RESULT")) define("IDC_LABEL_RESULT", 1003);
0127:
0128: //メインウィンドウ生成
0129: $mainwin = wb_create_window(NULL, AppWindow,"緯度・経度を求める", WBC_CENTER, WBC_CENTER, 450, 250, 0, 0);
0130:
0131: //イベントハンドラの設定
0132: wb_set_handler($mainwin, "process_main");
0133:
0134: //コントロールの生成
0135: $edit_adr = wb_create_control($mainwin, EditBox, "", 20, 20, 280, 24, IDC_EDIT_ADR, WBC_VISIBLE | WBC_ENABLED, 0);
0136: wb_create_control($mainwin, PushButton, "実行", 320, 20, 80, 24, IDC_BUTTON_EXEC, WBC_VISIBLE | WBC_ENABLED, 0);
0137: $label_result = wb_create_control($mainwin, Label, "", 20, 80, 300, 24, IDC_LABEL_RESULT, WBC_VISIBLE | WBC_ENABLED, 0);
0138:
0139: //メニューバーの生成
0140: $mainmenu = wb_create_control($mainwin, Menu, array(
0141: "ファイル(&F)",
0142: array(IDCLOSE, "終了(&X)\tCtrl+Q", "", "", "Ctrl+Q"),
0143: "ヘルプ(&H)",
0144: array(ID_ABOUT, "バージョン情報(&A)", "", "", "")
0145: ));
0146:
0147: /**
0148: * イベントハンドラ
0149: * @param obj $window メインウィンドウ
0150: * @param int $id イベントID
0151: */
0152: function process_main($window, $id) {
0153: global $edit_adr, $label_result;
0154:
0155: switch($id) {
0156: case IDC_BUTTON_EXEC: //ボタンが押された
0157: $adr = wb_get_text($edit_adr);
0158: wb_set_text($label_result, geo($adr));
0159: break;
0160: case ID_ABOUT:
0161: wb_message_box($window, "バージョン 1.0", APPNAME, WBC_OK);
0162: break;
0163: case IDCLOSE:
0164: wb_destroy_window($window); //ウィンドウを破棄
0165: break;
0166: }
0167: }
0168:
0169: //アプリケーションループ
0170: wb_main_loop();
0171: ?>
| 2006年02月28日更新 | ||
| <<前へ | <目次> | 次へ>> |
| 戻る | 【関連ページ】 | |