【问题标题】:Geoalchemy2 Find a location within certain distance within given coordinateGeoalchemy2 在给定坐标内找到一定距离内的位置
【发布时间】:2019-12-21 08:01:00
【问题描述】:

我有一个烧瓶应用程序,它首先从 Google Maps API 获取位置,并试图在我拥有的数据库中找到 1500 米内更接近它的位置。

这是我的场所模型。

class Places(db.Model):
    uuid = db.Column(UUID(as_uuid=True),
                     primary_key=True,
                     server_default=text("uuid_generate_v4()"))
    name = db.Column(db.String(80), nullable=False)
    # For Near Location Querying
    geometric_point = db.Column(
        Geometry(geometry_type='POINT', srid=4326), nullable=False)

我有这个查询来查找位置在提交的lnglat 附近1500 米内的条目。

def get_nearby_aqi_node(lat, lng):
    distance_in_meters = 1500

    geo_wkb = func.Geometry(func.ST_GeographyFromText(
        'POINT({} {})'.format(lng, lat)))

    point = db.session.query(Places.name,
                                Places.uuid).\
        filter(func.ST_DFullyWithin(Places.geometric_point, geo_wkb, distance_in_meters)).\
        order_by(
        Comparator.distance_centroid(Places.geometric_point, geo_wkb)).limit(1).first()

    return point

我得到的是更接近该地点但不在 1500 米限制范围内的单点。 删除 .filter() 后,我得到了相同的结果。

【问题讨论】:

    标签: python-3.x postgresql sqlalchemy geolocation geoalchemy2


    【解决方案1】:

    您的积分属于geometry 类型,CRS 4326,其单位是度。 filer是1500度的距离约束(没有意义)。

    即使您调用了一次func.ST_GeographyFromText(),输出仍然是geometry,并且两者之间的转换是自动的。

    您可以对两个点使用geography 类型,以便使用以米为单位的距离。

    【讨论】:

    • 那么,我应该将列更改为使用location = geoalchemy.GeometryColumn(Geography(2), comparator=PGComparator) 还是将distance in meters 转换为degree radius
    • 不要以度为单位测量距离,这是完全错误的。经度与纬度的长度不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2020-12-10
    • 2010-10-27
    相关资源
    最近更新 更多