2010-11-01 15 views

Trả lời

15

Sử dụng SQLAlchemy 0.8, Flask-SQLAlchemy và Geoalchemy 2: truy vấn

from app import db 
from geoalchemy2.types import Geometry 

class Point(db.Model): 

    """represents an x/y coordinate location.""" 

    __tablename__ = 'point' 

    id = db.Column(db.Integer, primary_key=True) 
    geom = db.Column(Geometry(geometry_type='POINT', srid=4326)) 

mẫu:

from geoalchemy2.elements import WKTElement 
from app import models 

def get_nearest(lat, lon): 
    # find the nearest point to the input coordinates 
    # convert the input coordinates to a WKT point and query for nearest point 
    pt = WKTElement('POINT({0} {1})'.format(lon, lat), srid=4326) 
    return models.Point.query.order_by(models.Point.geom.distance_box(pt)).first() 

Một cách để chuyển đổi kết quả để tọa độ x và y (chuyển đổi sang GeoJSON và trích xuất tọa độ):

import geoalchemy2.functions as func 
import json 
from app import db 

def point_geom_to_xy(pt): 
    # extract x and y coordinates from a point geometry 
    geom_json = json.loads(db.session.scalar(func.ST_AsGeoJSON(pt.geom))) 
    return geom_json['coordinates'] 
1

Nếu bạn không bị giới hạn sử dụng Flask, bạn có thể muốn dùng thử MapFish, dựa trên giá treo và sử dụng GeoAlchemy.

1

Bạn có thể sử dụng nó với Flask-SQLAlchemy, nhưng bạn có thể sử dụng nó với SQLAlchemy đơn giản. Chỉ cần dịch sample models from GeoAlchemy thành Flask-SQLAlchemy. Một cái gì đó như thế này:

class Spot(db.Model): 
    __tablename__ = 'spots' 
    id = db.Column(Integer, primary_key=True) 
    name = db.Column(Unicode, nullable=False) 
    height = db.Column(Integer) 
    created = db.Column(DateTime, default=datetime.now()) 
    geom = db.GeometryColumn(Point(2)) 

Tôi chưa thử nghiệm mã, nhưng nó phải là một phiên mã công bằng.

+2

Mã này không hoạt động: nó cung cấp cho bạn đối tượng 'AttributeError: 'SQLAlchemy' không có thuộc tính 'GeometryColumn'' – jsalonen

0
from myapp import db 
from geoalchemy import GeometryColumn, Point 

class FixXX(db.Model): 

    __tablename__ = 'fixXX' 

    fix_pk = db.Column(db.Integer, primary_key=True) 
    fix = db.Column(db.String) 
    geometry = GeometryColumn(Point(2, srid=4326)) 

GeometryDDL(FixXX.__table__) 
Các vấn đề liên quan