Postgresql PostGIS-创建椭圆

Postgresql PostGIS-创建椭圆,postgresql,postgis,Postgresql,Postgis,我试图建立一个函数来创建一个椭圆,而不经过经典的编程语言。 我将这些参数存储在自定义GeoJSON中。 smallSide和bigSide必须以米表示。必须使用EPSG 4326创建生成的几何体: 我的参数是: "geography" : {"type":"Ellipse", "smallSide":100, "bigSide" : 110, "rotation" : 0,

我试图建立一个函数来创建一个椭圆,而不经过经典的编程语言。 我将这些参数存储在自定义GeoJSON中。 smallSide和bigSide必须以米表示。必须使用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))
此函数用于在挪威附近创建椭圆。尝试:

最初的中心在瑞士

此函数有两个大问题: 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))

欢迎来到堆栈溢出!我不确定我是否完全理解参数
bigSide
smallSide
,但如果您仅尝试使用米作为参数在点周围创建缓冲区,则可以使用以下方法:

SELECT 
  ST_AsText(
    ST_Rotate(
      ST_Buffer(
         ST_GeomFromText('SRID=4326;POINT(8.54736328125 46.37156925087649)')::GEOGRAPHY,3000, 'quad_segs=16')::GEOMETRY,0));
将在给定点(瑞士南部)周围绘制缓冲区:


注意:使用
几何
地理
进行的计算是不同的,其结果也是不同的<代码>地理计算球面上的坐标(可能比
几何
慢得多),并使用
作为测量单位,而
地理
使用平面投影并使用SRS单位。(文本自)

第一个问题是使用中心的原始坐标来平移几何体。(我指的是圣卢西亚的德尔塔克斯和德尔泰)

据我所知,delta应该是你需要的坐标和实际坐标之间的差值。 因此,解决方案是计算初始(移动)多边形:

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和yFactor=1


在这种情况下,您的椭圆将沿Y轴延伸。

related:@JGH:您链接的解决方案基于两个点,但我只有中心点,没有相反的点。您好!谢谢你的回答。椭圆是一个缩小的圆,所以bigSide是原始直径,smallSide是比原始直径小的“直径”。
st_translate(prePoly, 8.54736328125 - st_x(ST_Centroid(prePoly)),46.37156925087649 - st_y(ST_Centroid(prePoly)))