簡體   English   中英

使用 function 計算 gps 位置和 postgis 地理值之間的距離?

[英]Calculating distance between a gps location and postgis geography value using a function?

我有用戶的經緯度值。 我在數據庫中保存了各個位置的地址。 我想根據半徑值找到最近的報價。 我正在使用postgis。

目前我的位置列是地理類型。

  1. 當我只有緯度和經度時,我應該以什么格式將數據輸入“位置”列地理類型? 我無法使用 postgis 函數,因為我正在使用 graphql 進行數據插入。

  2. 為此,我一直在努力寫一個 function。 這就是我想出的。有沒有更好的方法來做到這一點?

CREATE OR REPLACE FUNCTION public."getNearByOffers"(
    lat double precision,
    lon double precision,
    radius integer)
    RETURNS "Offers"
    LANGUAGE 'sql'
    COST 100
    VOLATILE 
AS $BODY$ SELECT O.*
FROM "public"."Offers" O
  JOIN "public"."Address" A ON A.id = O."addressId"
WHERE 
 ST_DWithin(ST_MakePoint(lat, lon)::geography,
    A.location::Geography, radius);$BODY$;
  1. 當我運行這個 function 時,查詢結果列中的所有內容都合並在一起。 如何將其拆分到查詢結果中的不同列?

我真的很感激在這件事上的任何幫助!

Hasura 在其 GraphQL 模式中內置了對 PostGIS 的支持。 由於您的字段已經是geography類型,因此您不需要 function。

在 Hasura 中,您需要創建 offer 和address表之間的關系,並且offers查詢應該類似於:

query nearby_offers($point: geography!) {
  offers(where: {address: {location: {_st_d_within: {distance: 200000, from: $point}}}}) {
    id
    offer_fields
    address {
      location
    }
  }
}

Hasura 中的地理類型期望值為GEOJSON格式。 這是您的變量$point的樣子:

{
  "point": {
    "type" : "Point", 
    "coordinates": [longitude, latitude]
  }
}

插入值(突變)時,需要相同類型的變量(GEOJSON)。

對於 GIS 操作,您需要點數據類型。 您可以使用VIEW創建一個偽表,其中包含原始列以及半徑和/或點。 您不能在視圖上創建索引(如果這很重要),但您可以在表達式上創建索引。 我目前還沒有准備好嘗試這個,但如果這不能回答你的問題,我可以稍后修改它。

就像是

CREATE VIEW offer_address AS (
  SELECT o.*, ST_DWithin(ST_MakePoint(a.lat, a.lon), a.location) radius
  FROM offers o JOIN address a ON a.id = o."addressId"
);

然后你像往常一樣插入offersaddress並查詢,但不插入, offer_address

PS GraphQL 本身不應阻止您執行任意 SQL,但我不確定您的設置到底是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM