【问题标题】:PostGIS: Find closest geometry to given pointPostGIS:找到最接近给定点的几何图形
【发布时间】:2012-12-12 11:50:02
【问题描述】:

假设我的数据库中有许多几何图形。我想在 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;

【问题讨论】:

  • PostgreSQL 和 PostGIS 版本?有关您的数据库架构的一些信息?请详细说明。
  • 对于模式,我有一个美国城市表,字段包括 gid (int4),st_fips (varchar(4),county_fip (varchar(4) cfips varchar(4),pl_fips varchar(7) ),id varchar(20),name varchar(39),elevation varchar(60),pop_1990 numeric,pop_1990 numeric,pop_1990 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.
  • @craig-ringer,我正在寻找一种功能,我可以将它称为 WhatAmINear(lat, long, radius, num) 并让它返回最近的 num 个城市给定半径。例如,如果我将其命名为 WhatAmINear(lat1, lon1, 100, 5),它将返回距离我所在位置 100 英里半径内最近的 5 个城市。如果小于 5 在该范围内,则只返回那些。
  • 您似乎没有阅读我评论的第一部分。 请提供版本。编辑您的问题并添加您在评论中添加的架构、您的版本以及您认为相关的任何其他信息。
  • 谢谢,@craig-ringer。我昨天确实最初放入了版本,但保存时遇到了问题。我一定是不小心删除了它们。版本和 SQL 已发布。感谢您的意见。

标签: postgresql geolocation openlayers geospatial postgis


【解决方案1】:

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

您可以尝试一些策略,例如使用geography 类型,它会自动使用计量器来执行ST_DistanceST_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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2012-08-05
    • 2011-07-03
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多