postgresql 我如何将经度和纬度与typeorm和postgres一起使用

alen0pnh  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(210)

我当前的实体看起来像这样:

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class Landmark extends BaseEntity {
    @PrimaryGeneratedColumn('uuid')
    id: string;

    @Column()
    longitude: number 

    @Column()
    latitude: number 
}

但我想知道是否有更好的方法来做到这一点,使用一个特殊的postgres类型,它与typeorm一起工作。

uujelgoq

uujelgoq1#

你需要了解Typeorm中的PostGIS和空间列支持:
https://github.com/typeorm/typeorm/blob/master/docs/entities.md#spatial-columns
PostGIS是一个扩展,您可以在postgres数据库中启用它来处理空间数据类型。安装PostGIS后,您可以在Typeorm查询构建器中使用其特殊的空间数据函数,就像使用任何其他PG函数一样,由GeoJSON备份。
Typeorm的postgres驱动程序在内部使用GeoJSON来与PostGIS一起工作,因此当您定义Typeorm模型时,您需要添加@types/geojson,这将使您能够按照要求正确键入Typeorm列。
例如,您可以导入Geometry类型定义并键入列如下:

import { Geometry } from 'geojson';
...
@Column
location: Geometry

在您的示例中,您可能希望将latitudelongitude列合并为一个列--location--它可以使用point()函数将纬度和经度合并为一个Geometry类型。
作为一个人为的例子,你可以这样做:

UPDATE customers SET location = 'point(37.7, 122.4)' where id = 123;

这会将customers表上的location列(作为示例)设置为与San弗朗西斯科的纬度/经度位置相对应的geometry(point)列类型。
如果您想将lat/lon的现有双精度列值(这是您应该单独存储lat/lon的方式)迁移到geometry(point)类型的单个location列,则可以使用PostGIS自带的ST_MakePoint函数。

-- Assuming you have a lat and lon columns on the `customers` table that you are migrating to the PostGIS geometry(point) type
UPDATE customers SET location = ST_MakePoint(lat, lon) where id = 123;
kuarbcqp

kuarbcqp2#

扩展JosephHall答案
Used postgres,postgis,typeORM,@types/geojson,Nest JS

import { Column, Entity, Index, PrimaryGeneratedColumn} from 'typeorm';
import { Point } from 'geojson';

@Entity({ name: 't_test_location' })
export class TestLocation {
  @PrimaryGeneratedColumn('increment')
  pk_id: number;
  
  @Column({ type: 'varchar', name: 's_city' })
  city: string;

  @Index({ spatial: true })
  @Column({
    type: 'geography',
    spatialFeatureType: 'Point', 
    srid: 4326,
    nullable: true,
  })
  location:Point
}

服务等级

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { TestLocation } from 'src/model/testlocation.entity';
import { getManager, QueryBuilder, Repository } from 'typeorm';
import { Geometry, Point } from 'geojson';
@Injectable()
export class LocationService {
  constructor(
    @InjectRepository(TestLocation) private readonly repo: Repository<TestLocation>,
  ) {}

  public async getAll() {
    return await this.repo.find();
  }

  public async create(location:TestLocation){
    const pointObject :Point= {
      type: "Point",
      coordinates: [location.long,location.lat]
  };
  location.location = pointObject;
  return await this.repo.save(location)
  }

控制器

import { Body, Controller, Get, Post } from '@nestjs/common';
import { TestLocation } from 'src/model/testlocation.entity';
import { LocationService } from './location.service';

@Controller('location')
export class LocationController {
  constructor(private serv: LocationService) {}

  @Get()
  public async getAll() {
    return await this.serv.getAll();
  }
  @Post()
  createLocation(@Body() location : TestLocation): void{
    this.serv.create(location);
  }
}

相关问题