微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

假设我的数据库中有许多几何图形.我想在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;
逻辑可以包装到一个函数中,但我建议使用查询来测试逻辑.您将遇到的困难是线性距离(英里)与角度坐标(纬度和经度)相结合.此外,上面指定的几何类型没有SRID或几何类型.我猜它应该是几何(Point,4326).

您可以尝试一些策略,例如使用地理类型,它可以自动使用仪表来处理ST_distance或ST_DWithin等功能.下面的示例只使用ST_distance_Sphere,从英里到米的转换让你前进.或者,如果您需要演奏,可以尝试使用< - >功能indexed nearest neighbour search.

您可以尝试以下方法

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);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐