FluentPostGIS

Platforms Package Managers

这是 FluentPostGIS 包的一个分支,增加了对地理查询的支持。FluentPostGIS 为 fluent-postgres-driverVapor 4 提供了 PostGIS 支持。

安装

Swift Package Manager

在你的 Package.swift 文件中,将这行添加到依赖项:

.package(url: "https://github.com/brokenhandsio/fluent-postgis.git", from: "0.3.0")

然后将这行添加到目标(target)的依赖项:

.product(name: "FluentPostGIS", package: "fluent-postgis"),

设置

导入模块

import FluentPostGIS

可选地,你可以添加一个 Migration 来启用 PostGIS

app.migrations.add(EnablePostGISMigration())

模型

添加一个类型到你的模型

final class User: Model {
    static let schema = "user"
    
    @ID(key: .id)
    var id: UUID?

    @Field(key: "location")
    var location: GeometricPoint2D
}

然后在 Migration 中使用它的数据类型

struct UserMigration: AsyncMigration {
    func prepare(on database: Database) async throws -> {
        try await database.schema(User.schema)
            .id()
            .field("location", .geometricPoint2D)
            .create()
    }
    func revert(on database: Database) async throws -> {
        try await database.schema(User.schema).delete()
    }
}
几何类型 地理类型
GeometricPoint2D GeographicPoint2D
GeometricLineString2D GeographicLineString2D
GeometricPolygon2D GeographicPolygon2D
GeometricMultiPoint2D GeographicMultiPoint2D
GeometricMultiLineString2D GeographicMultiLineString2D
GeometricMultiPolygon2D GeographicMultiPolygon2D
GeometricGeometryCollection2D GeographicGeometryCollection2D

查询

使用任何过滤器函数进行查询

let eiffelTower = GeographicPoint2D(longitude: 2.2945, latitude: 48.858222)
try await User.query(on: database)
    .filterGeographyDistanceWithin(\.$location, eiffelTower, 1000)
    .all()
查询
filterGeometryContains
filterGeometryCrosses
filterGeometryDisjoint
filterGeometryDistance
filterGeometryDistanceWithin
filterGeographyDistanceWithin
filterGeometryEquals
filterGeometryIntersects
filterGeometryOverlaps
filterGeometryTouches
filterGeometryWithin
sortByDistance

💝 贡献

请创建一个 issue 描述你的问题,或者提交一个 pull request 来修复它。

✌️ 许可

MIT

👽 作者

BrokenHands, Tim Condon, Nikolai Guyot - https://www.brokenhands.io/ Ricardo Carvalho - https://rabc.github.io/ Phil Larson - http://dizm.com