순수 postgres docker image는 geography type을 지원하지 않는다.
https://github.com/typeorm/typeorm/issues/2610
extension을 설치하여 가능한 것 같아 보이지만, 여러가지 에러에 맞닥뜨리게 된다.
https://pamyferret.tistory.com/29
postgres=# CREATE EXTENSION "postgis";
ERROR: could not open extension control file "/usr/share/postgresql/14/extension/postgis.control": No such file or directory
postgis(https://registry.hub.docker.com/r/postgis/postgis/)를 사용하면 되는데, 아직 arm process를 지원하지 않는다.
그래서, local 개발용으로 https://hub.docker.com/r/kartoza/postgis/를 사용했다.
postgis docker image를 가지고 typeorm으로 접근할 때, ST_
함수를 사용해야 한다.
await dataSource.manager
.createQueryBuilder(Thing, "thing")
// convert stringified GeoJSON into a geometry with an SRID that matches the
// table specification
.where(
"ST_Distance(geom, ST_SetSRID(ST_GeomFromGeoJSON(:origin), ST_SRID(geom))) > 0",
)
.orderBy({
"ST_Distance(geom, ST_SetSRID(ST_GeomFromGeoJSON(:origin), ST_SRID(geom)))":
{
order: "ASC",
},
})
.setParameters({
// stringify GeoJSON
origin: JSON.stringify(origin),
})
.getMany()
어느 정도 구현한 것 같으나, distance resolution이 현실세계와 부합하지 않는 것 같다.
그래서 찾아본 SRID (EPSG 코드)
Heroku Postgres에서 Extension 설치를 지원한다고는 하지만,
https://devcenter.heroku.com/articles/heroku-postgres-extensions-postgis-full-text-search#install-an-extension
추가적인 설치 없이 Geometry를 지원하는 mongoDB가 좋을 것 같다.