postgresql和postgis

1,空间函数转经纬度

‘{“type”:”FeatureCollection”,”features”:[{“type”:”Feature”,”properties”:{},”geometry”:‘||ST_AsGeoJSON(coverage)||‘}]}‘ coverage, ‘{ “geometry”: ‘ || ST_AsGeoJSON(coverage) || ‘, “type”:”Feature”}‘ coverage,   2,经纬度转空间函数 select st_setsrid(ST_GeomFromGeoJSON(‘ {“type”: “Polygon”, “coordinates”: [[[120.80761195570969, 31.329696975424678], [120.80649536392833, 31.296134937732152], [120.80646400492863, 31.296046376357033], [120.80646400492863, 31.296046376357037], [120.80635839563071, 31.29574812371067], [120.80611854270235, 31.296411435576953], [120.80611854270235, 31.296411435576942], [120.79069918934609, 31.33905356682529], [120.79016551413488, 31.350078785609714], [120.81061067459304, 31.35526732981206], [120.81189797033552, 31.355496907765236], [120.82072206653757, 31.357308878135473], [120.80779904791106, 31.332198958168505], [120.80761195570969, 31.329696975424678]]]} ‘), 4326)   3,多列转一列  row(列名,列名,…)   4,转对象(json)  row_to_json(row(列名,列名,…))    5,一列多行转成一行 array_agg(row_to_json(row(列名,列名,…)))   6,把数组转json   array_to_json(array_agg(row_to_json(row(列名,列名,…))))   ::jsonb   7,替换字符串  并把替换后的字符串转成json格式  如果不转成json  可能在返回到java的是会有转义字符的 replace(replace(array_to_json(array_agg(row_to_json(row(id,name)))):: varchar,‘f1‘,‘id‘),‘f2‘,‘name‘) ::json   8,行转列 regexp_split_to_table(列名, ‘用什么拆分‘);   9,空值替换函数 COALESCE(col, ‘replacement‘) :如果col列的值为null,则col的值将被替换为‘replacement‘   10,一列多行转成一行   string_agg(列名,‘分隔符  比如   ,  – ‘order by 列名)   11,字符串或者非字符串拼接  1000||‘-‘||abc||‘+‘||200   12,边界求并集  select ST_union(gdGeom) gdGeom  FROM (  SELECT st_setsrid(ST_MakeValid(ST_UnaryUnion(ST_GeomFromGeoJSON(‘{“type”:”Polygon”,”coordinates”:[[[120.975638859303,31.3283192036255],[120.970778743191,31.3256145147033],[120.95857452115,31.3322375250399],[120.957987523149,31.3330245538613],[120.957330529509,31.334168580807],[120.953603682517,31.3462786322075],[120.94005602555,31.3612369822518],[120.950500009608,31.3735147729202],[120.9654383331,31.3813001827813],[120.982623372859,31.4101638657093],[120.97882130061,31.3646903719643],[120.977531230492,31.3603893943331],[120.973724988797,31.3483324737896],[120.975638859303,31.3283192036255]]]}‘::jsonb))),4326) gdGeom  UNION SELECT st_setsrid(ST_MakeValid(ST_UnaryUnion(ST_GeomFromGeoJSON(‘{“type”:”Polygon”,”coordinates”:[[[121.028525687066,31.3832837168027],[121.0112065046,31.3830728706246],[121.004907657887,31.3843916777245],[120.983330471907,31.3930130747498],[120.977824498246,31.3972531187829],[120.977791498025,31.3972751200602],[120.977691410858,31.4062410329178],[120.974605209348,31.4164931702297],[120.979113193293,31.4221548919732],[120.981680159137,31.4265938447168],[121.017168116006,31.4494788604357],[121.018689975332,31.4220455451131],[121.039621070261,31.409067314981],[121.055906923596,31.4061392623603],[121.054691959784,31.3972050262552],[121.055987996826,31.3870949704915],[121.033364811293,31.3844573150417],[121.028525687066,31.3832837168027]]]}‘::jsonb))),4326) gdGeom ) as foo   13,查两个结果的差集 select unistore_id from retail.t_gaia_brp_precinct_conf_store where config_detail_id=‘ef5f26a35edf4da185fb44d1e146c936‘  except select unistore_id from retail.t_gaia_brp_precinct_conf_store where config_detail_id=‘2fd189a8c321479d93f2b0b89c70aa6e‘    14,区域划分(分割) ST_SubDivide ( ST_Transform(gd_geom, 4326), 2000 ) AS gd_geom   15,插入边界 st_setsrid(ST_GeomFromGeoJSON(#{gdGeom}),4326) 边界类型: {\”type\”: \”Polygon\”, \”coordinates\”: [[[120.85062407101668, 31.11844756766111], [120.8303575052602, 31.134457313892252], [120.83063856653047, 31.135044185845526], [120.89614290278149, 31.162664996771397], [120.89462190490472, 31.162730246718166], [120.85062407101668, 31.11844756766111]]]}   16,根据经纬度匹配边界 —  这种经纬度可能会落在边界上 st_within ( ST_Transform ( ST_SetSRID ( ST_Point ( a.store_lng :: NUMERIC, a.store_lat :: NUMERIC ), 4326 ), 3857 ), b.gdgeom ) —  这种经纬度只会落在边界内 ST_intersects ( ST_Transform ( ST_SetSRID ( ST_Point ( a.lng :: NUMERIC, a.lat :: NUMERIC ), 4326 ), 3857 ), — ST_intersects c.gd_geom ) —  store_coordinate转换成4326,或者3857 格式后的空间函数

(
SELECT
ST_SubDivide ( ST_Transform(gd_geom, 4326), 2000 ) AS gd_geom
FROM retail.t_gaia_retail_bms_organize_info t1
WHERE t1.parent_id = #{organizeId}
) aa
left join retail.t_gaia_brp_store_v3 ss ON ST_intersects ( ss.store_coordinate, aa.gd_geom )

17,根据边界获取中心点 一般求边界中心点或者经纬度不建议使用ST_Centroid 该用ST_PointOnSurface ST_X ( ST_Centroid ( ST_TRANSFORM ( area.gd_geom, 4326 ))) “gdLng”, ST_Y ( ST_Centroid ( ST_TRANSFORM ( area.gd_geom, 4326 ))) “gdLat”   ST_X ( ST_PointOnSurface( ST_TRANSFORM ( area.gd_geom, 4326 ))) “gdLng”, ST_Y ( ST_PointOnSurface( ST_TRANSFORM ( area.gd_geom, 4326 ))) “gdLat”   18,把查询出来的所有的点合成一个边界

      select
st_Union((ta.gaode_polygon)) gdgeom
from retail.t_gaia_dcp_ai_tile ta
inner join retail.t_gaia_retail_bms_tradearea bb on bb.id= ‘72d7e3a54f774fbfabb6e9f07b03ed32‘
and st_within (
st_transform(st_setsrid(ST_Centroid(ta.gaode_polygon),3857),4326),
st_transform(bb.gdgeom,4326)
)

19,把点按照一定数值稀化(去掉多余的点) select a.”name”, ST_Npoints(a.gd_boundar), a.gd_boundar, ST_Npoints(ST_SimplifyPreserveTopology(a.gd_boundar,100)), ST_SimplifyPreserveTopology(a.gd_boundar,100), ST_Npoints(ST_SimplifyPreserveTopology(a.gd_boundar,1000)), ST_SimplifyPreserveTopology(a.gd_boundar,1000) from retail.gaia_ocm_area a limit 100   20,筛选汉字 select “substring”(emp_name, ‘[\u4e00-\u9fa5]*‘) as 中文名, emp_name from dataman.ods_org_emp limit 10 select regexp_replace(emp_name,‘[\d|a-z|A-Z]+‘,‘‘) as 中文名, emp_name from dataman.ods_org_emp limit 10   21,查询时间段之间的时间 — 方式一 select  date(t) as day  from generate_series(‘2019-11-11‘::date,‘2019-11-17‘, ‘1 days‘) as t; — 方式二 with recursive t(n) as ( select date(‘2019-11-11‘) union all select n+1 from t where n < date(‘2019-11-17‘) )select n as day from t;   22,边界转成点

 ST_AsGeoJSON(gd_geom)

类型是  
MultiPolygon  
23, json数组根据key取value值 SELECT a.store_id,b->>‘labelValue‘ AS label FROM data_alo.store_label_monthly a, json_array_elements(store_labels) AS b WHERE b->>‘labelName‘=‘门店产值‘   24,pgsql 根据时间字符串算出是周几 SELECT extract(DOW FROM cast(‘2019-11-30‘ as TIMESTAMP));    周日是0   25,json和jsonb的区别 postgresql支持两种json数据类型:    json和jsonb 区别:         而两者唯一的区别在于效率,         json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等。         而jsonb是解析输入后保存的二进制,它在解析时会删除不必要的空格和重复的键,顺序和输入可能也不相同。使用时不用再次解析。 相同:         两者对重复键的处理都是保留最后一个键值对。效率的差别:json类型存储快,使用慢,jsonb类型存储稍慢,使用较快   26,边界精度计算       select             — 正常情况下           a.gdgeom,           ST_Npoints ( a.gdgeom) ,             — 缩小1000情况下             ST_SimplifyPreserveTopology(a.gdgeom,1000),           ST_Npoints ( ST_SimplifyPreserveTopology(a.gdgeom,1000)) ,         — 缩小10000情况下           ST_SimplifyPreserveTopology(a.gdgeom,10000) ,           ST_Npoints ( ST_SimplifyPreserveTopology(a.gdgeom,10000))       FROM             retail.t_gaia_retail_bms_tradearea a