在 Loopback 4 中处理 GeoLocation 并存储为 MySQL 点

Posted

技术标签:

【中文标题】在 Loopback 4 中处理 GeoLocation 并存储为 MySQL 点【英文标题】:Prcoessing GeoLocation in Loopback 4 and storing as MySQL point 【发布时间】:2021-08-31 22:07:24 【问题描述】:

我的 MySQL 数据库将地理位置坐标存储为空间数据类型Point。 我需要我的环回 4 (lb4) 才能处理这种属性类型。

根据documentation,lb4 有GeoPoint 类型,经过一番研究我发现它不受支持(参见issue #1981)。

我还进行了测试,可以确认 lb4 无法识别 GeoPoint 类型,并且在 @property 装饰器 type: 'geopoint' 中定义时,它也无法识别该类型。

我的问题是:如何在环回 4 中处理地理位置数据,而我的 mysql 数据库将其存储为空间类型 Point

@model()
export class SomeEntity extends Entity 
  @property(
    type: 'geopoint', // does not recognize
    required: true,
    mysql: 
      dataType: 'point',
    ,
  )
  coordinate: GeoPoint; // is not defined

【问题讨论】:

【参考方案1】:

此后我在 Loopback slack 频道上与一些乐于助人的人交谈,还发现 GeoPoint 似乎不起作用,但是以下允许我在 Mysql 中创建 Point 数据类型字段

      @property(
    type: 'object',
    mysql: 
      dataType: 'point',
    ,
  )
  latlng: point;

最后需要定义导出点

export interface point 
  lat: number;
  lng: number;

所以我的整个模型看起来像这样......

    import Entity, model, property from '@loopback/repository';
    import moment from 'moment';
    
    @model(settings: strict: false)
    export class Location extends Entity 
      @property(
        type: 'number',
        id: true,
        generated: true,
      )
      id: number;
    
      @property(
        type: 'string',
      )
      addr1: string;
    
      @property(
        type: 'string',
      )
      addr2: string;
    
      @property(
        type: 'string',
      )
      city: string;
    
      @property(
        type: 'string',
      )
      region: string;
    
      @property(
        type: 'string',
      )
      postcode: string;
    
      @property(
        type: 'string',
      )
      country: string;
    
// NEW PROPERTY ..........................

      @property( 
        type: 'object',
        mysql: 
          dataType: 'point',
        ,
      )
      latlng: point;
    
      @property(
        type: 'number',
      )
      display_ix: number;
    
      @property(
        type: 'date',
        defaultFn: 'now',
      )
      created_date: string;
    
      @property(
        type: 'number',
        required: false,
      )
      created_by: number;
    
      @property(
        type: 'date',
        defaultFn: 'now',
      )
      modified_date: string;
    
      @property(
        type: 'number',
        required: false,
      )
      modified_by: number;
    
      constructor(data?: Partial<Location>) 
        super(data);
      
    
    
// NEW EXPORT ..........................

    export interface point 
      lat: number;
      lng: number;
    
    
    export interface LocationRelations 
      // describe navigational properties here
    
    
    export type LocationWithRelations = Location & LocationRelations;

我希望这会有所帮助...正如您所见,它已管理 mysql 中的新点属性 see mysql table screenshot here

【讨论】:

以上是关于在 Loopback 4 中处理 GeoLocation 并存储为 MySQL 点的主要内容,如果未能解决你的问题,请参考以下文章

在 LoopBack 4 中访问 express 应用以添加中间件

loopback 4 从数据库中发现模型

Loopback 4 调试器 nodemon 解决方案

如何在 LoopBack 4 模型中指定没有时间的日期?

如何在 Loopback 4(打字稿)中调用具有依赖注入的类的方法?

loopback 4 使用中间件 prometheus-api-metrics