我创建了一个表,其中包含位置及其空间坐标(纬度、经度(度数)),以postgres表示。我用于相同用途的命令有:
我在postgres中插入了空间坐标(经度、纬度)
我创建了一个表,其中包含位置及其空间坐标(纬度、经度(度数)),以postgres表示。我用于相同用途的命令有:
CREATE TABLE spatialTest(
name character varying(100),
the_geo geography
);
\copy spatialTest(name,the_geo) FROM 'testSpatial.csv' DELIMITERS E'\t' CSV;
testSpatial。csv包含以下值:
A SRID=4326;POLYGON((0.178773 -127.681841,0.178711 -127.681962,0.179125 -127.682083,0.179176 -127.682006,0.179153 -127.681986,0.179143 -127.681962,0.179147 -127.681935,0.179166 -127.681913,0.179195 -127.681897,0.179244 -127.681886,0.179284 -127.681887,0.179336 -127.681904,0.179464 -127.681757,0.179489 -127.681736,0.179429 -127.681680,0.179370 -127.681516,0.179221 -127.681331,0.179184 -127.681185,0.179051 -127.681264,0.178822 -127.681499,0.178761 -127.681698,0.178796 -127.681703,0.178839 -127.681721,0.178857 -127.681736,0.178861 -127.681740,0.178871 -127.681756,0.178873 -127.681782,0.178859 -127.681809,0.178843 -127.681825,0.178812 -127.681839,0.178773 -127.681841))
B SRID=4326;POINT(0.628912 -127.700922)
现在,我想找到彼此距离在50公里以内的所有空间位置。为此,我使用了以下命令:
select s1.name, s2.name from spatialTest s1,
spatialTest s2 where ST_DWithin(s1.the_geo, s2.the_geo, 50000);
然而,令我惊讶的是,我发现尽管A和B彼此之间的距离大于50公里(精确地说是50.0995公里),但使用Chris Venese的大地测量公式发现的 (以经纬度计算点和线段之间的距离)),但结果由postgres返回。有人能帮我弄清楚我到底错在哪里吗。
我使用的是PostgreSQL 9.6devel和Postgis版本,我使用的是:POSTGIS="2.2.1 r14555"
正如其他人所说,这是你的负担。。
NOTICE: Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY
CONTEXT: COPY spatialtest, line 2, column the_geo: "SRID=4326;POINT(0.628912 -127.700922)"
很可能,您正在尝试加载(lat, long)
,而PostgreSQL需要(long, lat)
。但是,我们可以绕过输入列的顺序。我们要做的就是,
>
创建一个临时表as
geometry`。
CREATE TEMP TABLE foo(name text, the_geo geometry);
切断SRID位(EKWT),在导入时失去SRID。
sed -i -e's/SRID=4326;//' ./foo.csv
加载输入。
\copy foo(name,the_geo) FROM 'foo.csv' DELIMITERS E'\t' CSV;
复制到主表中。
INSERT INTO spatialTest(name, the_geo)
SELECT
name,
ST_Union(
ST_SetSRID(
ST_MakePoint(st_y(geom), st_x(geom))
,4326)
)::geography
FROM foo
CROSS JOIN ST_DumpPoints(foo.the_geo) AS t
GROUP BY name
ORDER BY name;
作为旁注:不要使用varchar作为名称。只需将其保留为TEXT
。除非你有很好的理由设定角色限制。
然后跑你的距离...
SELECT ST_Distance(
(SELECT the_geo FROM spatialtest WHERE name='A'), (SELECT the_geo FROM spatialtest WHERE name='B')
);
st_distance
----------------
49740.52214618
(1 row)
以下是我的疑问.... 我没有结果。 另外,我正在使用这个插件来生成请求正文。 我的查询如下所示.. null 感谢您到目前为止的阅读,如果有人能帮助我找出如何使这一工作,我将非常感谢。
我想查询表A中每个点(id)到表B中每个多边形(id)的距离。对于距离计算,我使用ST_距离。但是,ST_Distance(显然)返回到每个多边形的距离。但我只需要每个点的“最接近”结果。到目前为止,我尝试了下面的查询,它返回了正确的结果,但是(当然)只返回了一个点。 结果应该是这样的: 你有什么提示吗?非常感谢你。 更新1 运行上述查询(3h 24m)后,返回的结果为空。然而,应该有一个结果。括
问题内容: 简而言之,当不使用_geo_distance排序时,是否有一种方法可以返回地理距离? 更新:为澄清起见,我希望结果按随机顺序排列并包含距离。 问题答案: 是的,您可以使用脚本字段。 例如,假设您的文档具有一个名为的地理位置字段,则可以使用以下内容: (请注意,只是一个转义的单引号,所以真的是) 如果还希望返回该字段,则可以如下指定:
我正在使用postgis计算两个地理坐标之间的距离。 它返回给我53536.743496517米,大约等于54公里,但实际距离是103公里,我通过http://boulter.com/gps/distance/ 我在询问中是否做错了什么?
我正在尝试在代码中使用NSPredicate搜索名称。搜索工作正常,但不会返回适当的结果。当我搜索一个名称(例如“Colin”)时,它会返回表中的所有其他名称或另一个名称(例如“Mike”),但如果我输入一个不存在的随机字符串,它会返回:“找不到结果”。当我在搜索栏中键入一个名字(例如Lisa)时,我希望它能找到这个名字(Lisa)并返回它,但它没有这样做 这是我的代码: 自己name返回表中的所
不确定我是不是漏掉了什么。 如有任何建议,将不胜感激。