GeoJSON是一种用于存储地理空间数据的开放标准格式,它使用JSON对象表示地理特征和属性。PostgreSQL/PostGIS是一个功能强大的关系型数据库管理系统,它具有丰富的地理空间数据处理功能,可以轻松地将数据转换为GeoJSON格式。
将数据转换为GeoJSON格式
使用PostgreSQL和PostGIS,可以轻松地将数据转换为GeoJSON格式。下面是一些用到的转换函数和操作符:
- ST_AsGeoJSON:将地理空间数据转换为GeoJSON格式。
- json_build_object:将指定的键值对合并为一个 JSON 对象。该函数的语法如下: sql json_build_object(key text, value any [, ...]),其中,key 是 JSON 对象中的键名,可以是一个字符串或标识符。value 则是键值,可以是任何数据类型(例如数值、字符串、数组、JSON 对象等)。如果有多个键值对,可以在 key 和 value 之间添加逗号分隔。
- ST_SRID: 返回在 Spatial_ref_sys 表中定义的对象的空间参考标识符。
- array_to_json: 把数组作为一个 JSON 数组返回。一个 PostgreSQL 多维数组会成为一个数组 的 JSON 数组。
- array_agg: 聚合函数,它可以将多个行的值合并成一个数组。
- row_to_json:把行作为一个 JSON 对象返回。
1、构建坐标参考信息:
select
json_build_object('type', 'name', 'properties', json_build_object('name', 'EPSG:' || st_srid(p.geometry))) as crs
from
tzgz20240605_112242 as p
limit 1
2、将图层转为json:
select
'FeatureCollection' as "type",
array_to_json(array_agg(f)) as "features"
from
(
select
'Feature' as "type",
st_asgeojson(p.geometry)::json as "geometry",
json_build_object('id', p.id, 'lsxm', p.lsxm) as "properties"
from
tzgz20240605_112242 as p) as f
完整的:
with spref as (
select
json_build_object('type', 'name', 'properties', json_build_object('name', 'EPSG:' || st_srid(p.geometry))) as crs
from
tzgz20240605_112242 as p
limit 1),
fc as (
select
'FeatureCollection' as "type",
array_to_json(array_agg(f)) as "features"
from
(
select
'Feature' as "type",
st_asgeojson(p.geometry)::json as "geometry",
json_build_object('id', p.id, 'lsxm', p.lsxm) as "properties"
from
tzgz20240605_112242 as p) as f),
fulldata as (
select
*
from
spref,
fc)
select
row_to_json(fulldata)
from
fulldata
附:
PostGIS中关于json创建的一些函数:
函数 | 描述 | 例子 | 例子结果 |
---|---|---|---|
| 把该值返回为json 或者jsonb 。数组和组合 会被(递归)转换成数组和对象;对于不是数组和组合的值,如果有 从该类型到json 的造型,造型函数将被用来执行该 转换;否则将产生一个标量值。对于任何不是数字、布尔、空值的标 量类型,将使用文本表达,在这种风格下它是一个合法的 json 或者jsonb 值。 | to_json('Fred said "Hi."'::text) | "Fred said \"Hi.\"" |
array_to_json(anyarray [, pretty_bool]) | 把数组作为一个 JSON 数组返回。一个 PostgreSQL 多维数组会成为一个数组 的 JSON 数组。如果pretty_bool 为真,将在 第 1 维度的元素之间增加换行。 | array_to_json('{{1,5},{99,100}}'::int[]) | [[1,5],[99,100]] |
row_to_json(record [, pretty_bool]) | 把行作为一个 JSON 对象返回。如果pretty_bool 为真,将在第1层元素之间增加换行。 | row_to_json(row(1,'foo')) | {"f1":1,"f2":"foo"} |
| 从一个可变参数列表构造一个可能包含异质类型的 JSON 数组。 | json_build_array(1,2,'3',4,5) | [1, 2, "3", 4, 5] |
| 从一个可变参数列表构造一个 JSON 对象。通过转换,该参数列表由交替 出现的键和值构成。 | json_build_object('foo',1,'bar',2) | {"foo": 1, "bar": 2} |
| 从一个文本数组构造一个 JSON 对象。该数组必须可以是具有偶数个成员的 一维数组(成员被当做交替出现的键/值对),或者是一个二维数组(每一个 内部数组刚好有 2 个元素,可以被看做是键/值对)。 |
| {"a": "1", "b": "def", "c": "3.5"} |
| json_object 的这种形式从两个独立的数组得到键/值对。在其 他方面和一个参数的形式相同。 | json_object('{a, b}', '{1,2}') | {"a": "1", "b": "2"} |