Geoalchemy2在给定坐标内找到一定距离内的位置

时间:2019-12-21 08:01:00

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

我有一个Flask应用程序,该应用程序首先从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()删除后,得到相同的结果。

1 个答案:

答案 0 :(得分:1)

您的点是>>> import pandas as pd df1=pd.DataFrame(columns=["col1"],data=(["SUPER_280"],["AASD"], >>> ... ["AASD"],["SUPER_350"],["AASD"],["SUPER_150"],["AASD"],["AASD"])) >>> df1 col1 0 SUPER_280 1 AASD 2 AASD 3 SUPER_350 4 AASD 5 SUPER_150 6 AASD 7 AASD >>> df1['col2'] = df1['col1'].apply(lambda x: x.split('_')[-1] if x.split('_')[-1].isdigit() else None).ffill() >>> df1 col1 col2 0 SUPER_280 280 1 AASD 280 2 AASD 280 3 SUPER_350 350 4 AASD 350 5 SUPER_150 150 6 AASD 150 类型的点,其CRS为geometry,单位为度。过滤器是1500度的距离约束(没有意义)。

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

您可以对两个点都使用geometry类型,以米为单位。