PostGreSQL运用PostGIS函数查询当前切片范围的矢量数据
数据是SHP文件,通过QGIS导入到PostGreSQL数据库
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;