gpt4 book ai didi

postgis - Openlayers 3 圆半径(以米为单位)

转载 作者:行者123 更新时间:2023-12-03 15:11:01 25 4
gpt4 key购买 nike

获取方式Circle以米为单位的半径
可能这是现有问题,但我没有得到正确的结果。我正在尝试在 postgis 中创建具有相同半径和中心的多边形,这些半径和中心来自 openlayers 圆。

为了获得以米为单位的半径,我遵循了 this .
运行示例 link .

var radiusInMeters = circleRadius * ol.proj.METERS_PER_UNIT['m'];

获得中心、半径(以米为单位)后,我尝试使用 postgis(服务器作业)生成多边形(WKT)并在 map 中绘制该特征,例如 this .
select st_astext(st_buffer('POINT(79.25887485937808 17.036647682474722 0)'::geography, 365.70644956827164));

但两者的覆盖范围并不相同。任何机构都可以让我知道我做错了什么。

基本上,我到/从 Circle 的输入/输出仅以米为单位。

最佳答案

ol.geom.Circle 可能不代表圆

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

这可以通过天梭的指示线进行可视化,它显示了投影到平面上时地球上的圆形区域是如何变换的。使用投影 EPSG:3857,这看起来像:

Tissot's indicatrix using EPSG:3857

图片来自 OpenLayer 3's Tissot example并显示半径均为 800 000 米的区域。如果将这些圆圈绘制为 ol.geom.Circle半径为 800000(使用 EPSG:3857)时,它们在 map 上的大小都相同,但靠近两极的那些将代表地球上小得多的区域。

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

所以如果你有一个 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')
);

更多选项

如果您想在地球上添加一个表示圆形区域的几何图形,您应该考虑使用上面 Tissot 示例中使用的方法。也就是说,定义一个具有足够多点的正多边形以显示平滑。这将使其可在投影之间转移,并且似乎是您在服务器端所做的。 OpenLayers 3 通过 ol.geom.Polygon.circular 启用此功能:
var circularPolygon = ol.geom.Polygon.circular(wgs84Sphere, center, radius, 64);

还有 ol.geom.Polygon.fromCircle ,这需要一个 ol.geom.Circle并将其转换为表示相同区域的 Polygon。

关于postgis - Openlayers 3 圆半径(以米为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32202944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com