zoukankan      html  css  js  c++  java
  • Introduction to PostGIS 之 Spatial clustering(介绍ST_SnapToGrid)

          Clustering:聚集、分类归并的意思。在PostGIS中有两个地方会涉及到这个词,虽然这两处使用相同的术语,但表示不同的意思,一个是Index clustering,另一个就是下面要介绍的Spatial Clustering。

           Spatial Clustering:这个通常用在点类型上,可以把一些点通过邻近性或其他特点聚集到一起。实现这个主要用到了ST_SnapToGrid这个方法,下面就介绍下ST_SnapToGrid:   

    将用到以下几个方法:

        boolean ST_Overlaps(geometry A, geometry B); 判断Geometries是否有交汇并不是完全包含。

        boolean ST_Touches(geometry g1, geometry g2);判断geometries之间至少有一个公共点并内部不相交。

        geometry ST_Translate(geometry g1, float deltax, float deltay);几何转换到一个新的位置。

        geometry ST_SnapToGrid(geometry geomA, float size);Snap all points of the input geometry to the grid defined by its origin and cell size. Remove consecutive points falling on the same cell, eventually returning NULL if output points are not enough to define a geometry of the given type.Collapsed geometries in a collection are stripped from it.(英语不咋地就不翻了)

    先建个表:

    -- 创建translate_polygons表
    CREATE TABLE translate_polygons (
    "id" SERIAL
    NOT NULL PRIMARY KEY,
    "name"
    char(1) NOT NULL,
    "the_geom" geometry
    NOT NULL
    );
    -- 添加数据
    INSERT INTO translate_polygons (name, the_geom) VALUES (
    'A','POLYGON((2 1, 0 3, 2 3, 2 1))'::geometry
    ), (
    'B', 'POLYGON((0 3, 2 5, 2 3, 0 3))'::geometry
    ), (
    'C', 'POLYGON((2 5, 4 3, 2 3, 2 5))'::geometry
    ), (
    'D', 'POLYGON((4 3, 2 1, 2 3, 4 3))'::geometry
    );

    在QGIS中打开,编辑下样式后如下图:

    SELECT t1.name || ' overlaps ' || t2.name || ' = ' || ST_Overlaps(t1.the_geom, t2.the_geom)::text AS overlap_test,
    t1.name
    || ' touches ' || t2.name || ' = ' || ST_Touches(t1.the_geom, t2.the_geom)::text AS touch_test
    FROM translate_polygons AS t1,
    translate_polygons
    AS t2
    WHERE t1.name <> t2.name
    ORDER BY t1.name, t2.name;

     查看相交情况:

    使用ST_Translate移动两个三角形(A和C):

    -- A,C往左下角移动

    UPDATE translate_polygons
    SET the_geom = ST_Translate(the_geom, -0.4, -0.2)
    WHERE name = 'A';

    UPDATE translate_polygons
    SET the_geom = ST_Translate(the_geom, -0.1, -0.4)
    WHERE name = 'C';

     查看相交情况:

    图形显示:

    使用ST_SnapToGrid:

    UPDATE translate_polygons
    SET the_geom = ST_SnapToGrid(the_geom, 1)

     

    如果把A往左移动的距离改为0.6,再做ST_SnapToGrid:

    -- A,C往左下角移动

    UPDATE translate_polygons
    SET the_geom = ST_Translate(the_geom, -0.6, -0.2)
    WHERE name = 'A';

    UPDATE translate_polygons
    SET the_geom = ST_Translate(the_geom, -0.1, -0.4)
    WHERE name = 'C';

    对ST_SnapToGrid有了大概了解,下一篇研究下具体的使用了。

  • 相关阅读:
    Qt5.3中qml ApplicationWindow设置窗口无边框问题
    解决qt5在ubuntu下无法调用fcitx输入中文的问题
    qt4.8中多线程的几种方式
    qt5.2.1在linux下去除最大化和最小化按钮
    最近玩了一下qt5.2.1,顺着写点东西,关于这个版本设置程序主窗口居中
    控制台小游戏-贪吃蛇,c++和c#版
    数据库锁机制(一)——概述
    jQuery插件编写学习+实例——无限滚动
    通过错误处理来理解三次握手和四次挥手
    发现一个木马
  • 原文地址:https://www.cnblogs.com/shitao/p/2109315.html
Copyright © 2011-2022 走看看