在 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),而geopyPoint 构造函数将纬度作为其第一个参数。此外,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 中计算学生化残差?

在Python中计算数组元素[重复]

在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

在Python中计算数据框中最后一行和所有其他行之间的时间差

使用条件 groupby 计算分类列的百分比并在 Python 中计数

Python(66)_判断用户传入的参数str中计算数字,字母,空格,以及其他的个数,并返回结果