Hologres支持使用PostGIS的空间函数查询包含空间数据的表。本文以导入本地数据至Hologres并使用空间函数查询数据为例,为您介绍在Hologres中使用PostGIS空间函数的操作方法。
前提条件
已创建Hologres实例,创建实例方法请参见购买Hologres。
Hologres实例中已创建数据库,创建数据库方法请参见创建数据库。
已下载好本示例所提供的示例数据表,数据表下载链接如下。
背景信息
PostGIS是数据库PostgreSQL的空间扩展,PostGIS可以提供空间对象、空间索引、空间操作函数和空间操作符等空间信息服务功能。
本文为您提供了示例数据表,包含各类空间信息(经度、纬度、坐标、距离等)。您可通过如下操作使用Hologres的HoloWeb,创建表并一键导入本地数据至accommodations表和zipcodes表中,通过PostGIS的空间函数可查询两个表中所包含的空间信息数据。
操作步骤概述
操作流程 | 描述 |
在Hologres实例的数据库中,创建accommodations表用于存储住宿地的地理位置(经度和纬度)、列表名称和其他数据。创建zipcodes表用于存储柏林邮政编码数据。 | |
通过HoloWeb一键导入本地数据源至accommodations表和zipcodes表中。 | |
使用PostGIS的空间函数查询表中的空间数据。 |
步骤一:创建表
根据如下步骤,在数据库中创建accommodations表和zipcodes表。
登录HoloWeb控制台SQL编辑器页面。
单击新增SQL窗口,选择已创建并登录的Hologres实例和数据库。
加载PostGIS插件。
在命令编辑区域,输入如下SQL命令,单击运行。
create extension if not exists postgis; -- 加载PostGIS插件
创建accommodations表。
运行如下SQL语句,创建accommodations表,用于存储住宿地的地理位置(经度和纬度)、列表名称和其他数据。
说明创建成功后,您可右击左侧表目录下的
,单击刷新查看表创建结果。或通过运行日志,查看表是否创建成功。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 );
创建zipcodes表。
运行如下SQL语句,创建zipcodes表,用于存储柏林邮政编码数据。
说明创建成功后,您可右击左侧表目录下的
,单击刷新查看表创建结果。或通过运行日志,查看表是否创建成功。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表中导入数据。
在HoloWeb控制台中,单击顶部数据方案。
在数据方案页面,单击左侧一键本地文件导入,在右侧界面中单击新建数据导入。
选择需要上传数据的表。
在弹出的一键本地文件上传对话框,填写作业名称并选择已创建的实例、数据库和表(accommodations表或zipcodes表),单击下一步。
选择需要上传的数据和格式。
在选择数据源表页签下,您可根据如下内容进行配置,配置完成后单击下一步。
参数项
参数项选择描述
选择文件
单击浏览,上传需要导入的数据表。仅支持后缀为.txt、.csv、.log类型的文件。请选择前提条件中为您提供的accommodations数据表和zipcodes数据表。
选择分隔符
选择数据的分割符,本示例中选择分号。
说明您也可以根据自身数据的内容,单击分隔符右侧的选项,使用自定义分隔符。
原始字符集
本示例中选择UTF-8。
首行为标题
默认为空。如您导入的数据表中的数据第一行为标题,请选中该选项。
确认需要导入的数据信息。
在导入总览页签下,您可查看需要导入的信息是否正确,完成后单击执行。
查看数据导入执行结果。
执行完成后,系统会提示您导入状态是否成功。如执行失败,系统将提示您失败原因,您可根据原因进行修改后重新导入数据。
您也可以通过如下代码,在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)