使用 RGeo 和 Geojson 计算面积
Calculating area with RGeo and Geojson
我在 geojson 中定义了一个多边形。我正在计算它的面积。
当我遍历表面上的代码路径时,我得到了非常混乱的结果。我怀疑这是因为我错误地使用了一些元素。
boundaries = {...valid geojson...}
field_feature_collection = RGeo::GeoJSON.decode(boundaries, geo_factory: RGeo::Geographic.simple_mercator_factory)
first_feature = field_feature_collection[0]
first_feature.geometry.area
# => 1034773.6727743163
我知道我的地图项的面积是 ~602982 平方米。我不知道如何将其与上面的结果相协调。
我怀疑我遗漏了一些明显的投影。
有人知道哪里出了问题吗?
这很可能是由于在 GeoJSON 解码器中使用 simple_mercator_factory
作为您的 geo_factory
。 simple_mercator_factory
从 lon/lat 坐标系解析几何图形,但使用几何图形的墨卡托投影 (EPSG:3857) 执行所有计算(长度、面积等)。
离赤道越远,墨卡托投影的变形就越大,这就是为什么您得到的面积大约是预期面积的两倍。
根据项目的范围,使用不同的投影可能更合适,尤其是当面积是您的关键指标时。如果您选择不同的投影,rgeo-proj4
gem 刚刚更新为适用于较新版本的 PROJ,因此您可以在您的应用程序中创建适当的转换。
另一种选择是使用 RGeo::Geographic.spherical_factory
,它对地球使用球形近似,并且会为您提供比墨卡托投影更真实的区域,但它比使用 GEOS 支持的笛卡尔工厂(这就是simple_mercator_factory
使用)。
我在 geojson 中定义了一个多边形。我正在计算它的面积。
当我遍历表面上的代码路径时,我得到了非常混乱的结果。我怀疑这是因为我错误地使用了一些元素。
boundaries = {...valid geojson...}
field_feature_collection = RGeo::GeoJSON.decode(boundaries, geo_factory: RGeo::Geographic.simple_mercator_factory)
first_feature = field_feature_collection[0]
first_feature.geometry.area
# => 1034773.6727743163
我知道我的地图项的面积是 ~602982 平方米。我不知道如何将其与上面的结果相协调。
我怀疑我遗漏了一些明显的投影。
有人知道哪里出了问题吗?
这很可能是由于在 GeoJSON 解码器中使用 simple_mercator_factory
作为您的 geo_factory
。 simple_mercator_factory
从 lon/lat 坐标系解析几何图形,但使用几何图形的墨卡托投影 (EPSG:3857) 执行所有计算(长度、面积等)。
离赤道越远,墨卡托投影的变形就越大,这就是为什么您得到的面积大约是预期面积的两倍。
根据项目的范围,使用不同的投影可能更合适,尤其是当面积是您的关键指标时。如果您选择不同的投影,rgeo-proj4
gem 刚刚更新为适用于较新版本的 PROJ,因此您可以在您的应用程序中创建适当的转换。
另一种选择是使用 RGeo::Geographic.spherical_factory
,它对地球使用球形近似,并且会为您提供比墨卡托投影更真实的区域,但它比使用 GEOS 支持的笛卡尔工厂(这就是simple_mercator_factory
使用)。