地理空间数据的灵活模式框架。

grout的Python项目详细描述


灌浆

构建状态

grout是一个灵活的地理空间数据模式框架,由django和postgresql提供支持。想一想:nosql数据库服务器,但是有模式验证和postgis支持。

内容

简介

grout将nosql数据库的灵活性与 postgis,允许您对 您的数据库架构,同时仍可以访问强大的地理空间查询。

灌浆将帮助您:

  • 为应用程序中的记录定义、编辑和验证架构
  • 使用内置版本控制系统跟踪对架构的更改
  • 对用户定义的字段执行快速过滤
  • 即使在存储有非结构化数据的记录上运行复杂的地理空间查询。

灌浆是灌浆套件的核心库,这是一个易于构建的工具包 灌浆顶部的灵活模式应用程序。你可以把灌浆作为一个应用程序来安装 在django项目中,或者您可以将其部署为独立的api 服务器带有可选的管理 后端

准备好了吗?要开始在Django中使用水泥浆,请参见获取 已开始。开始使用ano水泥浆疗法 堆栈,请参见非django应用程序。为了更多 有关灌浆工作原理的背景,请参见概念

开始

django

如果你正在开发一个django项目,你可以安装灌浆作为django应用程序和 在您的项目中使用它。

要求

grout支持以下python和django版本:

  • 巨蟒:2.7、3.4、3.5、3.6、3.7
  • django:1.11,2.0

某些版本的django只支持某些版本的python。确保 如果您的python和django版本协同工作,请参阅django常见问题解答:什么 我可以用python版本 Django?

安装

使用pip

从pypi安装灌浆库
$ pip install grout

要使用灌浆的开发版本,请从Github安装它。

$ git clone git@github.com:azavea/grout.git

确保灌浆包含在项目的settings.py的安装的应用程序中。

# settings.pyINSTALLED_APPS=(...'grout',)

要将grout用作api服务器,需要将api视图合并到 urls.py文件。下面的示例将包括 /灌浆终点。

# urls.pyurlpatterns=[url(r'^grout/',include('grout.urls'))]

注意,grout会自动在/api/端点下嵌套视图,这意味着 上面的设置将创建类似于hostname.com/grout/api/records的url。 如果您希望灌浆视图位于顶层/api/端点(如 hostname.com/api/records,可以直接导入灌浆urlpatterns

# urls.pyfromgroutimporturlpatternsasgrout_urlpatternsurlpatterns=grout_urlpatterns

配置

灌浆要求在settings.py文件中定义灌浆配置变量 才能正常工作。grout变量是一个配置字典 应用程序的指令。

目前,'srid'grout字典中唯一需要的键。'srid'是一个整数 对应于空间引用 标识符 水泥浆应该用来储存几何形状。4326是最常见的srid,并且 是项目的良好默认值。

下面是一个开发项目的配置示例:

# settings.py# The projection for geometries stored in Grout.GROUT={'SRID':4326}

请注意,灌浆使用django-rest-frameworkdjango-rest框架 提供api端点。配置特定于drf的设置,如 身份验证,请参见drf文档。

更多示例

灌浆服务器是一个简单的部署 作为独立应用程序使用的灌浆API服务器。它还服务于 作为如何将灌浆纳入Django项目的一个好例子,以及 包括要引导的预配置身份验证模块。如果你是 在项目中安装或配置灌浆时遇到问题,灌浆 服务器 是一个很好的故障排除资源。

非Django应用程序

如果您不是django开发人员,您仍然可以使用grout作为独立的 使用灌浆服务器的API服务器 项目。参见灌浆服务器文档 有关如何安装灌浆服务器实例的详细信息。

概念

数据模型

灌浆数据模型以记录为中心,每个记录都有关联的记录模式和记录类型。

灌浆以记录为中心,这些记录只是数据库中的实体。 记录可以是世界上任何类型的事情或事件,尽管灌浆是 当您的记录包含一些地理空间和时间组件时非常有用。

每个记录都包含对recordschema的引用,recordschema对 指向它的记录的版本化架构。此架构存储为 jsonschema,用json描述数据模型的规范。

最后,每个recordschema都包含对记录类型的引用,即 用于组织记录的简单容器。recordtype公开了 可靠地访问一组表示同一类型事物的记录,即使 它们有不同的模式。我们将很快看到,记录类型是有用的访问 指向记录,因为记录架构可以随时更改。

版本化模式

在grout中,recordschema只追加,这意味着它们不能被删除。 相反,当您想要更改记录的架构时,可以创建一个新的 记录模式并更新版本属性。

举个简单的例子,假设我们有一个描述存储在 acatrecordtype。recordschema可能如下所示:

{"version":1,"next_version":null,"schema":{"type":"object","title":"Initial Schema","$schema":"http://json-schema.org/draft-04/schema#","properties":{"catDetails":{"$ref":"#/definitions/driverPosterDetails"},"definitions":{"catDetails":{"type":"object","title":"Cat Details","properties":{"Name":{"type":"string","fieldType":"text","isSearchable":true,"propertyOrder":1},"Age":{"type":"integer","fieldType":"integer","minimum":0,"maximum":100,"isSearchable":true,"propertyOrder":2},"Color":{"type":"string","fieldType":"text","isSearchable":true,"propertyOrder":3},"Breed":{"type":"select","fieldType":"selectlist","enum":["Tabby","Bobtail","Abyssinian"],"isSearchable":true,"propertyOrder":4}}}}}}

关于这个recordschema对象需要注意的几点:

  • 这是模式的第一个版本(它的版本是1
  • 没有比这个版本更新的版本了(它的下一个版本是空的
  • 模式定义本身存储为模式上的jsonschema对象 属性
  • 所有可用字段都由catdetails属性命名,该属性 我们有时称之为表单或相关内容

现在假设我们要将年龄字段更改为出生日期字段。而不是 直接更改架构,我们将创建一个新架构。灌浆将自动 为此更新的架构设置版本:2下一个版本:null

{"version":2,"next_version":null,"schema":{"type":"object","title":"Initial Schema","$schema":"http://json-schema.org/draft-04/schema#","properties":{"catDetails":{"$ref":"#/definitions/driverPosterDetails"},"definitions":{"catDetails":{"type":"object","title":"Cat Details","properties":{"Name":{"type":"string","fieldType":"text","isSearchable":true,"propertyOrder":1},"Age":{"type":"integer","fieldType":"integer","minimum":0,"maximum":100,"isSearchable":true,"propertyOrder":2},"Date of Birth":{"type":"string","format":"datetime","fieldType":"text","isSearchable":true,"propertyOrder":3},"Color":{"type":"string","fieldType":"text","isSearchable":true,"propertyOrder":4},"Breed":{"type":"select","fieldType":"selectlist","enum":["Tabby","Bobtail","Abyssinian"],"isSearchable":true,"propertyOrder":5}}}}}}}

此外,灌浆将更新初始方案,以设置下一个版本:2

{
  "version": 1,
  "next_version": 2,
  "schema": {
    ...
  }
}

现在,当用户在catrecordtype中搜索记录时,grout可以找到 通过查找recordschema的最新模式,其中下一个版本:null。 这将保留对recordschema的完整审计跟踪,允许我们 检查模式随时间的变化。

有关灌浆数据模型的详细信息,请参见灌浆中的models.py文件 库

API文档

请求和响应格式

与api的通信通常遵循restfulapi设计的原则。 api路径对应于资源,get请求用于检索对象,post 请求用于创建新对象,而patch请求用于更新 现有对象。几乎在所有情况下都遵循这种模式;任何例外 将在文档中注明。

来自api的响应完全是json。

可以使用get请求的查询参数配置端点行为, 而post请求需要json格式的有效负载。

分页

返回资源列表的所有api端点都将分页。分页采用以下格式:

$ pip install grout
0

在实际响应中,nextprevious字段的域和端口 将是响应请求的服务器。

此格式适用于下面的API终结点,在 每个端点的文档。

资源

< H4>订单类型

因为一组记录的recordschema可以随时更改,所以recordtype api 端点为检索一组记录提供了一致的访问点。 使用记录类型终结点查找记录的最新记录架构 在执行进一步的查询之前,您感兴趣。

路径:

  • 列表:/api/recordtypes/
  • 详细信息:/api/recordtypes/{uuid}/

查询参数:

  • 活动:布尔值
    • 仅筛选活动的值为true的记录类型。 通常,您会希望将自己限制为活动记录类型。

结果字段:

<表><广告>字段名键入说明 < /广告><正文>uuidUuid此记录类型的唯一标识符。当前模式Uuid此记录类型的最新记录架构。已创建时间戳创建此记录类型的日期和时间。已修改时间戳上次修改此记录类型的日期和时间。标签字符串此记录类型的名称。复数标签字符串此记录类型名称的复数形式。说明字符串此记录类型的简短说明。激活布尔型此记录类型是否处于活动状态。此字段允许停用而不是删除记录类型。几何类型字符串此记录类型的记录支持的几何类型。多边形多多边形线串暂时的布尔型此记录类型的记录是否应将日期时间数据存储在发生于发生于字段中。

记录模式

recordschema api端点可以帮助您发现 应在给定的记录中可用。这对于自动生成过滤器很有用 基于记录的字段,或在记录的字段上运行自定义验证 Schema,

路径:

  • 列表:/api/recordschemas/
  • 详细信息:/api/recordschemas/{uuid}/

结果字段:

<表><广告>字段名键入说明 < /广告><正文>uuidUuid此记录架构的唯一标识符。已创建时间戳创建此记录架构的日期和时间。已修改时间戳上次修改此记录架构的日期和时间。版本整数一个序列号,指示记录类型的架构的版本。从1开始。下一个版本Uuid具有此架构的记录类型的下一个最高版本号的记录架构的唯一标识符。如果这是模式的最新版本,则此字段将为null录制类型Uuid此记录架构引用的记录类型的唯一标识符。模式
对象ajsonschema应该验证引用此记录架构的记录的对象。

记录

记录是灌浆项目的核心:yo中的实体你的数据库。这个 记录api端点提供了一种检索这些对象以进行分析的方法 或显示给最终用户。

路径:

  • 列表:/api/records/
  • 详细信息:/api/records/{uuid}/

查询参数:

  • 已存档:布尔型

    • 记录可以被"存档"以表示它们不再是当前的,作为 替代删除。将true(区分大小写)传递到此参数以返回存档 仅记录,并通过false(区分大小写)仅返回当前记录。 省略此参数将返回两种类型。
  • 仅限详细信息:布尔型

    • 在灌浆模式编辑器中, 每个记录都会自动生成一个<;记录类型>;详细信息 用于包含有关记录的基本信息摘要的窗体。 将true(区分大小写)传递给此参数将忽略任何其他 可能存在于记录中的表格。这对限制大小很有用 当只需要摘要视图时返回的有效负载。
  • 记录类型:uuid

    • 将响应限制为与传递的记录类型uuid匹配的记录。 这在理论上是可选的,但对于大多数应用来说,这是一个好主意 默认情况下包含此参数。它被认为是罕见的 在一个请求中返回两种不同类型的记录非常有用。 通常最好对每个记录类型单独提出请求。
  • jsonb:对象

    • 查询对象的数据字段并对结果进行筛选。
    • 此对象中的键模拟要在特定对象上筛选的搜索路径 字段。但是,使用过滤规则定义代替值。例子: {"accidentdetails":{"main+cause":{"rule-type":"containment","contains":["vehicle+defect","road+defect"],["vehicle+defect"]},"num+driver+accountants":{"rule-type":"intrange","min":1,"max":3}}}}。此查询定义以下两个筛选器:
      • 意外详情->;"主要原因"="车辆缺陷"或意外详情->;"主要原因"="道路缺陷"
      • 意外事故详情->;"驾驶员伤亡人数">;=1和意外事故详情->;"驾驶员伤亡人数"<;=3
    • 有第三种可用的筛选规则类型:containment\u multiple。 当搜索一条记录中可以有多个表单时,使用此选项。 下面是一个例子: {"person":{"injury":{"rule_type":"containment_multiple","contains":["fatal"]}}}
  • 发生的最小值:时间戳

    • 筛选到此日期之后发生的记录。
  • 已发生的最大值:时间戳

    • 筛选到此日期之前发生的记录。
  • 多边形id:uuid

    • 过滤到由 UUID。该值必须引用数据库中的a边界
  • 多边形:geojson

    • 筛选到发生在有效geojson范围内的记录 对象:

结果字段:

<表><广告>字段名键入说明 < /广告><正文>uuidUuid此记录的唯一标识符。已创建时间戳创建此记录的日期和时间。已修改时间戳上次修改此记录的日期和时间。发生于 时间戳最早出现这种情况的时间R.E.T/T>发生在时间戳此记录可能发生的最晚时间。请注意,此字段对于临时记录是必需的:如果某个记录只在某一时刻发生,则发生于字段和发生于字段将具有相同的值。geomGeoJSON表示与此记录关联的位置的几何图形。位置文本字符串记录发生位置的描述,通常是地址。已存档 布尔型一种在不完全删除记录的情况下隐藏记录的方法。true表示记录已存档。模式Uuid引用用于创建此记录的记录架构。数据对象表示与此记录关联的灵活数据字段的json对象。存储在数据中的对象始终符合模式所引用的recordschemauuid。

边界

边界提供了一种在无需 必须创建单独的记录类型。使用边界,可以上载 并检索管理边界和焦点之类的shapefile数据 应用程序中的区域。

路径:

  • 列表:/api/bounders/
  • 详细信息:/api/bounders/{uuid}/

结果字段:

<表><广告>字段名键入说明 < /广告><正文>uuidUuid此边界的唯一标识符。已创建时间戳创建此边界的日期和时间。已修改时间戳上次修改此边界的日期和时间。标签字符串此边界的标签,用于显示。颜色字符串用于渲染此边界的颜色首选项。显示字段字符串要用于显示的导入形状文件的哪个字段。数据字段数组导入的shapefile中包含的字段的名称列表。错误数组导入形状文件时可能出现的错误列表。状态字符串形状文件的导入状态。源文件字符串最初用于生成此边界的shapefile的uri。

注意:

创建新边界及其正确的边界多边形是一个两步过程。

  1. post/api/bounders/并附加一个压缩的shapefile;您将需要 将标签包含为表单数据。你应该收到201的回复 包含完全成熟的边界对象,包括可用的 数据字段中的数据字段

  2. 上一个请求的响应将有一个空白的"显示"字段。 选择数据字段中的一个字段并进行修补程序 /api/boundaries/{uuid}/显示字段中使用该值。 您现在可以使用此边界及其关联的边界多边形。

  3. < > >

    边界多边形

    BoundaryPolygons存储与边界关联的shapefile数据, 包括几何和元数据。

    路径:

      名单:< Code>/api/boundarypolygons/
    • 详细信息:/api/boundarypolygons/{uuid}/

    查询参数:

    • 边界:uuid

      • 过滤到与此父边界关联的多边形。
    • nogeom:布尔型

      • 当传递任何值时,将导致几何体字段替换为 烧烤场这将减小响应大小,并足以用于许多目的。

    结果字段:

    <表><广告>字段名键入说明 < /广告><正文>uuidUuid此边界多边形的唯一标识符。已创建时间戳创建此边界多边形的日期和时间。已修改时间戳上次修改此边界多边形的日期和时间。数据对象此对象中的每个键将对应于父边界中的一个数据字段,并将存储此多边形的该字段的值。边界Uuid此边界多边形的父边界的唯一标识符。bbox数组包含此多边形几何体的最小边界框,作为纬度/经度点的数组。此字段是可选的--有关详细信息,请参见上面的nogeom参数。几何体GeoJSON此多边形的GeoJSON表示。此字段是可选的--有关详细信息,请参见上面的nogeom参数。

    开发

    这些说明将帮助您设置灌浆和 向上游贡献变化。

    要求

    灌浆开发环境采用Docker集装箱运输,以确保类似 跨平台的环境。为了和Docker一起发展,你需要 以下依赖项:

    安装

    用git克隆repo。

    $ pip install grout
    
    1

    运行更新脚本以设置开发环境。

    $ pip install grout
    
    2

    运行测试

    一旦您的环境是最新的,就可以使用脚本/test脚本 运行灌浆单元测试套件。

    $ pip install grout
    
    3

    此命令将为每个受支持的python版本和 项目中的django。如果你在本地开发,你只想运行 作为测试的一个子集,您可以指定python的版本 您要用来运行测试:

    $ pip install grout
    
    4

    有关可用python版本的列表,请参见tox.ini中的envlist指令 文件

    清理

    tox为python和django版本的每个组合创建一个新的virtualenv 由测试套件使用。为了清理停止的集装箱和 删除这些虚拟机,使用clean脚本:

    $ pip install grout
    
    5

    请注意,clean将删除所有悬挂的图像、停止的容器和 机器上未使用的卷。如果你不想移除这些文物, 查看clean脚本并仅运行 使您感兴趣。

    进行迁移

    如果在grout/models.py中编辑数据模型,则需要创建一个新的 应用程序的迁移。您可以使用django管理

    $ pip install grout
    
    6

    确保用git注册新的迁移文件:

    $ pip install grout
    
    7

    资源

    以下资源提供了部署和使用灌浆的有用提示。

    灌浆套件

    • 灌浆服务器:易于部署 灌浆API服务器的独立实例。
    • 灌浆模式编辑器:a 纯静态应用程序,可以从灌浆API读取和写入灵活的模式。
    • 演示应用程序:演示项目 提供一个将灌浆套件合并到vue.js应用程序中的示例。

    历史文献

    • 概念图:灌浆套件的早期描述 (以前被称为ashlar)一位在夏季从事此项工作的开源研究员 2018。描述套件的概念架构,并总结 对未来方向的想法。

    • 将包重命名为灌浆:ADR文档 决定将包从"ashlar"重命名为"grout"。

    • 评估记录到记录引用:ADR 记录实施记录到记录的原因和要求 外键字段。另请参见拉取请求。 螺纹以便进一步 讨论。

    • 评估备用后端:ADR呈现 对灌浆可能的NoSQL后端和服务提供商的研究。

    • Grout 2018奖学金:a 2018年夏季Azavea灌浆项目管理报告 开源研究金。有用的 有关项目动机和发展轨迹的文档。

    路线图

    想知道水泥浆的去向吗?请参阅路线图 了解未来的发展。

    欢迎加入QQ群-->: 979659372 Python中文网_新手群

    推荐PyPI第三方库


热门话题
java OnClick用于ListView中的特定项   java如何多次循环相同的TestNG测试。包括课前和课后   java如何在Codenameone中设置BrowserComponent浏览器窗口大小   java Socketchannel始终为空   java以编程方式向JavaFX WebEngine历史添加新条目   java Hibernate+Spring与Oracle一起使用分层查询(从+连接方式开始)   Java中的安卓 getView和Beacon(Estimote)问题   计时器如何在java中设置暂停选项   java为什么输入1000000000000的输出不正确?   java如何在程序执行期间更改log4j2中的日志记录级别   java阻止代码引发XML异常   未找到媒体类型为application/json的java JAX RS MessageBodyWriter   java如何将BuffereImage中的特定颜色(0xFF00FF)设置为透明?   java如何列出web元素,如果网页中没有特定链接的id,如何单击网页中的特定链接?   在Java中读取txt文件时获取EOFEException   java如何避免为每个视图添加inject方法?   JavaSpringController:Facebook上类似文章的永久链接   java在尝试执行脚本时遇到错误“net.serentiybdd.core.exceptions.serentitymanagedexception:No session ID”