PostGIS - 创建椭圆

3
我将尝试构建一个函数来创建一个椭圆,而无需通过传统的编程语言。 我已经把这些参数存储在自定义的GeoJSON中。 小边和大边必须用米来表示。结果几何图形必须使用EPSG 4326创建:
我的参数是:
 "geography" : {"type":"Ellipse",
                    "smallSide":100,
                    "bigSide" : 110,
                    "rotation" : 0,
                    "coordinates":[8.54736328125,46.37156925087649]}

在网上搜索时,我找到了一种非常接近解决我的问题的解决方案:
ST_AsEWKT(ST_Translate( ST_Rotate( ST_Scale( ST_Buffer(ST_Point(8.54736328125,46.37156925087649)::geography, 3000)::geometry, 0.3,0.5)::geometry, 0), 8.54736328125,46.37156925087649))

该函数创建了一个椭圆形,位于挪威附近。可以使用以下链接进行尝试:http://geojson.io/#map=11/69.5354/11.1216

原始中心点位于瑞士。

该函数存在两个大问题: 1. 该椭圆不在给定的坐标中心; 2. 我不知道如何将比例尺的 xFactor/yFactor 转换为匹配米参数;

备注:以上函数的 WKT 如下:

SRID=4326;POLYGON((11.123273576134 69.5574277440815,11.1230606869505 69.5547928070317,11.1224064250309 69.55225640052,11.1213360407351 69.5499159578464,11.1198907409861 69.547861360983,11.1181260946945 69.5461714955871,11.1161098932273 69.5449112303195,11.1139195487472 69.544128934906,11.1116391298573 69.5438546306632,11.1093561468668 69.5440988431489,11.1071582077927 69.5448522000687,11.1051296707337 69.5460857895281,11.1033484183676 69.5477522651534,11.1018828760511 69.5497876565102,11.100789386429 69.5521138166206,11.1001100408036 69.554641414163,11.099871051113 69.5572733570283,11.1000817266595 69.5599085170987,11.1007340973332 69.5624456140896,11.1018032006992 69.5647871095818,11.1032480248444 69.5668429613212,11.105013073265 69.5685340926073,11.107030493374 69.5697954420587,11.1092226874817 69.5705784748924,11.1115053053956 69.5708530575261,11.1137905020249 69.5706086220194,11.1159903323456 69.5698545746198,11.1180201503338 69.568619932341,11.1198018783021 69.5669522018393,11.1212670184877 69.5649155445927,11.1223592894673 69.5625883002992,11.1230367854657 69.5600599653373,11.123273576134 69.5574277440815))

相关:https://gis.stackexchange.com/questions/248260/making-ellipse-geometry-from-some-known-parameters-using-postgis - JGH
@JGH:你提供的解决方案是基于两个点,但我只有中心点而没有对称点。 - EviSvil
2个回答

0

第一个问题是您使用原始中心坐标来转换几何图形。(我指的是st_translate()中的deltax和deltay)

据我所知,delta应该是您需要的坐标与实际拥有的坐标之间的差异。 因此,解决方案是计算初步(移位)多边形:

prePoly := ST_Rotate( ST_Scale(       ST_Buffer(ST_Point(8.54736328125,46.37156925087649)::geography,

3000)::几何图形, 0.3,0.5)::几何图形, 0);

然后计算增量进行翻译:

st_translate(prePoly, 8.54736328125 - st_x(ST_Centroid(prePoly)),46.37156925087649 - st_y(ST_Centroid(prePoly)))

我不确定我是否正确理解了第二个问题,但如果您最初有以米为单位的大和小边,您可以将其中一个(例如,大的那个)作为缓冲区的半径,然后计算

xFactor = smallSide/bigSide, and yFactor = 1

在这种情况下,您的椭圆将沿着Y轴被拉长。


0
欢迎来到Stack Overflow!我不太确定我是否理解了参数bigSidesmallSide,但如果您只是想使用米作为参数创建一个点周围的缓冲区,您可以使用以下代码:
SELECT 
  ST_AsText(
    ST_Rotate(
      ST_Buffer(
         ST_GeomFromText('SRID=4326;POINT(8.54736328125 46.37156925087649)')::GEOGRAPHY,3000, 'quad_segs=16')::GEOMETRY,0));

这将在给定点(瑞士南部)周围绘制一个缓冲区:

enter image description here

注意:使用 GEOMETRYGEOGRAPHY 进行计算的过程不同,因此它们的结果也不同。GEOGRAPHY 计算球面上的坐标(可能比 GEOMETRY 慢得多),并使用 作为单位进行测量,而 GEOMETRY 使用平面投影,并使用 SRS 单位。(摘自 this answer


你好!感谢你的回答。椭圆是一个缩小的圆,因此bigSide是原始直径,而smallSide是小于原始直径的小“直径”。 - EviSvil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接