【问题标题】:QGIS & PostGIS (map points(lat and long with raduis on USA map)QGIS 和 PostGIS(地图点(美国地图上的纬度和经度,半径)
【发布时间】:2020-05-07 13:07:54
【问题描述】:

我安装了 QGIS 和 PostGIS。我有 200 个点要显示在美国图表上,半径为 100 英里。

我已在 PostGIS 数据库中导入我的纬度和经度。所以我有三个字段:[address]、[lat]、[lng]。

1) 我需要将 lat 和 lng 字段转换为 point 或 geom 字段吗?如果有怎么办? (st_buffer?) 2) 我用什么命令/SQL 来显示带半径的点?

我可以这样查询我的积分..

SELECT * FROM postgis_test

我只是不明白如何用半径显示地图上的所有点。

示例点:

city        lat          lng
New York    40.7127753  -74.0059728
Los Angeles 34.0522342  -118.2436849
Chicago     41.8781136  -87.6297982

【问题讨论】:

    标签: sql postgresql postgis qgis


    【解决方案1】:

    首先创建一个geometrygeography 列,例如与AddGeometryColumn ..

    SELECT AddGeometryColumn ('public','postgis_test','geom',4326,'POINT',2);
    

    .. 然后用ST_Buffer的输出更新它

    UPDATE postgis_test 
    SET geom = ST_Buffer(ST_SetSRID(ST_MakePoint(lng,lat),4326),50, 'quad_segs=8');
    

    ST_Buffer的详细参数:

    • ST_SetSRID(ST_MakePoint(lng,lat),4326) :由于您的表没有 geometrygeography 列,我使用函数 ST_MakePoint 创建了一个。值 4326 对应于 SRS WGS84 - 检查哪一个适合您的坐标。
    • 5 : degrees 的缓冲区半径。如果第一个参数是geography 类型,则该值被解释为meters
    • 'quad_segs=' :用于近似四分之一圆的段数(来自documentation 的文本)

    之后,您将能够使用Add PostGIS Layer 选项将其导入 QGIS。

    示例

    创建半径为 5 度的缓冲区

    CREATE TABLE public.postgis_test (city TEXT, lng NUMERIC, lat NUMERIC);
    SELECT AddGeometryColumn ('public','postgis_test','geom',4326,'polygon',2);
    
    INSERT INTO postgis_test 
    VALUES ('New York',-74.00,40.71),
           ('Los Angeles',-118.24,34.05),
           ('Chicago',-87,41.87);
    
    UPDATE postgis_test 
    SET geom = ST_Buffer(ST_SetSRID(ST_MakePoint(lng,lat),4326),5, 'quad_segs=8');
    

    在 QGIS 中可视化缓冲区

    如果你想同时显示点和缓冲区,你必须创建一个额外的层(表格):

    CREATE TABLE public.postgis_test (city TEXT, lng NUMERIC, lat NUMERIC);
    SELECT AddGeometryColumn ('public','postgis_test','geom',4326,'point',2);
    
    INSERT INTO postgis_test 
    VALUES ('New York',-74.00,40.71),
           ('Los Angeles',-118.24,34.05),
           ('Chicago',-87,41.87);
    
    UPDATE postgis_test SET geom = ST_SetSRID(ST_MakePoint(lng,lat),4326);
    
    CREATE TABLE buffers AS
    SELECT city, ST_Buffer(geom,5, 'quad_segs=8') 
    FROM postgis_test;
    

    如果您更喜欢使用米,只需将几何列转换为 geography 并以米为单位传递参数。

    创建 100 英里(~160934 米)的缓冲区

    CREATE TABLE public.postgis_test (city TEXT, lng NUMERIC, lat NUMERIC);
    SELECT AddGeometryColumn ('public','postgis_test','geom',4326,'point',2);
    
    INSERT INTO postgis_test 
    VALUES ('New York',-74.00,40.71),
           ('Los Angeles',-118.24,34.05),
           ('Chicago',-87,41.87);
    
    UPDATE postgis_test SET geom = ST_SetSRID(ST_MakePoint(lng,lat),4326);
    
    CREATE TABLE buffers AS
    SELECT city, ST_Buffer(geom::geography,160934, 'quad_segs=8')::geometry 
    FROM postgis_test;
    

    进一步阅读:

    【讨论】:

    • 太棒了!谢谢,但我收到错误:当我运行 COPY city FROM 'cities.csv' WITH (FORMAT csv); 时缺少列“geom”的数据; (文件没有标题,只有城市、lng、lat)
    • @user2012677 您必须在 将数据导入表城市之后创建geom 列。如果你之前这样做过,postgres 会尝试将文件中的列数匹配到表中。它会失败:)
    • 成功!谢谢,能否请您解释一下 ST_Buffer(ST_SetSRID(ST_MakePoint(lng,lat),4326),5, 'quad_segs=8') 在做什么,数字 5 是什么
    • @user2012677 你可能还想看看:stackoverflow.com/a/49985371/2275388
    • 感激不尽,我学到了很多,最后一个问题:stackoverflow.com/questions/59845293/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多