1

ここでの回答を使用して、クエリをセットアップしました。

https://stackoverflow.com/a/1006668/211457

私はこのクエリを実行しています:

SELECT  * 
FROM    users 
WHERE   MBRContains(LineFromText(CONCAT( 
    '('    , 39.76784253493 + 10 / ( 111.1 / cos(RADIANS(39.76784253493)))
    , ' '
    , -75.871009379625 + 10 / 111.1
    , ','
    , 39.76784253493 - 10 / ( 111.1 / cos(RADIANS(-75.871009379625)))
    , ' '
    , -75.871009379625 - 10 / 111.1 
    , ')' ))
    ,location)

私のデータベースには次のエントリがあります

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `location` point NOT NULL,
  PRIMARY KEY (`id`),
  SPATIAL KEY `sx_place_location` (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `users` (`id`, `location`)
VALUES
    (1,X'000000000101000000E17A14AE47E1434088855AD3BCF752C0'),   
    (2,X'000000000101000000E9FF1F9EBEF752C0440008AA48E24340');

クエリで使用した値であるため、2 番目の行が返されると予想される場合、結果は返されません。私が確認したことの1つは、経度と緯度の値を切り替えたかどうかですが、どちらの場合も何も返されません。クエリで Explain を実行すると、「const テーブルを読み取った後に WHERE が認識されませんでした」と表示されます。MySQL 5.1.39 を使用しています。

エクスポートは何らかのエンコーディングまたはポイントであるため、ここにスクリーンショットがあります。余分な列は無視してください。

スクリーンショット

編集:Postgresqlに切り替えました。同様のクエリはより短く、機能します。

4

1 に答える 1

1

これにはPostgresqlを使用しましたが、はるかに簡単でした。

近くのユーザーを見つけるために使用したクエリは次のとおりです。

$sql="SELECT *, st_astext(location_geometry) as latlon FROM users where id != ? and age between ? and ? $gender_sql $interested_in_sql and id not in (評価された to_id から from_id = ? を選択) ORDER BY location_geometry <-> " ." st_setsrid(st_makepoint(?,?),4326) LIMIT 10";

これは <-> 演算子を使用します。この場合、経度緯度列をソートします。$gender_sql と $interested_in_sql はアプリ固有であるため、無視できます。

st_makepoint の 2 つのパラメーターは、緯度と経度です。

これは PostGIS エクステンションを使用します。Bitnami を使用してサーバー ソフトウェアをインストールしましたが、その拡張機能はデフォルトで有効になっていました。

于 2014-03-29T01:18:41.043 に答える