1

我有一个烧瓶应用程序,它首先从 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()删除相同的结果。

4

1 回答 1

1

您的点属于geometry带有 CRS 的类型4326,其单位是度。过滤器是1500度的距离约束(这是没有意义的)。

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

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

于 2019-12-21T14:17:47.943 回答