geopandas - 如何解决缓冲后质心点坐标精度不足的问题?
问题描述
通过缓冲区(此处为正方形)生成多边形时,用于生成的几何点的坐标与生成后.centroid
的多边形上的方法所取的坐标不同。
这是一个只有一点的例子。
from shapely.ops import transform
import geopandas as gpd
import shapely.wkt
import pyproj
from math import sqrt
def edge_size(area): return sqrt(area)*1e3
point = "POINT (4379065.583907348 2872272.254645019)"
point = shapely.wkt.loads(point)
center = gpd.GeoSeries(point)
project = pyproj.Transformer.from_proj(
pyproj.Proj('epsg:3395'),
pyproj.Proj('epsg:4326'),
always_xy=True)
center = center.apply(lambda p: transform(project.transform, p))
print(center.iloc[0])
square = point.buffer(
edge_size(3), cap_style=3) #distance of 3km2
square = gpd.GeoSeries(square)
square = square.apply(lambda p: transform(project.transform, p))
square = square.apply(lambda p: p.centroid)
print(square.iloc[0])
#POINT (39.33781544185747 25.11929860805248)
#POINT (39.33781544185747 25.11929777802279)
这会导致之后的处理错误。
首先,这正常吗?以及如何解决这个问题?
我也在这里报告了我的问题。感谢您的关注。
解决方案
从 GitHub 复制我的答案以供后代使用。
这不是错误,而是对坐标变换的误解。您必须记住,一个投影中的正方形在另一个投影中不是正方形。
如果您坚持使用相同的 CRS,则缓冲区质心的输出等于初始点。但是重新投影的多边形的质心稍微偏离了一点,特别是因为您进行了重新投影,使几何图形向一个方向倾斜。
如何克服这个问题?
在一个 CRS 中完成所有操作,完成后重新投影。
推荐阅读
- r - 在函数中创建函数
- outlook-web-addins - Office.context.mailbox.item.addFileAttachmentAsync 代码工作正常。为什么会发生内部错误?
- mysql - MySQL 中的行项目数
- html - 当我使用 CDN 而不是使用下载的 .css 文件远程托管时,引导 CDN 不起作用
- javascript - VueJS $emit 和 $on 不能在一个组件中工作到另一个组件页面
- elasticsearch - 从 elastic 读取 msg 后 Logstash 停止
- php - 使用星期几和年份获取月份中的日期的问题
- google-cloud-platform - “\Google\Cloud 出乎意料。” 执行 gcloud 命令时
- webpack - Webpack/webpack-cleanup-plugin: webpack.config.js 只做清理
- java - 如何解决错误“错误的编码值方法类型大小 7”