PostGIS:找到最接近给定点的几何体

Joh*_*ith 7 postgresql postgis geolocation geospatial openlayers

假设我的数据库中有许多几何图形.我想在PostgreSQL中创建一个函数,我可以传入lat/long并让它返回给定半径的距离(线性和公路)最接近的几何.

我是这个的新手,所以任何建议都表示赞赏.

我正在运行以下版本:

  • 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;
Run Code Online (Sandbox Code Playgroud)

Mik*_*e T 4

逻辑可以包装到函数中,但我建议使用查询来测试逻辑。您将遇到的困难是线性距离(英里)与角坐标(纬度和经度)的结合。此外,上面指定的几何类型没有 SRID 或几何类型。我猜应该是geometry(Point,4326)

您可以尝试一些策略,例如使用geography类型,它会自动使用计量器来表示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;
Run Code Online (Sandbox Code Playgroud)

进而:

SELECT WhatAmINear(44.9, -93.1, 100);
Run Code Online (Sandbox Code Playgroud)