在 python vs st_project 中计算一个点
Posted
技术标签:
【中文标题】在 python vs st_project 中计算一个点【英文标题】:calculating a point in python vs st_project 【发布时间】:2018-03-19 13:59:44 【问题描述】:如您所见,我正在尝试在 python 中实现函数 st_project。但是,我没有得到与函数 st_project 相同的结果
import geopy as g
import geopy.distance as gp
from geopy.units import radians
start = g.Point(27.725778916300465,35.201911926269524)
distance = g.distance.VincentyDistance(meters = 50)
result = distance.destination(start, radians(90))
输出:Point(27.72574882153389, 35.29318076870505, 0.0)
但是,当执行 st_project 我得到以下内容
SELECT ST_AsText (
ST_PROJECT(
(SELECT SET_SetSRID(
ST_POINT(27.725778916300465,35.201911926269524),
4326)),
50,
radians(90)
)
);
输出:Point(27.7263279818659 35.2019119250247)
有什么想法可以得到确切的结果吗?
【问题讨论】:
我想这里的问题是关于你的坐标的精度水平。你用这些坐标映射什么?只是为了说明我的观点,在第 9 位小数时,您已经是microns
,这是一个非常小的测量单位;-) 如果您对米没问题,5 位小数也可以。
您的投影似乎与其他结果相差 90 度。但我不知道为什么。
【参考方案1】:
这是因为ST_Point
期望“x 坐标”作为其第一个参数,即经度(假设为EPSG 4326
),而geopy
的Point
构造函数将纬度作为其第一个参数。此外,destination
方法 expects 以度为单位(与 ST_Project
期望弧度相反)。
因此,如果你这样做:
SELECT ST_AsText (
ST_PROJECT(
(SELECT ST_SetSRID(
ST_POINT(35.201911926269524,27.725778916300465),
4326)),
50,
radians(90.0)
)
);
你得到:
st_astext
------------------------------------------
POINT(35.2024189755536 27.7257789153716)
(1 row)
并与:
import geopy as g
import geopy.distance as gp
from geopy.units import radians
start = g.Point(27.725778916300465,35.201911926269524)
distance = g.distance.VincentyDistance(meters = 50)
result = distance.destination(start, 90) #no radians here
print(result.longitude, result.latitude)
你会得到一致的结果:
35.202418975487014 27.725778915371617
【讨论】:
以上是关于在 python vs st_project 中计算一个点的主要内容,如果未能解决你的问题,请参考以下文章
在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?
在Python中计算数据框中最后一行和所有其他行之间的时间差