我试图构建一个函数来创建一个Ellipse,而不需要通过经典的编程语言。 我将这些参数存储在自定义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))
此功能在挪威附近创建一个椭圆。试试:http://geojson.io/#map=11/69.5354/11.1216
原来的中心在瑞士。
这个功能有两大问题: 1.椭圆不在坐标中心; 2.我不知道如何将缩放的xFactor / yFactor转换为匹配米参数;
PS。这是上述功能的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))
答案 0 :(得分:0)
欢迎使用Stack Overflow!我不确定我完全理解参数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));
将围绕给定点(瑞士南部)绘制缓冲区:
注意:使用GEOMETRY
和GEOGRAPHY
的计算方式不同,结果也是如此。 GEOGRAPHY
计算球面上的坐标(可能比GEOMETRY
慢得多)并使用meters
作为度量单位,而GEOGRAPHY
使用平面投影并使用SRS单位。 (来自this answer
的文字)
答案 1 :(得分:0)
第一个问题是您使用中心的原始坐标来平移几何图形。 (我的意思是st_translate()中的deltax和deltay)
据我了解,增量应该是您需要和实际拥有的坐标之间的差。 因此解决方案是计算初步的(移动的)多边形:
prePoly := ST_Rotate( ST_Scale( ST_Buffer(ST_Point(8.54736328125,46.37156925087649)::geography,
3000):: geometry,0.3,0.5):: geometry,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轴拉长。