openlayer5 半径不准 画圆_postgis - Openlayers 3圆形半径,以米为单位 - 堆栈内存溢出...

ol.geom.Circle可能不代表圆圈

OpenLayers Circle几何在投影平面上定义。 这意味着它们在地图上始终是圆形的,但所覆盖的区域可能并不代表地球上的实际圆。 圆圈所覆盖区域的实际形状和大小取决于所使用的投影。

这可以通过天梭的指标来显示,其显示当投影到平面上时地球上的圆形区域如何变换。 使用投影EPSG:3857,这看起来像:

图像来自OpenLayer 3的天梭示例 ,显示半径为800 000米的区域。 如果将这些圆圈绘制为半径为800000的ol.geom.Circle (使用EPSG:3857),则它们在地图上的大小都相同,但靠近极点的那些将代表地球的小得多的区域。

对于OpenLayers几何体的大多数事情都是如此。 几何的半径,长度或面积都在投影平面中报告。

因此,如果您有ol.geom.Circle ,获取实际表面半径将取决于投影和ol.geom.Circle位置。 对于某些投影(例如EPSG:4326),由于几何图形甚至可能不代表圆形区域,因此不会有准确的答案。

但是,假设您正在使用EPSG:3857而不是绘制极大的圆圈或非常接近极点,圆圈将是圆形区域的良好表示。

ol.proj.METERS_PER_UNIT

ol.proj.METERS_PER_UNIT只是米和其他单位之间的转换表。 ol.proj.METERS_PER_UNIT['m']将始终返回1 ,因为单位'm'是米。 EPSG:3857使用米作为单位,但如上所述,它们向极点扭曲。

解决方案(阅读后了解并理解上述内容)

要获得ol.geom.Circle的实际地面半径,您必须找到圆的中心与其边缘上的点之间的距离。 这可以使用ol.Sphere来完成:

var center = geometry.getCenter()

var radius = geometry.getRadius()

var edgeCoordinate = [center[0] + radius, center[1]];

var wgs84Sphere = new ol.Sphere(6378137);

var groundRadius = wgs84Sphere.haversineDistance(

ol.proj.transform(center, 'EPSG:3857', 'EPSG:4326'),

ol.proj.transform(edgeCoordinate, 'EPSG:3857', 'EPSG:4326')

);

更多选择

如果要在地球上添加表示圆形区域的几何图形,则应考虑使用上述天梭示例中使用的方法。 也就是说,定义具有足够点的正多边形以显得平滑。 这将使它可以在投影之间转换,并且看起来就像你在做服务器端。

var circularPolygon = ol.geom.Polygon.circular(wgs84Sphere, center, radius, 64);

还有ol.geom.Polygon.fromCircle ,它接受ol.geom.Circle并将其转换为代表相同区域的Polygon。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值