PostgreSQL检查坐标是否在边界框内

时间:2015-11-06 15:34:28

标签: postgresql latitude-longitude

我想在数据库中存储一些位置,这些位置由4个坐标cv::ocl::setUseOpenCL(true); Mat mat = cv::imread(path+filename); UMat gpuFrame = mat.getUMat(cv::ACCESS_READ); if (mat.empty()) { LOGD("Image Empty"); } cvtColor(gpuFrame, gpuBW, COLOR_BGR2GRAY); cv::Laplacian(gpuBW, gpuBW, CV_8U); cv:multiply(gpuBW, 10, gpuBW); imwrite(path+filename_result+".png", gpuBW, compression_params); cv::ocl::finish(); normalize(gpuBW, gpuBW, 0, 255, NORM_MINMAX, -1); imwrite(path+"resultNormalize.jpg", gpuBW, compression_params); 定义,唯一的特征是它们总是形成一个矩形。

一旦在DB中存储了几个位置,我希望能够查询它,给它一个点(lat,long)并检查这一点是否在DB中的任何一个框内。

我的第一个问题是设计此表的最佳方法是什么,以便以后查询它更容易和有效。我的第一个猜测是这样的:

p1(lat,long), p2(lat,long), p3(lat,long) and p4(lat,long)

但我不确定获得所有位置的最佳查询或另一个点位于其中的单个位置。例如,数据库包含2个位置(行)

 | id | lat1 | lon1 | lat2 | lon2 | lat3 | lon3 | lat4 | lon4 |
 --------------------------------------------------------------

如果我有点(5,5),我如何查询数据库以获得第1行?

2 个答案:

答案 0 :(得分:1)

问题1:矩形是否与您的示例水平对齐?

如果是,那么就足以考虑lat / long 1和3,例如,因为你知道:

minLat = lat1
minLong = long1
maxLat = lat3
maxLong = long3

问题2:纬度和长1是否小于纬度和长3(是否已订购)?

如果是:

// You simply need to check that:
(lat1 <= latX <= lat3)
&& (long1 <= longX <= long3)

如果没有,您可以预先检查lat1&lt; = lat3和long1&lt; = long2并在需要时切换它们。

最后:如果问题1的答案是“不”,那么你可以使用相同的原则,但首先你需要应用一些额外的数学。但是,参加提供的例子,我认为事实并非如此。

...无论如何,如果您打算检查更复杂的情况(例如真实 - 不仅仅是整数 - 坐标),您可能应该尝试使用PostGIS ...

答案 1 :(得分:1)

您可以使用least()greatest()函数来获取x,y值的最小值/最大值(也可以使用这些值构建两个点和一个封闭的矩形)

CREATE TABLE latlon
        ( id INTEGER NOT NULL PRIMARY KEY
        , lat1 INTEGER NOT NULL , lon1 INTEGER NOT NULL
        , lat2 INTEGER NOT NULL , lon2 INTEGER NOT NULL
        , lat3 INTEGER NOT NULL , lon3 INTEGER NOT NULL
        , lat4 INTEGER NOT NULL , lon4 INTEGER NOT NULL
        );
INSERT into LATLON ( id,lat1,lon1,lat2,lon2,lat3,lon3,lat4,lon4) VALUES
 ( 1 ,0  ,0  ,0  ,10 ,10 ,10 ,10 ,0  ),
 ( 2 ,50 ,50 ,50 ,60 ,60 ,60 ,60 ,50 );


SELECT id
        , LEAST(lat1,lat2,lat3,lat4) AS MINLAT
        , LEAST(lon1,lon2,lon3,lon4) AS MINLON
        , GREATEST(lat1,lat2,lat3,lat4) AS MAXLAT
        , GREATEST(lon1,lon2,lon3,lon4) AS MAXLON
FROM latlon;

结果:

CREATE TABLE
INSERT 0 2
 id | minlat | minlon | maxlat | maxlon 
----+--------+--------+--------+--------
  1 |      0 |      0 |     10 |     10
  2 |     50 |     50 |     60 |     60
(2 rows)
找到(5,5)点:

SELECT * FROM (
        SELECT id
        , LEAST(lat1,lat2,lat3,lat4) AS minlat
        , LEAST(lon1,lon2,lon3,lon4) AS minlon
        , GREATEST(lat1,lat2,lat3,lat4) AS maxlat
        , GREATEST(lon1,lon2,lon3,lon4) AS maxlon
        FROM latlon
        ) rect
WHERE 5 >= rect.minlat AND 5 < rect.maxlat
  AND 5 >= minlon AND 5 < rect.maxlon
        ;