質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

866閲覧

GEOMETRY型SQL文の実行結果がおかしい

capella

総合スコア45

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/07/31 13:05

いつもお世話になっております。
現在PHP+MySQL5系(MariaDB)で、特定の施設に対し近隣の施設3箇所を表示するスクリプトを作っているのですが、思ったような結果が得られず困っております。SQL文に変数で入れた場合と、直接座標を書き込んだ場合で大きく結果が異なるのです。
手順は以下の通りです。

ベースになる施設の座標は以下のSQLで取得

SQL

1select X(s_location),Y(s_location) from shisetsu where id = 15;

上記で得られた結果を変数に入れる

PHP

1$lat = $location[0]; 2$lng = $location[1];

座標が取得できているか確認のため表示してみる → OK

PHP

1echo $lat; // 35.65802690046396 2echo $lng; // 139.74535764076472

次に上記座標を基点に近隣施設3箇所を表示させます。

SQL

1SELECT X(s_location) as lng,Y(s_location) as lat, 2(6371*acos(cos(radians( $lat ))*cos(radians(Y(s_location)))*cos(radians(X(s_location))-radians( $lng ))+sin(radians( $lat ))*sin(radians(Y(s_location))))) as distance 3 from shisetsu order by distance LIMIT 1,3";

↑この書き方では実際と大きく異なる結果になってしまうのですが、

SQL

1SELECT X(s_location) as lng,Y(s_location) as lat, 2(6371*acos(cos(radians( 35.65802690046396 ))*cos(radians(Y(s_location)))*cos(radians(X(s_location))-radians( 139.74535764076472 ))+sin(radians( 35.65802690046396 ))*sin(radians(Y(s_location))))) as distance 3 from shisetsu order by distance LIMIT 1,3";

のように、$lat、$lngを実際の座標の値に置き換えると期待通りの結果が表示されます。SQL文の書き方か変数の取扱いがおかしいのでしょうか?MySQLのGEOMETRY型を使うのは今回が初めてで、よく分かっていない部分も多々あるのですが、アドバイス頂けたら幸いです。何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

モヤモヤしますが、SQL文そのものを変えてなんとか自己解決しました。

SQL

1SELECT X(s_location) as lng,Y(s_location) as lat, ST_Distance_Sphere(GeomFromText('POINT($lat $lng)'),GeomFromText(ASTEXT(s_location)) ) AS distance FROM shisetsu order by distance LIMIT 1,3;

座標系は面白いんですがなかなか難しいですね。
今後またハマりそうなのでまた質問しそうです…
引き続きよろしくお願いいたします。

投稿2021/08/01 07:02

capella

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問