我找不到正确的答案,试图在PostGis中创建函数,该函数返回几何类型的多边形。该函数可用于在地图上可视化蜂窝网络拓扑结构。下面你可以找到PostGis的这个函数,它有下一个输入参数: lon,lat,方位,距离,宽度。馅饼的距离长度;馅饼的宽度。
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;
$$;因此,您将看到扇区,它从给定的点(龙,lat)和给定的距离(长度)和宽度开始。

发布于 2022-10-06 06:09:45
create or replace function sector_make(lon float, lat float, azimuth float, distance integer, width integer)
returns geometry
language plpgsql
as
$$
declare
sector geometry;
i integer;
begin
sector = ST_SetSRID(ST_MakePoint(lon,lat),4326);
for i in (select 0-width/2)..(select width/2)
loop
sector=ST_UNION(sector,ST_Project(ST_SetSRID(ST_MakePoint(lon,lat),4326)::geography, distance, radians(azimuth+i))::geometry);
end loop;
return ST_MakePolygon(ST_MakeLine(ARRAY[sector,ST_SetSRID(ST_MakePoint(lon,lat),4326)]));
end;
$$;https://stackoverflow.com/questions/73051042
复制相似问题