Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL检查坐标是否在边界框内_Postgresql_Latitude Longitude - Fatal编程技术网

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

PostgreSQL检查坐标是否在边界框内,postgresql,latitude-longitude,Postgresql,Latitude Longitude,我想在数据库中存储一些位置,这些位置由4个坐标p1lat,long,p2lat,long,p3lat,long和p4lat,long定义,唯一的特点是它们总是形成一个矩形 一旦数据库中存储了几个位置,我希望能够查询它,给它一个pointlat,long,并检查这个点是否在数据库中的任何框中 我的第一个问题是,设计此表的最佳方法是什么,以使以后查询它更容易、更高效。我的第一个猜测是这样的: | id | lat1 | lon1 | lat2 | lon2 | lat3 | lon3 | lat4

我想在数据库中存储一些位置,这些位置由4个坐标p1lat,long,p2lat,long,p3lat,long和p4lat,long定义,唯一的特点是它们总是形成一个矩形

一旦数据库中存储了几个位置,我希望能够查询它,给它一个pointlat,long,并检查这个点是否在数据库中的任何框中

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

 | id | lat1 | lon1 | lat2 | lon2 | lat3 | lon3 | lat4 | lon4 |
 --------------------------------------------------------------
但我不确定哪种查询是获取所有位置或另一个点所在的单个位置的最佳查询。例如,数据库包含两个位置行

 | id | lat1 | lon1 | lat2 | lon2 | lat3 | lon3 | lat4 | lon4 |
 --------------------------------------------------------------
 | 1  |  0   |  0   |  0   |  10  |  10  |  10  |  10  |  0   |
 | 2  |  50  |  50  |  50  |  60  |  60  |  60  |  60  |  50  |
如果我有第5点,5点,我如何查询数据库以获得第1行?

问题1:矩形是否像您的示例那样水平对齐

如果是,那么就足够考虑LAT/Lon 1和3,例如,因为你知道:

minLat = lat1
minLong = long1
maxLat = lat3
maxLong = long3
问题2:lat和long 1是否比lat和long 3小

如果是:

// You simply need to check that:
(lat1 <= latX <= lat3)
&& (long1 <= longX <= long3)
如果没有,您可以事先检查lat1是否可以使用最小和最大函数来获取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
        ;

不,恐怕矩形不是水平对齐的。在这种情况下,我认为最好的解决方案是使用postgis。否则,您可以对点进行排序并应用一些三角数学来确定该点是在框内还是框外。但是,在这种情况下,除非您处理的是一个相对较小的数据库,否则我建议您事先检查由min和max lat.和long定义的外部alligned框。然后只在子查询或使用with时对其结果进行精细搜索。如果矩形没有水平对齐怎么办?那么边界框将有点太大,但它仍然是一个丰富的框。否则,您将需要一个真正的多边形。您的积分需要订购