7

データベースに多数のジオメトリがあるとします。PostgreSQL 内に関数を作成して、緯度/経度を渡して、指定された半径の距離 (線形および道路) で最も近いジオメトリを返すようにしたいと考えています。

私はこれに慣れていないので、アドバイスをいただければ幸いです。

次のバージョンを実行しています。

  • PostgreSQL: 9.2
  • PostGIS: 2.0

スキーマは次のとおりです。

-- ----------------------------
--  Table structure for "cities-usa"
-- ----------------------------
DROP TABLE IF EXISTS "cities-usa";
CREATE TABLE "cities-usa" (
"gid" int4 NOT NULL DEFAULT nextval('"cities-usa_gid_seq"'::regclass),
"st_fips" varchar(4),
"sfips" varchar(2),
"county_fip" varchar(4),
"cfips" varchar(4),
"pl_fips" varchar(7),
"id" varchar(20),
"name" varchar(39),
"elevation" varchar(60),
"pop_1990" numeric,
"population" varchar(30),
"st" varchar(6),
"state" varchar(16),
"warngenlev" varchar(16),
"warngentyp" varchar(16),
"watch_warn" varchar(3),
"zwatch_war" float8,
"prog_disc" int4,
"zprog_disc" float8,
"comboflag" float8,
"land_water" varchar(16),
"recnum" float8,
"lon" float8,
"lat" float8,
"geom" "geometry"
)
WITH (OIDS=FALSE);
ALTER TABLE "cities-usa" OWNER TO "postgres";

-- ----------------------------
--  Primary key structure for table "cities-usa"
-- ----------------------------
ALTER TABLE "cities-usa" ADD CONSTRAINT "cities-usa_pkey" PRIMARY KEY ("gid") NOT DEFERRABLE INITIALLY IMMEDIATE;
4

1 に答える 1

4

ロジックは関数にラップできますが、クエリを使用してロジックをテストすることをお勧めします。直線距離 (マイル) と角度座標 (緯度と経度) を組み合わせると、問題が発生します。また、上で指定されたジオメトリ タイプには、SRID またはジオメトリ タイプがありません。私はそれがあるべきだと思いますgeometry(Point,4326)

geography、 、 などの関数にメートルを自動的に使用する type を使用するなど、試すことができるいくつかの戦略がありST_DistanceますST_DWithin。以下の例ではST_Distance_Sphere、マイルからメートルへの変換を使用して作業を進めています。または、パフォーマンスが必要な場合は、インデックス付き最近傍検索<->の関数を試すことができます。

ここにあなたが試すことができるものがあります:

CREATE OR REPLACE FUNCTION WhatAmINear(lat float8, lon float8,
                                       radius_mi float8, num int DEFAULT 10)
    RETURNS SETOF "cities-usa" AS
$body$
SELECT *
FROM "cities-usa"
WHERE ST_Distance_Sphere(geom, ST_MakePoint(lon, lat)) <= radius_mi * 1609.34
LIMIT num;
$body$
LANGUAGE sql VOLATILE;

その後:

SELECT WhatAmINear(44.9, -93.1, 100);
于 2013-01-02T22:34:28.087 に答える