/// <summary> /// 获取SDO_GEOMETRY的SDO_ELEM_INFO(维数组,仅针对简单图形) /// 说明:SDO_ELEM_INFO(sdo_starting_offset,sdo_etype,sdo_interpretation) /// SDO_STARTING_OFFSET:声明了组成当前几何片段的第一个坐标在SDO_ORDINATES数组中的坐标序号。坐标序号是从1开始起算的而非从0开始。 /// SDO_ETYPE:声明元素的类型。 /// SDO_ETYPE 值 = 1, 2, 1003,或2003,说明几何为简单的几何类型。可以全部按SDO_ELEM_INFO 属性单元【即三个以逗号隔开的数】来理解sdo_ordinate_array中的坐标序列。 /// 特别说明:SDO_ETYPE 值 = 1003 ,假如几何类型为面,则表示为外多边形环(以逆时针顺序) /// SDO_ETYPE 值 = 2003 ,假如几何类型为面,则表示为内多边形环(以顺时针顺序) /// </summary> /// <param name="gType"></param> /// <returns></returns> public static double[] GetElemInfo(sdogeometryTypes.GTYPE gType) { double[] arr = new double[3]; //只支持简单类型,arr[0]=1表示SDO_ORDINATES数据第一个值开始是坐标 arr[0] = 1; double type = System.Convert.ToDouble(gType); switch (gType) { case sdogeometryTypes.GTYPE.POINT: arr[1] = 1; arr[2] = 1; break; case sdogeometryTypes.GTYPE.LINE: arr[1] = 2; arr[2] = 1; break; case sdogeometryTypes.GTYPE.POLYGON://外围逆时针,不处理空岛的情况 arr[1] = 1003; arr[2] = 1; break; case sdogeometryTypes.GTYPE.UNKNOWN_GEOMETRY: arr[1] = 0; arr[2] = -999; break; default: arr[1] = 1; arr[2] = 1; break; } return arr; }
/// <summary> /// 根据SDOORDINATE坐标数组构建WKT格式的坐标串 /// </summary> /// <param name="sdoOrdinate"></param> /// <returns></returns> public static string GetWKTFromSdoOrdinate(double[] sdoOrdinate,sdogeometryTypes.GTYPE gType) { string ordinateStr = string.Empty; ordinateStr = sdoOrdinate[0].ToString(); for (int i = 1; i < sdoOrdinate.Length; i++) { ordinateStr += "," + sdoOrdinate[i]; } if (gType == sdogeometryTypes.GTYPE.POINT) { if (sdoOrdinate.Length != 2) { throw new ArgumentNullException("点图形坐标数目不正确。"); } ordinateStr = "Point(" + sdoOrdinate[0].ToString() + " " + sdoOrdinate[1].ToString() + ")"; } else if (gType == sdogeometryTypes.GTYPE.LINE) { if (sdoOrdinate.Length < 4) { throw new ArgumentNullException("线图形坐标数目不正确。"); } ordinateStr = "LINESTRING ("; for (int i = 0; i < sdoOrdinate.Length; i++) { if (i % 2 == 0)//偶数:0,2,4,6…… { ordinateStr += sdoOrdinate[i] + " "; } else if (i % 2 == 1)//奇数:1,,35,7…… { ordinateStr += sdoOrdinate[i] + ","; } } ordinateStr += ")"; } else if (gType == sdogeometryTypes.GTYPE.POLYGON) { if (sdoOrdinate.Length < 6) { throw new ArgumentNullException("面图形坐标数目不正确。"); } ordinateStr = "POLYGON (("; for (int i = 0; i < sdoOrdinate.Length; i++) { if (i % 2 == 0)//偶数:0,2,4,6…… { ordinateStr += sdoOrdinate[i] + " "; } else if (i % 2 == 1)//奇数:1,,35,7…… { ordinateStr += sdoOrdinate[i] + ","; } } ordinateStr += "))"; } return ordinateStr; }