要质检的数据包括使用权宗地、所有权宗地、自然幢,属性质检规则如下:
使用权宗地、所有权宗地属性质检项如下:
1. 必填项
区县代码(QXDM)、宗地特征码(ZDTZM)、坐落(ZL)、定着物特征码(DZWTZM)、权力人(QLR)、面积单位(MJDW)。
2. 字段限制
1) 要素代码(YSDM)为空,或不为空必须是10位数字组成;
2) 宗地代码(ZDDM)为空,或不为空必须是19位、数字或字母组成;
3) 不动产单元号(BDCDYH)为空,或不为空必须是28位、数字或字母组成;
4) 宗地特征码(ZDTZM),2个字母组成,如果第一个字母是G、第二个字母只能是BDEFSXY中的一个,第一个字母是J、第二字母是ABCDEFSXY中一个,第一个字母是Z、第二个字母只能是W,无其他组合;
5) 定着物特征码(DZWTZM),宗地只能是W。
自然幢属性质检项如下:
1. 字段限制
1) 区县代码(QXDM)为空,或不为空只能是6位数字;
2) 要素代码(YSDM)为空,或不为空必须是10位数字组成;
3) 宗地代码(ZDDM)为空,或不为空必须是19位、数字或字母组成;
4) 不动产单元号(BDCDYH)为空,或不为空必须是28位、数字或字母组成;
5) 自然幢号(ZRZH)为空,或不为空必须是24位、数字或字母组成;
宗地宗海特征码(ZDZHTZM)为空,或不为空由2个字母组成,如果第一个字母是G、第二个字母只能是BDEFSXY中的一个,第一个字母是J、第二字母是ABCDEFSXY中一个,第一个字母是Z、第二个字母只能是W,无其他组合。设计时,考虑通用性和可复用性,设计了质检类CheckFieldValue,并在此基础上设计了一宗地数据的宗地特征码、自然幢数据的宗地宗海特征码检查类ParcelCheckFieldValue。
如下:
using GISWebService.HttpRequestContent; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Web; namespace GISWebService.Common { /// <summary> /// 属性质检 /// </summary> public class CheckFieldValue { /// <summary> /// 要质检的属性与值 /// </summary> private static Dictionary<string, object> _dictFieldValue { get; set; } /// <summary> /// 质检结果 /// </summary> //private static List<CheckFieldResult> _listResult { get; set; } private static List<string> _listResult { get; set; } /// <summary> /// 属性质检 /// </summary> /// <param name="name">字段名</param> /// <param name="value">字段值</param> public CheckFieldValue(string name, object value) { CheckInstance(); object oValue = null; if (_dictFieldValue.TryGetValue(name, out oValue)) _dictFieldValue[name] = value; else _dictFieldValue.Add(name, value); } /// <summary> /// 属性质检 /// </summary> /// <param name="dictFieldValue">属性名与属性值集合</param> public CheckFieldValue(Dictionary<string, object> dictFieldValue) { CheckInstance(); _dictFieldValue = dictFieldValue; } /// <summary> /// /// </summary> private static void CheckInstance() { if (null == _dictFieldValue) _dictFieldValue = new Dictionary<string, object>() { }; _dictFieldValue.Clear(); if (null == _listResult) _listResult = new List<string>() { }; } /// <summary> /// 正则表达式匹配检查 /// </summary> /// <param name="sInput">检查参数</param> /// <param name="sPattern">正则表达式</param> /// <returns>是否匹配</returns> public static bool IsMatch(string sInput, string sPattern) { return IsMatch(sInput, sPattern, false, false); } /// <summary> /// 正则表达式匹配检查 /// </summary> /// <param name="sInput">检查参数</param> /// <param name="sPattern">正则表达式</param> /// <param name="bIngnoreCase">忽略大小写</param> /// <param name="bIngnoreWhiteSpace">忽略空白</param> /// <returns>是否匹配</returns> public static bool IsMatch(string sInput, string sPattern, bool bIngnoreCase, bool bIngnoreWhiteSpace) { if (bIngnoreWhiteSpace && string.IsNullOrWhiteSpace(sInput)) return false; return (bIngnoreCase ? new Regex(sPattern, RegexOptions.IgnoreCase) : new Regex(sPattern)).IsMatch(sInput); } /// <summary> /// 是否为纯数字的字符串 /// </summary> /// <param name="sInput">检查参数</param> /// <param name="nMinLength">最小长度</param> /// <param name="nMaxLength">最大长度</param> /// <returns>是否匹配</returns> public static bool IsNumberString(string sInput, int nMinLength, int nMaxLength) { return IsMatch(sInput, @"^([0-9]{" + nMinLength + "," + nMaxLength + "})$"); } /// <summary> /// 是否为指定长度的字符串(包含数字、英文字符) /// </summary> /// <param name="sInput">检查参数</param> /// <param name="nMinLength">最小长度</param> /// <param name="nMaxLength">最大长度</param> /// <returns>是否匹配</returns> public static bool IsNumberStringOrEnglishCharactor(string sInput, int nMinLength, int nMaxLength) { return IsMatch(sInput, @"^([0-9a-zA-Z]{" + nMinLength + "," + nMaxLength + "})$"); } /// <summary> /// 非空检查(不允许为空) /// </summary> public void RuleNotNullable() { foreach (var _item in _dictFieldValue) { if (ValueConvert.IsNull(_item.Value)) _listResult.Add(string.Format("必填字段 {0} 为空", _item.Key)); } } /// <summary> /// 固定长度检查(为空或为固定长度的字符串,可为数字或英文字符) /// </summary> /// <param name="nLength">固定长度</param> public void RuleNullOrFixedLength(int nLength) { foreach (var _item in _dictFieldValue) { if (!ValueConvert.IsNull(_item.Value) && !IsNumberStringOrEnglishCharactor(Convert.ToString(_item.Value), nLength, nLength)) _listResult.Add(string.Format("字段 {0} 长度不为 {1} 位", _item.Key, nLength)); } } /// <summary> /// 固定长度检查(为空或为固定长度的数字字符串) /// </summary> /// <param name="nLength"></param> public void RuleNullOrFixedLengthDigit(int nLength) { foreach (var _item in _dictFieldValue) { if (!ValueConvert.IsNull(_item.Value) && !IsNumberString(Convert.ToString(_item.Value), nLength, nLength)) _listResult.Add(string.Format("字段 {0} 长度不为 {1} 位", _item.Key, nLength)); } } /// <summary> /// 清空检查结果 /// </summary> public void ClearResult() { if (null != _listResult && 0 < _listResult.Count) _listResult.Clear(); } /// <summary> /// 获取质检结果 /// </summary> /// <param name="bAutoClear">是否自动清空</param> /// <returns>质检结果</returns> public List<string> GetResult(bool bAutoClear = true) { List<string> ls = new List<string>(_listResult); if (bAutoClear) _listResult.Clear(); return ls; } } /// <summary> /// 宗地属性检查 /// </summary> public class ParcelCheckFieldValue { /// <summary> /// 检查宗地特征码 /// </summary> /// <param name="field">字段名</param> /// <param name="value">字段值</param> /// <returns>质检结果</returns> public static string CheckParcelFeatureCode(string field, object value, bool allowNull = false) { bool bNull = ValueConvert.IsNull(value); if (!allowNull && bNull) return string.Format("字段{0}不允许为空", field); else if (allowNull && bNull) return null; return CheckFieldValue.IsMatch(System.Convert.ToString(value), @"^((G[BDEFSXY])|(J[ABCDEFSXY])|(ZW))$") ? null : string.Format("字段 {0} 不符合规范", field); } /// <summary> /// 检查宗地的定着物特征码 /// </summary> /// <param name="field">字段名</param> /// <param name="value">字段值</param> /// <returns>质检结果</returns> public static string CheckFixedThingFeatureCode(string field ,object value) { return (!ValueConvert.IsNull(value) && 0 == string.Compare(Convert.ToString(value), "W", true)) ? null : string.Format("字段 {0} 不符合规范", field); } } }
其中,接口传入参数与质检结果相关返回参数设计如下:
using GeoJSON.Net.Feature; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace GISWebService.HttpRequestContent { /// <summary> /// 属性质检的传入参数 /// </summary> public class CheckFieldsRequestBody { /// <summary> /// 图层 /// </summary> [JsonProperty("layer")] public string Layer { get; set; } /// <summary> /// 要素集合 /// </summary> [JsonProperty("feature")] public List<Feature> Feature { get; set; } } /// <summary> /// 要素属性质检结果 /// </summary> public class CheckPropertyResult { /// <summary> /// OBJECTID /// </summary> [JsonProperty("objectid")] public int ObjectID { get; set; } /// <summary> /// 字段检查结果 /// </summary> [JsonProperty("fields")] public List<string> FieldInfo { get; set; } } /// <summary> /// 属性质检结果 /// </summary> public class CheckFieldsResponseBody { /// <summary> /// 图层 /// </summary> [JsonProperty("layer")] public string Layer { get; set; } /// <summary> /// 质检结果 /// </summary> [JsonProperty("info")] public List<CheckPropertyResult> Information { get; set; } } }
调用时,以宗地质检为例:
{ foreach (var aFeature in item.Feature) { object oOid = null; if (!aFeature.Properties.TryGetValue("OBJECTID", out oOid)) throw new Exception(string.Format("图层 {0} 存在OBJECTID有误的要素", item.Layer)); int nOid = System.Convert.ToInt32(oOid); CheckPropertyResult aCheckPropResult = new CheckPropertyResult() { ObjectID = nOid, FieldInfo = new List<string>() { } }; { List<string> lsNotNullFields = new List<string>() { "QXDM", "ZDTZM", "ZL", "DZWTZM", "QLR", "MJDW" }; Dictionary<string, object> dict = new Dictionary<string, object>() { }; foreach (var field in lsNotNullFields) { object oValue = null; if (!aFeature.Properties.TryGetValue(field, out oValue)) throw new Exception(string.Format("未能获取图层 {0} 的OBJECTID为 {1} 的要素的 {2} 字段值", item.Layer, nOid, field)); dict.Add(field, oValue); } CheckFieldValue aCheck = new CheckFieldValue(dict); aCheck.RuleNotNullable(); aCheckPropResult.FieldInfo.AddRange(aCheck.GetResult()); } { for (int n = 0; n < 3; n++) { string sFieldName = null; if (0 == n) sFieldName = "YSDM"; else if (1 == n) sFieldName = "ZDDM"; else sFieldName = "BDCDYH"; object oValue = null; if (!aFeature.Properties.TryGetValue(sFieldName, out oValue)) throw new Exception(string.Format("未能获取图层 {0} 的OBJECTID为 {1} 的要素的 {2} 字段值", item.Layer, nOid, sFieldName)); CheckFieldValue aCheck = new CheckFieldValue(sFieldName, oValue); if (0 == n) aCheck.RuleNullOrFixedLengthDigit(10); else if (1 == n) aCheck.RuleNullOrFixedLength(19); else aCheck.RuleNullOrFixedLength(28); aCheckPropResult.FieldInfo.AddRange(aCheck.GetResult()); } } { for (int n = 0; n < 2; n++) { string sFeatureCode = (0 == n) ? "ZDTZM" : "DZWTZM"; object oValue = null; if (!aFeature.Properties.TryGetValue(sFeatureCode, out oValue)) throw new Exception(string.Format("未能获取图层 {0} 的OBJECTID为 {1} 的要素的 {2} 字段值", item.Layer, nOid, sFeatureCode)); string sResult = 0 == n ? ParcelCheckFieldValue.CheckParcelFeatureCode(sFeatureCode, oValue) : ParcelCheckFieldValue.CheckFixedThingFeatureCode(sFeatureCode, oValue); if (!string.IsNullOrEmpty(sResult)) aCheckPropResult.FieldInfo.Add(sResult); } } aResponseBody.Information.Add(aCheckPropResult); } }
若传入的参数为如下结构的List<CheckFieldsRequestBody>类型的param对象,内容为:
[ { "layer": "ZRZ", "feature": [ { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [ 38527161.51, 2564408.7410000004 ], [ 38527162.14, 2564389.3790000007 ], [ 38527096.8336, 2564387.3809999991 ], [ 38527096.8223, 2564387.7569999993 ], [ 38527088.323, 2564394.569 ], [ 38527087.9087, 2564394.6539999992 ], [ 38527087.5629, 2564406.4140000008 ], [ 38527161.51, 2564408.7410000004 ] ] ] }, "properties": { "OBJECTID": 1343, "BSM": null, "YSDM": null, "BDCDYH": "441322001001GB08213F0005000", "ZDDM": "441322001001GB082134", "ZRZH": "441322001001GB08213F005", "XMMC": null, "JZWMC": null, "JGRQ": null, "JZWGD": null, "ZZDMJ": 1387.1000000000001, "ZYDMJ": null, "YCJZMJ": null, "SCJZMJ": null, "ZCS": 3, "DSCS": 3, "DXCS": null, "GHYT": null, "FWJG": null, "ZTS": null, "JZWJBYT": null, "DAH": null, "BZ": null, "ZT": null, "GID": "E5078ADBDD8A49A0958762CE5106C9AF", "RKSJ": null, "SJZT": null, "ISLOCK": null, "ZDZHTZM": "GAB", "ZBH": null, "IMPORTFLAG": null, "BMFBUILDID": null, "BMFBUILDCODE": null, "RKRQ": null, "RKR": null, "RKRID": null, "RKID": null, "ZTHYY": null, "RKFS": null, "DZWTZM": null, "ZL": "BL县LY镇水西村委会望牛墩(土名)地段远望数码城8栋", "ZDT": "ZDImage/E5078ADBDD8A49A0958762CE5106C9AF.jpg", "DXSD": null, "QXDM": null, "YBDCDYH": null, "HQZTBS": null, "DOCUNID": null, "QJSHBZ": null } }, { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [ 38527157.83, 2564265.0409999993 ], [ 38527158.08, 2564257.2640000004 ], [ 38527118.2, 2564245.0390000008 ], [ 38527118.269999996, 2564242.3949999996 ], [ 38527090.652, 2564241.6089999992 ], [ 38527090.0357, 2564262.9230000004 ], [ 38527157.83, 2564265.0409999993 ] ] ] }, "properties": { "OBJECTID": 813, "BSM": null, "YSDM": null, "BDCDYH": "441322001001GB08213F00150000", "ZDDM": "441322001001GB08213", "ZRZH": "441322001001GB08213F0015", "XMMC": null, "JZWMC": null, "JGRQ": null, "JZWGD": null, "ZZDMJ": 1123.8, "ZYDMJ": null, "YCJZMJ": null, "SCJZMJ": null, "ZCS": null, "DSCS": null, "DXCS": null, "GHYT": null, "FWJG": null, "ZTS": null, "JZWJBYT": null, "DAH": null, "BZ": null, "ZT": null, "GID": "07B5F49C731B4F9CACDF77DAEEE502BB", "RKSJ": null, "SJZT": null, "ISLOCK": null, "ZDZHTZM": "GB", "ZBH": null, "IMPORTFLAG": null, "BMFBUILDID": null, "BMFBUILDCODE": null, "RKRQ": null, "RKR": null, "RKRID": null, "RKID": null, "ZTHYY": null, "RKFS": null, "DZWTZM": null, "ZL": "BL县LY镇水西村委会望牛墩(土名)地段远望数码城15栋", "ZDT": "ZDImage/07B5F49C731B4F9CACDF77DAEEE502BB.jpg", "DXSD": null, "QXDM": null, "YBDCDYH": null, "HQZTBS": null, "DOCUNID": null, "QJSHBZ": null } } ] }, { "layer": "ZD_SHYQ", "feature": [ { "type": "Feature", "geometry": { "type": "Polygon", "coordinates": [ [ [ 38526926.715, 2564197.0757999998 ], [ 38526920.7464, 2564198.8359999992 ], [ 38526919.6978, 2564204.0397999994 ], [ 38526910.2842, 2564503.0131 ], [ 38526998.747, 2564504.4110000003 ], [ 38526998.7721, 2564521.7214 ], [ 38527175.1219, 2564521.6728000008 ], [ 38527175.582, 2564507.2051999997 ], [ 38527175.8705, 2564495.5077 ], [ 38527180.167899996, 2564363.0360000003 ], [ 38527183.1127, 2564270.4807999991 ], [ 38527178.6205, 2564255.3690000009 ], [ 38527165.8622, 2564245.9126999993 ], [ 38526952.1922, 2564176.4903999995 ], [ 38526941.2566, 2564175.5524000004 ], [ 38526934.5509, 2564178.1996999998 ], [ 38526930.5365, 2564179.7846000008 ], [ 38526925.1559, 2564185.8017999996 ], [ 38526922.8309, 2564188.4188 ], [ 38526920.355399996, 2564197.5955 ], [ 38526926.715, 2564197.0757999998 ] ] ] }, "properties": { "OBJECTID": 780, "BSM": 2564, "YSDM": "60201030110", "ZDDM": null, "BDCDYH": "441322001001444GB08213W00000000", "ZDTZM": "ZpW", "ZL": "BL县LY镇水西村望牛墩地段-远望数码城", "ZDMJ": 81035, "MJDW": "1", "YT": "054", "DJ": null, "JG": null, "QLLX": "3", "QLXZ": "102", "QLSDFS": "2", "RJL": null, "JZMD": null, "JZXG": null, "ZDSZD": "空地", "ZDSZN": "空地", "ZDSZX": "空地", "ZDSZB": "空地", "ZDT": "ZDImage/2CE6B4BA40584E7DAC9E2C14A84F2924.jpg", "TFH": null, "DJH": null, "DAH": null, "ZT": null, "ZLDWDM": null, "ZLDWMC": null, "GID": "2CE6B4BA40584E7DAC9E2C14A84F2924", "RKSJ": null, "SJZT": 0, "ISLOCK": null, "RKFS": "0", "DZWTZM": "A", "JZDH": null, "TDSYQSSJ": "2013-12-12T00:00:00", "TDSYJSSJ": "2053-12-12T00:00:00", "BZ": "本宗地土地证为:B府国用(2014)第010031号,B府国用(2013)第010198号,土地用途为商业用地,使用期限至2053年12月12日止,土地用途为商服用地,使用期限至2051年11月8日止", "QLR": null, "ZYYT": "054", "QXDM": "441322", "YBDCDYH": null, "ZDH": null, "HQZTBS": null, "DOCUNID": null, "QJSHBZ": null } } ] } ]
则质检返回结果为:
{ "status": 0, "result": [ { "layer": "ZRZ", "info": [ { "objectid": 1343, "fields": [ "字段 ZDDM 长度不为 19 位", "字段 BDCDYH 长度不为 28 位", "字段 ZRZH 长度不为 24 位", "字段 ZDZHTZM 不符合规范" ] }, { "objectid": 813, "fields": [] } ] }, { "layer": "ZD_SHYQ", "info": [ { "objectid": 780, "fields": [ "必填字段 QLR 为空", "字段 YSDM 长度不为 10 位", "字段 BDCDYH 长度不为 28 位", "字段 ZDTZM 不符合规范", "字段 DZWTZM 不符合规范" ] } ] } ] }