Postgresql:常用PostGIS函数实践

一、数据

https://lbs.amap.com/api/javascript-api/example/marker/adaptive-show-multiple-markers

从高德开放API中获取一些路口、路段的经纬度坐标,经偏移转换坐标系等处理后得到以下结果:

1.路口表

DROP TABLE IF EXISTS "public"."hangzhou_node_data";
CREATE TABLE "public"."hangzhou_node_data" (
"id" varchar(50) COLLATE "default" NOT NULL,
"node_name" varchar(50) COLLATE "default",
"geom" "public"."geometry"
)
WITH (OIDS=FALSE)
;
INSERT INTO "public"."hangzhou_node_data" VALUES ('2726e53b-1e23-4a93-a972-5f8b004adc7c', '平海路-东坡路', '0101000020E6100000594390C66C0A5E404DB52E8502413E40');

2.路段表

DROP TABLE IF EXISTS "public"."hangzhou_roadsect_data";
CREATE TABLE "public"."hangzhou_roadsect_data" (
"id" varchar(50) COLLATE "default" NOT NULL,
"up_node" varchar(50) COLLATE "default" NOT NULL,
"down_node" varchar(50) COLLATE "default" NOT NULL,
"geom" "public"."geometry"
)
WITH (OIDS=FALSE)
;
INSERT INTO "public"."hangzhou_roadsect_data" VALUES ('037ab2e8-e738-4a05-ae1d-36d84f6bb308', '平海路-东坡路', '解放路-南山路', '0102000020E610000002000000151AD0736B0A5E4035F3AC3E21403E401EA7BC4E6B0A5E40FB89D7DCFC403E40');
INSERT INTO "public"."hangzhou_roadsect_data" VALUES ('0bc08a18-457b-4ddc-9b5c-0d6bde8c0c3a', '解放路-南山路', '平海路-东坡路', '0102000020E610000002000000EFE34B406E0A5E405A54C6E2FC403E40E2565F656E0A5E40D4CA9B4421403E40');
INSERT INTO "public"."hangzhou_roadsect_data" VALUES ('d612579c-a8b1-45e4-8543-a56075ae03fe', '平海路-东坡路', '平海路-延安路', '0102000020E610000002000000B5BFFD4A7F0A5E400ACDD7A600413E4050A8977A6E0A5E40888E93B9FD403E40');
INSERT INTO "public"."hangzhou_roadsect_data" VALUES ('fc595cee-c408-409c-b24d-e24030aaa927', '平海路-延安路', '平海路-东坡路', '0102000020E6100000020000008341AD546E0A5E408889FCE107413E40E75813257F0A5E408A7A40CF0A413E40');

二、PostGIS函数实践

1.ST_Centroid 找中点

SELECT
    hrd.up_node,
    st_astext (hnd1.geom) up_coor,
    hrd.down_node,
    st_astext (hnd2.geom) down_coor,
    st_astext (hrd.geom) roadsect_coor,
    st_astext (ST_Centroid(hrd.geom)) center_coor
FROM
    hangzhou_roadsect_data hrd
LEFT JOIN hangzhou_node_data hnd1 ON hnd1.node_name = hrd.up_node
LEFT JOIN hangzhou_node_data hnd2 ON hnd2.node_name = hrd.down_node

结果:

平海路-东坡路 POINT(120.162889138109 30.253944705871) 平海路-延安路 POINT(120.164115046587 30.2539980542926)    LINESTRING(120.164019344141 30.2539161946161,120.162993095496 30.2538715348478) POINT(120.163506219818 30.253893864732)

展示:
2为1、3中点


中点.png

2.ST_ClosestPoint 线上离某点最近的点

SELECT
    hnd.node_name,
    st_astext (hnd.geom) node_coor,
    st_astext (
        '0102000020E61000000200000083DD1858830A5E408F1A04365D3F3E4011F22A1F690A5E408AA7ED36673F3E40'
    ) line_coor,
    st_astext (
        ST_ClosestPoint (
            '0102000020E61000000200000083DD1858830A5E408F1A04365D3F3E4011F22A1F690A5E408AA7ED36673F3E40',
            hnd.geom
        )
    ) center
FROM
    hangzhou_node_data hnd
WHERE
    hnd."id" = 'cf796fd3-c6df-4bd3-b560-d56b360bcb36'

结果:

西湖大道-劳动路    POINT(120.162552724743 30.2459615269731)    LINESTRING(120.164266609461 30.2475160369891,120.162666122378 30.2476686792575) POINT(120.162715094481 30.2476640086713)

展示:
3、2为路段,1为目标路口,4为最近目标


某路段上距离某路口最近的坐标.png

3.ST_Distance 两点间距离

SELECT
    hrd.up_node,
    hrd.down_node,
    round(
        ST_Distance (
            ST_Transform (hnd1.geom, 3857),
            ST_Transform (hnd2.geom, 3857)
        ) :: NUMERIC,
        2
    )
FROM
    hangzhou_roadsect_data hrd
LEFT JOIN hangzhou_node_data hnd1 ON hnd1.node_name = hrd.up_node
LEFT JOIN hangzhou_node_data hnd2 ON hnd2.node_name = hrd.down_node

结果:

西湖大道-延安路    开元路-延安路 201.89
劳动路-开元路 开元路-延安路 201.47
南山路-开元路 劳动路-开元路 214.42
南山路-开元路 西湖大道-南山路    237.18
西湖大道-南山路    南山路-开元路 237.18

展示:
西湖大道-延安路开元路-延安路为例测量结果为例:

两个路口间的距离.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352