加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 18:09:23 所属栏目:百科 来源:网络整理
导读:假设我的数据库中有许多几何图形.我想在PostgreSQL中创建一个函数,我可以传入lat / long并让它返回给定半径的距离(线性和公路)最接近的几何. 我是这个的新手,所以任何建议都表示赞赏. 我正在运行以下版本: PostgreSQL:9.2 PostGIS:2.0 这是架构: -- ----
假设我的数据库中有许多几何图形.我想在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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读