地籍数据属性质检功能设计与实现

要质检的数据包括使用权宗地、所有权宗地、自然幢,属性质检规则如下:

使用权宗地、所有权宗地属性质检项如下:

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 不符合规范"
                    ]
                }
            ]
        }
    ]
}






猜你喜欢

转载自blog.csdn.net/a_dev/article/details/79983504