要质检的数据包括使用权宗地、所有权宗地、自然幢,属性质检规则如下:
使用权宗地、所有权宗地属性质检项如下:
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 不符合规范"
]
}
]
}
]
}