【问题标题】:How to create pie wedge (sector) in PostGis by coordinates and azimuth?如何通过坐标和方位角在 PostGis 中创建饼形楔形(扇区)?
【发布时间】:2022-07-22 20:30:13
【问题描述】:

我找不到正确答案并尝试在 PostGis 中创建函数,该函数返回几何类型的多边形。 此功能可用于在地图上可视化蜂窝网络拓扑。 您可以在下面找到 PostGis 的此函数,该函数具有下一个输入参数: lon 、 lat 、 azimuth 、 distance 、 width 。 距离 - 饼图的长度; width - 饼图的宽度。

create or replace function sector_3(lon float, lat float, azimuth float, distance integer, width integer)
returns geometry
language plpgsql
as
$$
declare
   sector geometry;
begin
    sector = ST_MakePolygon(ST_MakeLine(ARRAY[ST_SetSRID(ST_MakePoint(lon,lat),4326),
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth-(width/2))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth-(width/2-1*(width/2/5)))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth-(width/2-2*(width/2/5)))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth-(width/2-3*(width/2/5)))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth-(width/2-4*(width/2/5)))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth)/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth+(width/2-4*(width/2/5)))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth+(width/2-3*(width/2/5)))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth+(width/2-2*(width/2/5)))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth+(width/2-1*(width/2/5)))/180.0)::geometry,
                ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, pi()*(azimuth+(width/2))/180.0)::geometry,                                   
                ST_SetSRID(ST_MakePoint(lon,lat),4326)  
                     ]));
   return sector;
end;
$$;

因此,您将看到从给定点(经度、纬度)开始并具有给定距离(长度)和宽度的扇区。 visualisation of sector

【问题讨论】:

  • 这个功能不工作吗?你到底有什么问题?

标签: postgresql postgis


【解决方案1】:

我相信我不太了解您的功能中的问题 - 如果有的话。但是您可以通过从参数distancelonlat 创建缓冲区来简化事情,并根据azimuthdistance 创建一个线串,将其用作切割切片的刀片缓冲区,例如

WITH j (geom,azimuth,distance,width) AS (
  VALUES (ST_SetSRID(ST_MakePoint(38.94,45.05),4326),90,120,40)
)
SELECT  
  ST_GeometryN(
    ST_Split(
      ST_Buffer(geom::geography,distance)::geometry,
      ST_MakeLine(ARRAY[
        ST_Project(geom,distance+1,radians(azimuth))::geometry, geom,
        ST_Project(geom,distance+1,radians(azimuth+width))::geometry]
      )
   ),2)::geography
FROM j;

使用ST_Project 调用来创建适合您用例的刀片。

【讨论】:

    猜你喜欢
    • 2019-06-21
    • 1970-01-01
    • 2017-10-26
    • 2021-08-30
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    相关资源
    最近更新 更多