gis 矢量切片读取_GIS矢量切片算法(转载)

转自: https://www.giserdqy.com/database/postgresql/25838/

对于大范围矢量数据,由于类型众多范围广泛往往数据量极大,加载渲染会造成平台卡顿。因此对矢量数据进行四叉树索引切片可以高效加载当前区域矢量,提高效率。

常见的矢量数据为shapefile,可以通过GDAL读取shp范围进行四叉树划分,构建某一层级瓦块。

以下为C#调用GDAL进行矢量四叉树切片算法:

struct TileStructure{ public int level; public int x; public int y; public OSGeo.OGR.Geometry extentPolygon; public string path; public OSGeo.OGR.DataSource ds; public OSGeo.OGR.Layer layer; }

public class VectorTileTool{ List tiles; public VectorTileTool() { } public bool SeprateShpLayer(string sourcePath, string resultFolder, int level) { OSGeo.GDAL.Gdal.SetConfigOption("SHAPE_ENCODING", ""); OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); if (dr == null) { return false; } OSGeo.OGR.DataSource ds = dr.Open(sourcePath, 0); int layerCount = ds.GetLayerCount(); OSGeo.OGR.Layer layer = ds.GetLayerByIndex(0); //投影信息 OSGeo.OSR.SpatialReference coord = layer.GetSpatialRef(); string coordString; coord.ExportToWkt(out coordString); //地理范围 Envelope layerEx = new Envelope(); layer.GetExtent(layerEx, 0); 如果瓦块数据存在,全部删除 //if (Directory.Exists(resultFolder)) //{ // Directory.Delete(resultFolder,true); //} //创建文件夹 Directory.CreateDirectory(resultFolder + "\\JSON\\"); //针对本项目,划分第16级,根据地理范围求出瓦片 int y0 = Convert.ToInt32((90 - layerEx.MaxY) * Math.Pow(2, level)/180.0); int x0 = Convert.ToInt32((180 + layerEx.MinX) * Math.Pow(2, level)/180.0); int y1 = Convert.ToInt32((90 - layerEx.MinY) * Math.Pow(2, level) / 180.0); int x1 = Convert.ToInt32((180 + layerEx.MaxX) * Math.Pow(2, level) / 180.0); //20160621 ZXQ 创建层行列配置文件 string filePath = resultFolder + "\\JSON\\" + "\\tile.txt"; FileStream fs = new FileStream(filePath, FileMode.CreateNew); StreamWriter sw = new StreamWriter(fs); //写入层行列 sw.Write(level.ToString()); sw.Write(","); sw.Write(x0.ToString()); sw.Write(","); sw.Write(x1.ToString()); sw.Write(","); sw.Write(y0.ToString()); sw.Write(","); sw.Write(y1.ToString()); sw.Write(","); sw.Write("json"); sw.Flush(); sw.Close(); fs.Close(); tiles = new List(); for (int x =x0;x<=x1;x++) .........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值