使用空间函数查询数据方法

Hologres支持使用PostGIS的空间函数查询包含空间数据的表。本文以导入本地数据至Hologres并使用空间函数查询数据为例,为您介绍在Hologres中使用PostGIS空间函数的操作方法。

前提条件

背景信息

PostGIS是数据库PostgreSQL的空间扩展,PostGIS可以提供空间对象、空间索引、空间操作函数和空间操作符等空间信息服务功能。

本文为您提供了示例数据表,包含各类空间信息(经度、纬度、坐标、距离等)。您可通过如下操作使用Hologres的HoloWeb,创建表并一键导入本地数据至accommodations表和zipcodes表中,通过PostGIS的空间函数可查询两个表中所包含的空间信息数据。

操作步骤概述

操作流程

描述

步骤一:创建表

在Hologres实例的数据库中,创建accommodations表用于存储住宿地的地理位置(经度和纬度)、列表名称和其他数据。创建zipcodes表用于存储柏林邮政编码数据。

步骤二:导入测试数据

通过HoloWeb一键导入本地数据源至accommodations表和zipcodes表中。

步骤三:使用空间函数查询数据

使用PostGIS的空间函数查询表中的空间数据。

步骤一:创建表

根据如下步骤,在数据库中创建accommodations表和zipcodes表。

  1. 登录HoloWeb控制台SQL编辑器页面。

  2. 单击新增SQL窗口,选择已创建并登录的Hologres实例和数据库。

  3. 加载PostGIS插件。

    在命令编辑区域,输入如下SQL命令,单击运行

    create extension if not exists postgis; -- 加载PostGIS插件
  4. 创建accommodations表。

    运行如下SQL语句,创建accommodations表,用于存储住宿地的地理位置(经度和纬度)、列表名称和其他数据。

    说明

    创建成功后,您可右击左侧表目录下的public > ,单击刷新查看表创建结果。或通过运行日志,查看表是否创建成功。

    CREATE TABLE public.accommodations (
      id INTEGER PRIMARY KEY,
      shape GEOMETRY,
      name VARCHAR(100),
      host_name VARCHAR(100),
      neighbourhood_group VARCHAR(100),
      neighbourhood VARCHAR(100),
      room_type VARCHAR(100),
      price SMALLINT,
      minimum_nights SMALLINT,
      number_of_reviews SMALLINT,
      last_review DATE,
      reviews_per_month NUMERIC(8,2),
      calculated_host_listings_count SMALLINT, 
      availability_365 SMALLINT
    );
  5. 创建zipcodes表。

    运行如下SQL语句,创建zipcodes表,用于存储柏林邮政编码数据。

    说明

    创建成功后,您可右击左侧表目录下的public > ,单击刷新查看表创建结果。或通过运行日志,查看表是否创建成功。

    CREATE TABLE public.zipcode (
      ogc_field INTEGER PRIMARY KEY NOT NULL,
      wkb_geometry GEOMETRY,
      gml_id VARCHAR(256),
      spatial_name VARCHAR(256),
      spatial_alias VARCHAR(256),
      spatial_type VARCHAR(256)
     );

步骤二:导入测试数据

表创建成功后,您可通过HoloWeb的一键本地文件导入功能,向已创建成功的accommodations表和zipcodes表中导入数据。

  1. HoloWeb控制台中,单击顶部数据方案

  2. 数据方案页面,单击左侧一键本地文件导入,在右侧界面中单击新建数据导入

  3. 选择需要上传数据的表。

    在弹出的一键本地文件上传对话框,填写作业名称并选择已创建的实例、数据库和表(accommodations表或zipcodes表),单击下一步选择需要导入数据的表。

  4. 选择需要上传的数据和格式。

    选择数据源表页签下,您可根据如下内容进行配置,配置完成后单击下一步。需要导入的数据信息

    参数项

    参数项选择描述

    选择文件

    单击浏览,上传需要导入的数据表。仅支持后缀为.txt、.csv、.log类型的文件。请选择前提条件中为您提供的accommodations数据表和zipcodes数据表。

    选择分隔符

    选择数据的分割符,本示例中选择分号。

    说明

    您也可以根据自身数据的内容,单击分隔符右侧的选项,使用自定义分隔符。

    原始字符集

    本示例中选择UTF-8

    首行为标题

    默认为空。如您导入的数据表中的数据第一行为标题,请选中该选项。

  5. 确认需要导入的数据信息。

    在导入总览页签下,您可查看需要导入的信息是否正确,完成后单击执行执行确认

  6. 查看数据导入执行结果。

    执行完成后,系统会提示您导入状态是否成功。如执行失败,系统将提示您失败原因,您可根据原因进行修改后重新导入数据。

    您也可以通过如下代码,在SQL编辑器中查看数据的记录数量以及表中的内容。

    • 查看表中记录数量

      accommodations表中有记录数22248条,zipcodes表中有记录数190条。

      select count(*) from accommodations; -- 查询accommodations表中的记录数量
      select count(*) from zipcode; -- 查询zipcode表中的记录数量
    • 查看表中内容

      select * from accommodations; -- 查询accommodations表中的记录
      select * from zipcode; -- 查询zipcode表中的记录

步骤三:使用空间函数查询数据

表数据创建并导入成功后,您可根据需求使用空间函数查询空间数据,部分查询操作示例如下。空间函数的语法详情,请参见空间函数

  • 查询accommodations表中的记录数,其中SRID取值为4326。

    • 代码示例:

      SELECT count(*) FROM public.accommodations WHERE ST_SRID(shape) = 4326;
    • 运行结果:

       count 
      -------
       22248
      (1 row)
  • 使用WKT格式查询符合某些附加属性的几何体对象。您可以验证此邮政编码数据是否也存储在WGS 84中,该系统使用SRID取值为4326。

    说明

    空间数据必须存储在同一空间参照系中才能实现相互操作。

    • 代码示例:

      SELECT  ogc_field
              ,spatial_name
              ,spatial_type
              ,ST_SRID(wkb_geometry)
              ,ST_AsText(wkb_geometry)
      FROM    public.zipcode
      ORDER BY spatial_name
      ;
    • 运行结果:

      ogc_field  spatial_name  spatial_type  st_srid  st_astext
      ---------------------------------------------------------------
      0           10115        Polygon        4326     POLYGON((...))
      4           10117        Polygon        4326     POLYGON((...))
      8           10119        Polygon        4326     POLYGON((...))
      ...
      (190 rows returned)
  • 使用GeoJSON格式查询柏林米特(SIRD取值为10117)的面、其尺寸和此面中的点数。

    • 代码示例:

      SELECT  ogc_field
              ,spatial_name
              ,ST_AsGeoJSON(wkb_geometry)
              ,ST_Dimension(wkb_geometry)
              ,ST_NPoints(wkb_geometry)
      FROM    public.zipcode
      WHERE   spatial_name = '10117'
      ;
    • 运行结果:

      ogc_field  spatial_name  spatial_type                                   st_dimension  st_npoint
      -----------------------------------------------------------------------------------------------
      4           10117         {"type":"Polygon", "coordinates":[[[...]]]}    2             331
  • 查询勃兰登堡门(SRID取值为4326)500米范围内的住宿数量。

    • 代码示例:

      SELECT  COUNT(*)
      FROM    public.accommodations
      WHERE   ST_DistanceSphere(shape, ST_GeomFromText('POINT(13.377704 52.516431)', 4326)) < 500
      ;
    • 运行结果:

       count 
      -------
          29
      (1 row)
  • 根据查询的附近住宿地数据中获取勃兰登堡门的粗略位置。

    • 代码示例:

      WITH
          poi(loc) AS ( 
              SELECT st_astext(shape) 
              FROM accommodations 
              WHERE name LIKE '%brandenburg gate%' )
      SELECT  COUNT(*)
      FROM    accommodations a
              ,poi p
      WHERE   ST_DistanceSphere(a.shape, ST_GeomFromText(p.loc, 4326)) < 500
      ;
    • 运行结果:

       count 
      -------
          60
      (1 row)
  • 查询勃兰登堡门周围所有住宿的详细信息,并按照价格进行降序排列。

    • 代码示例:

      SELECT  name
              ,price
              ,ST_AsText(shape)
      FROM    public.accommodations
      WHERE   ST_DistanceSphere(shape, ST_GeomFromText('POINT(13.377704 52.516431)', 4326)) < 500
      ORDER BY price DESC
      ;
    • 运行结果:

                              name                        | price |                st_astext                 
      ----------------------------------------------------+-------+------------------------------------------
       DUPLEX APARTMENT/PENTHOUSE in 5* LOCATION! 7583    |   300 | POINT(13.3826510209548 52.5159819722552)
       DUPLEX-PENTHOUSE IN FIRST LOCATION! 7582           |   300 | POINT(13.3799997083855 52.5135918444834)
       Luxury Apartment in Berlin Mitte with View         |   259 | POINT(13.3835653528534 52.516360156825)
       BIG APT 4 BLNCTY-CNTR 43-H6                        |   240 | POINT(13.3800222998777 52.5134224506894)
       BIG APARTMENT-PRIME LOCATION-BEST PRICE! B0303     |   240 | POINT(13.379745196599 52.5162648947249)
       BIG APARTMENT IN BRILLIANT LOCATION-CTY CENTRE B53 |   240 | POINT(13.381383105167 52.5157082721072)
       SONYCENTER: lux apartment - 3room/2bath. WIFI      |   235 | POINT(13.3743158954191 52.5125308432819)
       CENTRE APARTMENT FOR 6 | 8853                      |   220 | POINT(13.3819039478615 52.5134866767369)
       BIG APARTMENT FOR 6 - BEST LOCATION 8863           |   209 | POINT(13.3830430841658 52.5147824286783)
       3 ROOMS ONE AMAZING EXPERIENCE! 8762               |   190 | POINT(13.3819898503053 52.5144190764637)
       AAA LOCATION IN THE CENTRE H681                    |   170 | POINT(13.3821787206534 52.5129769242004)
       H672 Nice Apartment in CENTRAL LOCATION!           |   170 | POINT(13.3803137710339 52.5132386929089)
       "Best View -best location!"                        |   170 | POINT(13.3799551247135 52.5147888483851)
       H652 Best Location for 4!                          |   170 | POINT(13.3805705422409 52.5143845784482)
       H651 FIT´s for Four in a 5* Location!              |   150 | POINT(13.3822063502184 52.5134994650996)
       NEXT TO ATTRACTIONS! H252                          |   110 | POINT(13.3823616629115 52.5136258446666)
       CTY Centre Students Home| G4                       |   101 | POINT(13.3808081476226 52.5130957830586)
       Room for two with private shower / WC              |    99 | POINT(13.3786877948382 52.5208018292043)
       StudentsHome CityCentre Mitte 91-0703              |    95 | POINT(13.3810390515141 52.5142363781923)
       FIRST LOCATION - FAIR PRICE K621                   |    80 | POINT(13.3823909855061 52.5131554670458)
       LONG STAY FOR EXPATS/STUDENTS- CITY CENTRE | K921  |    75 | POINT(13.380320945399 52.512364557598)
       Nice4Students! City Centre 8732                    |    68 | POINT(13.3810147526683 52.5136623602892)
       Comfy Room in the heart of Berlin                  |    59 | POINT(13.3813167311819 52.5127345388756)
       FO(U)R STUDENTS HOME-Best centre Location!         |    57 | POINT(13.380850032042 52.5131726958513)
       Berlin Center Brandenburg Gate !!!                 |    55 | POINT(13.3849641540689 52.5163902851474)
       !!! BERLIN CENTER BRANDENBURG GATE                 |    55 | POINT(13.379997730927 52.5127577639174)
       Superb Double Bedroom in Central Berlin            |    52 | POINT(13.3792991992688 52.5156572293422)
       OMG! That’s so Berlin!                            |    49 | POINT(13.3754883007165 52.5153487677272)
       Apartment in Berlin's old city center              |    49 | POINT(13.3821761577766 52.514037240604)
      (29 rows)
  • 查询价格最高的住宿信息以及其邮政编码。

    • 代码示例:

      SELECT  a.price
              ,a.name
              ,ST_AsText(a.shape)
              ,z.spatial_name
              ,ST_AsText(z.wkb_geometry)
      FROM    accommodations a
              ,zipcode z
      WHERE   price = 9000
      AND     ST_Within(a.shape, z.wkb_geometry)
      ;
    • 运行结果:

      price   name                                 st_astext                                  spatial_name      st_astext
      -------------------------------------------------------------------------------------------------------------------------------------------------
      9000    Ueber den Dächern Berlins Zentrum    POINT(13.334436985013 52.4979779501538)    10777             POLYGON((13.3318284987227 52.4956021172799,...
  • 查询索柏林中列出的住宿数的热点,根据邮政编码将热点住宿进行分组,并按照供应量进行排序操作。

    • 代码示例:

      SELECT  z.spatial_name AS zip
              ,COUNT(*) AS numAccommodations
      FROM    public.accommodations a
              ,public.zipcode z
      WHERE   ST_Within(a.shape, z.wkb_geometry)
      GROUP BY zip
      ORDER BY numAccommodations DESC
      ;
    • 运行结果:

      zip      numaccommodations
      ----------------------------
      10245    872
      10247    832
      10437    733
      10115    664
      ...
      (187 rows returned)