在PostGreSQL、PostGIS的数据库以及C#环境下,openlayer对矢量切片(GeoJson方式)的操作流程

本文介绍了如何在PostgreSQL数据库中利用PostGIS处理SHP文件,并查询当前切片范围内的矢量数据。内容包括通过QGIS将SHP文件导入PostgreSQL,使用SQL查询,以及在3857和4326坐标系下获取切片范围的方法。此外,还展示了如何使用OpenLayers 6展示GeoJSON切片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostGreSQL运用PostGIS函数查询当前切片范围的矢量数据

数据是SHP文件,通过QGIS导入到PostGreSQL数据库

SQL语句参考地址

	SELECT
        row_to_json(fc)
        FROM (
        SELECT
        'FeatureCollection' AS type
        , array_to_json(array_agg(f)) AS features
        FROM (
        SELECT
        'feature' AS type
        , ST_AsGeoJSON(geom)::json as geometry
        , (
        SELECT
        row_to_json(t)
        FROM (
        SELECT
        id,geom --这里填写矢量数据信息的字段(也就是表字段)
        ) AS t
        ) AS properties
        FROM basemap where geom is not null and id in (
		select id FROM basemap
		where st_within(ST_Transform(geom,4326),
		ST_GeomFromText('POLYGON((-180 90,180 90,180 -90,-180 -90,-180 90))',4326) --此几何为当前切片范围两点最大最小值坐标绘制四边形几何
		) = true --查询在切片范围内的矢量数据
		) order by id asc
        ) AS f
        ) AS fc

从数据库中获取当前切片范围内的矢量数据

        /// <summary>
        /// 从数据库中计算获取切片
        /// </summary>
        /// <param name="level"></param>
        /// <param name="x"></param>
        /// <param name="y"></param>
        public JObject CalculateVectorTile1(RequsetParam param)
        {
   
            //定义切片范围值
            double xmin = 0;
            double xmax = 0;
            double ymin = 0;
            double ymax = 0;
            //计算切片对应的几何范围
            switch (param.Project)
            {
   
                case "4326"://平面坐标系
                    TileModel Model4326 = new ESPG4326TileModel();
                    Model4326.GetTileRect(param.zoon, param.x, param.y, out xmin, out xmax, out ymin, out ymax);
                    break;
                case "3857"://墨卡托坐标系
                    TileModel Model3857 = new ESPG3857TileModel();
                    Model3857.GetTileRect(param.zoon, param.x, param.y, out xmin, out xmax, out ymin, out ymax);
                    break;
                default:
                    break;
            }

            #region Sql语句
            string sql = string.Format(@"SELECT
                                        row_to_json(fc)
                                        FROM (
                                        SELECT
                                        'FeatureCollection' AS type
                                        , array_to_json(array_agg(f)) AS features
                                        FROM (
                                        SELECT
                                        'Feature' AS type
                                        , ST_AsGeoJSON(ST_Transform(geom,{5}))::json as geometry
                                        , (
                                        SELECT
                                        row_to_json(t)
                                        FROM (
                                        SELECT
                                        {0} 
                                        ) AS t
                                        ) AS properties
                                        FROM basemap where geom is not null and id in (
		                                select id FROM basemap
		                                where st_within(ST_Transform(geom,{5}),
		                                ST_GeomFromText('POLYGON(({1} {2},{3} {2},{3} {4},{1} {4},{1} {2}))',{5}) 
		                                ) = true 
		                                ) order by id asc
                                        ) AS f
                                        ) AS fc", param.tbName, xmax, ymax, xmin, ymin, param.Project);
            #endregion

            var str = pg_Query(sql);
            JObject jo = (JObject)JsonConvert.DeserializeObject(str);
            if (string.IsNullOrEmpty(jo["features"].ToString()))
            {
   
                jo = null;
            }
            return jo;
        }
        
        /// <summary>
        /// 公共参数
        /// </summary>
        public class RequsetParam {
   
            /// <summary>
            /// 缩放级别
            /// </summary>
            public int zoon {
    get; set; }
            /// <summary>
            /// 当前切片第一位序号
            /// </summary>
            public int x {
    get; set; }
            /// <summary>
            /// 当前切片第二位序号
            /// </summary>
            public int y {
    get; set; }
            /// <summary>
            /// 当前地图坐标系
            /// </summary>
            public string Project {
    get; set; }
            /// <summary>
            /// 表名
            /// </summary>
            public string layerName {
    get; set; }
            /// <summary>
            /// 字段名
            /// </summary>
            public string tbName {
    get; set; }
        }

获取当前切片范围工具类

3857坐标系获取切片范围工具类

using System;
using System.Collections.Generic;
using System.Linq;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值