PostGIS:将A层中的点的ID分配给B层中的最近点


15

这应该是另一个问题的显而易见的先驱(我没有问过): 如何在PostGIS中创建蜘蛛图(集线)?

如果我不知道A层中的一个点(商店)和B层中的一个点(客户)之间的关系,我通常要说“最近的商店为客户1提供服务”。虽然我意识到这个事实可能并非如此,但它可能是一个不错的替代品。

使用PostGIS,最有效的方法是将A层(商店)中最近的点的ID分配给B层(客户)中的每个点。我正在寻找的输出如下所示。

Customer | Store
    1    |   A
    2    |   A
    3    |   B
    4    |   C

Answers:


6

同样地:

选择A.ID作为CUST_ID,(从B顺序按st_distance(A.geom,B.geom)限制1选择B.ID)作为A的STORE_ID


这是完成任务的最佳方法。有关我使用的实际代码,请参见下面的注释。
RyanKDalton

8

看来,如果您的顾客比商店多得多,那么为商店创建一层voronoi多边形,然后将顾客与商店多边形进行空间连接可能会更有效率。


1
我喜欢这种方法!
昏暗

哪种方法最容易创建voronoi polys?这里还有其他选项 吗? bostongis.com/…bostongis.com/…–
RyanKDalton

我认为第二个教程中的Delaunay Triangulation和Dirichlet软件包将是合适的,但不确定它是否最简单。
Kirk Kuykendall,2010年


5

来自http://www.bostongis.com/?content_name=postgis_nearest_neighbor

如果您需要获取表中所有记录的最近邻居,但只需要每个表的第一个最近邻居,则可以使用PostgreSQL独特的DISTINCT ON语法。看起来像这样:

SELECT DISTINCT ON(g1.gid)  g1.gid As gref_gid, 
       g1.description As gref_description, 
       g2.gid As gnn_gid, 
       g2.description As gnn_description  
FROM sometable As g1, sometable As g2   
WHERE g1.gid <> g2.gid 
      AND ST_DWithin(g1.the_geom, g2.the_geom, 300)   
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom) 

这将找到最短距离,最多300个单位。因此,您必须首先检查您的数据并找出最小距离要达到多大。



3

感谢大家的投入。最终,我结合了eprand和underdark的建议。我使用的最终代码是:

CREATE TABLE closest_point as
SELECT DISTINCT ON (A.GID) A.GID AS CUST_ID, 
      (SELECT B.GID FROM "STORES" as B 
       ORDER BY ST_Distance(A.the_geom, B.the_geom) limit 1) as STORE_ID, 
       A.the_geom 
FROM "CUSTOMERS" as A, "STORES" as B;

然后,我在商店层上创建了一张voronoi图,以确认结果正确运行,当然它们确实做到了。感谢大家的辛勤工作!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.