From 2e43fe828682de51143c7474847675c71f1d3db6 Mon Sep 17 00:00:00 2001 From: Lewis Zou Date: Sat, 11 May 2024 22:22:49 +0800 Subject: [PATCH] =?UTF-8?q?source=20=E4=BD=BF=E7=94=A8=20Layer=20=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E4=B8=BA=20key=EF=BC=8C=E4=BF=AE=E5=A4=8D=E7=BC=93?= =?UTF-8?q?=E5=AD=98=20SQL=20=E5=AF=BC=E8=87=B4=E7=9A=84=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ZMap.Source.Postgre/PostgreSource.cs | 57 +++++++++++++----------- src/ZMap/Source/ISource.cs | 2 + src/ZMap/Source/RasterSource.cs | 2 + src/ZMap/Source/VectorSourceBase.cs | 2 + src/ZServer/Store/LayerStore.cs | 1 + 5 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/ZMap.Source.Postgre/PostgreSource.cs b/src/ZMap.Source.Postgre/PostgreSource.cs index 54eacda..d9a81df 100644 --- a/src/ZMap.Source.Postgre/PostgreSource.cs +++ b/src/ZMap.Source.Postgre/PostgreSource.cs @@ -48,46 +48,49 @@ public override async Task> GetFeaturesInExtentAsync(Envelo // sql = // $"SELECT CASE WHEN ST_HasArc({Geometry}) THEN {Geometry} ELSE ST_Simplify(ST_Force2D({Geometry}), 0.00001, true) END as geom{columnSql} from (SELECT {Geometry} as geom{columnSql} FROM {Table} WHERE {@where} {Geometry} && ST_MakeEnvelope({bbox.MinX}, {bbox.MinY},{bbox.MaxX},{bbox.MaxY}, {SRID})) t"; - var sqlBuilder = new StringBuilder(); - if (Properties == null || Properties.Count == 0) + var baseSql = BaseSql.GetOrAdd(Key, (_) => { - sqlBuilder.Append("SELECT * ").Append("FROM ").Append(Table).Append(" WHERE "); - } - else - { - sqlBuilder.Append("SELECT"); - var containsId = false; - foreach (var property in Properties) + var sqlBuilder = new StringBuilder(); + if (Properties == null || Properties.Count == 0) + { + sqlBuilder.Append("SELECT * ").Append("FROM ").Append(Table).Append(" WHERE "); + } + else { - if (property == Geometry) + sqlBuilder.Append("SELECT"); + var containsId = false; + foreach (var property in Properties) { - continue; + if (property == Geometry) + { + continue; + } + + if (containsId == false && property == Id) + { + containsId = true; + } + + sqlBuilder.Append(' ').Append(property).Append(','); } - if (containsId == false && property == Id) + if (!containsId) { - containsId = true; + sqlBuilder.Append(' ').Append(Id).Append(','); } - sqlBuilder.Append(' ').Append(property).Append(','); + sqlBuilder.Append(' ').Append(Geometry).Append(" WHERE "); } - if (!containsId) + sqlBuilder.Append(Geometry).Append(" && ST_MakeEnvelope(@MinX, @MinY, @MaxX, @MaxY, @Srid)"); + + if (!string.IsNullOrEmpty(Where)) { - sqlBuilder.Append(' ').Append(Id).Append(','); + sqlBuilder.Append(" AND ").Append(Where); } - sqlBuilder.Append(' ').Append(Geometry).Append(" WHERE "); - } - - sqlBuilder.Append(Geometry).Append(" && ST_MakeEnvelope(@MinX, @MinY, @MaxX, @MaxY, @Srid)"); - - if (!string.IsNullOrEmpty(Where)) - { - sqlBuilder.Append(" AND ").Append(Where); - } - - var baseSql = sqlBuilder.ToString(); + return sqlBuilder.ToString(); + }); string sql; if (!string.IsNullOrEmpty(Filter)) diff --git a/src/ZMap/Source/ISource.cs b/src/ZMap/Source/ISource.cs index 4d19369..acdfaba 100644 --- a/src/ZMap/Source/ISource.cs +++ b/src/ZMap/Source/ISource.cs @@ -5,6 +5,8 @@ namespace ZMap.Source; /// public interface ISource : IDisposable { + string Key { get; set; } + /// /// 数据源名称 /// diff --git a/src/ZMap/Source/RasterSource.cs b/src/ZMap/Source/RasterSource.cs index 4fd840f..6ca8af9 100644 --- a/src/ZMap/Source/RasterSource.cs +++ b/src/ZMap/Source/RasterSource.cs @@ -2,6 +2,7 @@ namespace ZMap.Source; public abstract class RasterSource : IRasterSource { + public string Key { get; set; } public string Name { get; set; } /// @@ -16,6 +17,7 @@ public abstract class RasterSource : IRasterSource /// /// public abstract Task GetImageInExtentAsync(Envelope extent); + public abstract Envelope GetEnvelope(); public abstract ISource Clone(); public abstract void Dispose(); diff --git a/src/ZMap/Source/VectorSourceBase.cs b/src/ZMap/Source/VectorSourceBase.cs index 6843c6d..8c046ff 100644 --- a/src/ZMap/Source/VectorSourceBase.cs +++ b/src/ZMap/Source/VectorSourceBase.cs @@ -2,6 +2,8 @@ namespace ZMap.Source; public abstract class VectorSourceBase : IVectorSource { + public string Key { get; set; } + /// /// 数据源名称 /// diff --git a/src/ZServer/Store/LayerStore.cs b/src/ZServer/Store/LayerStore.cs index 9a0a9cf..a8b398c 100644 --- a/src/ZServer/Store/LayerStore.cs +++ b/src/ZServer/Store/LayerStore.cs @@ -327,6 +327,7 @@ private async Task RestoreSourceAsync(string resourceGroup, string name return null; } + source.Key = name; var properties = PropertyCache.GetOrAdd(source.GetType(), t => { return t.GetProperties().Where(z => z.CanWrite)