Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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_Types_Latitude Longitude_Postgis - Fatal编程技术网

Postgresql 纬度和经度的数据类型是什么?

Postgresql 纬度和经度的数据类型是什么?,postgresql,types,latitude-longitude,postgis,Postgresql,Types,Latitude Longitude,Postgis,我是PostgreSQL和PostGIS的新手。我想在PostgreSQL 9.1.1数据库表中存储纬度和经度值。我将计算两个点之间的距离,通过使用此位置值查找更近的点 纬度和经度应该使用哪种数据类型?您可以使用数据类型-combines(x,y),它可以是您的纬度/经度。占用16个字节:2float8内部数字 或者将其设置为两列类型(float8或双精度)。每个8字节。 或者如果不需要额外的精度,则为real(=float4)。每个字节4个。 或者即使你需要绝对的精确度。每组4位数2字节,加上

我是PostgreSQL和PostGIS的新手。我想在PostgreSQL 9.1.1数据库表中存储纬度和经度值。我将计算两个点之间的距离,通过使用此位置值查找更近的点

纬度和经度应该使用哪种数据类型?

您可以使用数据类型-combines
(x,y)
,它可以是您的纬度/经度。占用16个字节:2
float8
内部数字

或者将其设置为两列类型(
float8
双精度
)。每个8字节。
或者如果不需要额外的精度,则为
real
(=
float4
)。每个字节4个。
或者即使你需要绝对的精确度。每组4位数2字节,加上3-8字节的开销

阅读有关和的详细手册


和数据类型由附加模块PostGIS提供,并占用表中的一列。每个点占用32个字节。还有一些额外的开销,比如SRID。这些类型存储(长/lat),而不是(lat/long)


开始阅读我极力主张的。它专门针对这种数据类型,并且它有现成的方法来计算点之间的距离,以及其他GIS操作,您可以在PostGIS中找到这些操作,对于具有纬度和经度的点,有地理数据类型

要添加列,请执行以下操作:

alter table your_table add column geog geography;
要插入数据:

insert into your_table (geog) values ('SRID=4326;POINT(longitude latitude)');
4326是空间参考ID,表示它的数据以经度和纬度表示,与GPS中的数据相同。更多信息:

顺序是经度,纬度-所以如果你把它画成地图,它就是(x,y)

要查找最近点,首先需要创建空间索引:

create index on your_table using gist (geog);
然后请求,比如说,距离给定点最近的5:

select * 
from your_table 
order by geog <-> 'SRID=4326;POINT(lon lat)' 
limit 5;
选择*
从你的桌子上
geog'SRID的订单=4326;点(经纬度)'
限值5;

如果您不需要PostGIS提供的所有功能,Postgres(现在)提供了一个名为的扩展模块。它使用或数据类型,具体取决于距离计算的精度需要


现在,您可以使用earth_box函数(例如)查询距离某个位置一定距离内的点。

在PostGIS中,几何图形优于地理图形(圆形地球模型),因为计算更简单,因此速度更快。它还有更多的可用功能,但在很长的距离内精度较低

将CSV long和lat字段导入到
十进制(10,6)
列。6位是10cm的精度,对于大多数用例来说应该足够了。然后将导入的数据强制转换为正确的SRID

走错了路

/* try what seems the obvious solution */
DROP TABLE IF EXISTS public.test_geom_bad;
-- Big Ben, London
SELECT ST_SetSRID(ST_MakePoint(-0.116773, 51.510357),4326) AS geom
INTO public.test_geom_bad;

正确的方法

/* add the necessary CAST to make it work */
DROP TABLE IF EXISTS public.test_geom_correct;
SELECT ST_SetSRID(ST_MakePoint(-0.116773, 51.510357),4326)::geometry(Geometry, 4326) AS geom
INTO public.test_geom_correct;
验证SRID不是零

/* now observe the incorrect SRID 0 */
SELECT * FROM public.geometry_columns
WHERE f_table_name IN ('test_geom_bad','test_geom_correct');
使用WKT查看器和

从public中选择stu AsEWKT(geom)。测试geom是否正确

然后索引它以获得最佳性能

CREATE INDEX idx_target_table_geom_gist
    ON target_table USING gist(geom);

使用数据类型在单个列中存储经度和纬度:

CREATE TABLE table_name (
    id integer NOT NULL,
    name text NOT NULL,
    location point NOT NULL,
    created_on timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT table_name_pkey PRIMARY KEY (id)
)
在“位置”列上创建索引:

CREATE INDEX ON table_name USING GIST(location);
GiST索引能够优化“最近邻”搜索:

SELECT * FROM table_name ORDER BY location <-> point '(-74.013, 40.711)' LIMIT 10;

从表中按位置点选择*名称顺序'(-74.013,40.711)'限制10;
注意:第一个元素是经度,第二个元素是纬度


有关更多信息,请检查此项。

如果您正在进行两点(2D lat/lon贴图),我将使用几何体数据类型。若你们需要在你们的距离计算中介绍地球的高度或曲率,地理是你们想去的地方。下面的答案有并没有回答你们的问题?如果是这样,我建议您选择一个作为答案:)我不建议使用
float
数据类型。这使得坐标计算非常复杂。您应该使用PostGIS和
地理
数据类型进行此类计算。这确实是一本很好的手册,不是吗?文档中的一个很好的例子。存储long、lat和geog会比为原始long lat解析geog更快吗?@Dan:dependens。请详细询问一个新问题。您始终可以链接到此链接以了解上下文。评论不是提出新问题的地方。澄清SRID4326希望经纬度按此顺序排列。但PostGIS对SRID4326的解释要求经纬度按该顺序排列。该示例对于PostGIS的使用是正确的。从表中按位置点“(-74.013,40.711)”选择*限制10;这里的第一个元素是经度,第二个元素是纬度“在很长的距离上精度较低”。你能说说“长距离”是什么意思吗。我在很多博客上都读过这篇文章,但没有一个实际的距离范围,我很难弄清楚该用哪一个。@GCQ我在这里提出的最佳方法是,你可以采集一些地理数据样本,然后用几何和地理测量距离,然后比较结果。这是因为坐标参考系(投影)的精度在地理上是不同的。
select st_point(12.0,42.0)::geometry(geometry,4326)
给出错误:geometry SRID(0)与列SRID(4326)不匹配,但
select st_setrid(st_point(12.0,42.0),4326)
works_(ツ)_/'@mathieu感谢您指出这一点。我已更正并改进了答案,以更好地强调错误设置SRID的风险。