private void btnBreakLines_Click(object sender, EventArgs e) { try { //20130228 string sqlstr = "SELECT a.gid,st_astext(a.the_geom) as geom_txt, a.kind from" + " " + layerName + " " + "a order by gid,geom_txt,kind asc"; dt = postDB.DoQueryEx(sqlstr); //���ڴ洢ͼ���ĸ��� int sumPointCount = 0; //������������·���·����948������� PostGISPoint[] TmpPoints; //�������ı��� string tablename = layerName + "_lines"; //�����Ƿ���ڣ�������ɾ������������ //20130228 sqlstr = "create table" + " " + tablename + " (line_gid integer,svertex_index integer,geom geometry,kind integer)"; CheckCreateTable(tablename, sqlstr); //��ѭ���壬�������߶δ�� for (int i = 0; i < dt.Rows.Count; i++) { //��ȡ���������ַ���,���Ը�ʽ������ string geomety = dt.Rows[i][1].ToString(); string[] coor = geomety.Split(','); string startpoint = coor[0].Substring(17); int tmpLength = coor[coor.Length - 1].Length; string endpoint = coor[coor.Length - 1].Substring(0, tmpLength - 2); coor[0] = startpoint; coor[coor.Length - 1] = endpoint; TmpPoints = new PostGISPoint[coor.Length]; sumPointCount += coor.Length; //�������ʽ���洢 for (int j = 0; j < coor.Length; j++) { //xy����ʹ�ÿո�ֿ� string[] xy = coor[j].Split(' '); char[] trim=new char[2]; trim[0] = ')'; trim[1] = '('; //����м�������ŵĴ洢����Ҫ�����Ź��˵� xy[0] = xy[0].Trim(trim); xy[1] = xy[1].Trim(trim); TmpPoints[j].x = Convert.ToDouble(xy[0]); TmpPoints[j].y = Convert.ToDouble(xy[1]); } //������д�뵽���� int gid, svertex_index, kind; string geom; for (int k = 0; k < TmpPoints.Length - 1; k++) { //������д�뵽���У���Ÿ�ʽΪgid��svertex_index,geom //20130228 gid = Convert.ToInt32(dt.Rows[i]["gid"].ToString()); svertex_index = k; geom = "LINESTRING(" + TmpPoints[k].x.ToString() + " " + TmpPoints[k].y.ToString() + "," + TmpPoints[k + 1].x.ToString() + " " + TmpPoints[k + 1].y.ToString() + ")"; kind = Convert.ToInt32(dt.Rows[i]["kind"].ToString()); sqlstr = "INSERT INTO" +" "+ tablename + "(line_gid,svertex_index,geom,kind) values (" + gid + "," + k + "," + "st_geomfromtext('" + geom + "', 4326)" + "," + kind + ")"; postDB.InsertRow(sqlstr); } } txtPointCount.Text = sumPointCount.ToString(); //������н�� DataTable tmpdt = GetData(tablename); GvwData.DataSource = tmpdt; } catch (System.Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); } }
/// <summary> /// �ж����������ݲΧ���Dz���ͬһ���㣬�˴�ʹ����ıȽϷ�ʽ���������ʹ�û������ж� /// </summary> /// <param name="point1"></param> /// <param name="point2"></param> /// <param name="tolerance"></param> /// <returns></returns> private bool IsSamePoint(PostGISPoint point1, PostGISPoint point2, double tolerance) { double dx, dy; dx = Math.Abs(point1.x - point2.x); dy = Math.Abs(point1.y - point2.y); if (dx<tolerance && dy<tolerance) { return true; } else { return false; } }
/// <summary> /// �жϵ��Ƿ�Ϊһ��mls�������յ� /// </summary> /// <param name="tmpPoints"></param> /// <returns></returns> private bool IsSE(PostGISPoint[] tmpPoints, PostGISPoint point) { PostGISPoint tp = new PostGISPoint(); bool b1,b2; tp = tmpPoints[0]; //��γ�ȱ�ʾ�£�С�����5λ�൱��10m���ݲ��� b1 = IsSamePoint(tp, point, 0.00000001); tp = tmpPoints[tmpPoints.Length-1]; b2 = IsSamePoint(tp, point, 0.00000001); if (b1 && b2) { return true; } else { return false; } }
/// <summary> /// ��ָ������������� /// </summary> /// <param name="points"></param> /// <param name="index"></param> /// <param name="point"></param> private PostGISPoint[] InsertPoint(PostGISPoint[] points, int index, PostGISPoint point) { PostGISPoint[] tp = new PostGISPoint[points.Length+1]; for (int i = 0; i < tp.Length;i++ ) { if (i==index+1) { tp[i] = point; } else if (i<=index) { tp[i] = points[i]; } else { tp[i] = points[i - 1]; } } //points = tp; return tp; }
/// <summary> /// �жϵ��Ƿ�����ָ�������߶�֮�䣬��Ϊ�����յ㣬����ֵΪ1����������0 /// </summary> /// <param name="tmpPoints"></param> /// <param name="index"></param> /// <param name="point"></param> /// <returns></returns> private int IsBetweenSE(PostGISPoint[] tmpPoints, int index, PostGISPoint point) { PostGISPoint tp = new PostGISPoint(); tp = tmpPoints[index]; bool b1,b2; //��γ�ȱ�ʾ�£�С�����5λ�൱��10m���ݲ��� b1 = IsSamePoint(tp, point, 0.00000001); tp = tmpPoints[index+1]; b2 = IsSamePoint(tp, point, 0.00000001); if (b1 && b2) { return (int)1; } else { return (int)0; } }
/// <summary> /// ��ȡ��ʼ������ /// </summary> /// <param name="pointgeomtxt">������wkt</param> /// <returns>��ʼ������</returns> private PostGISPoint GetPointFromTxt(string pointgeomtxt) { //"POINT(116.369301237714 39.762246673303)" string[] tmp; string tmpX,tmpY; PostGISPoint tmpPoint; tmpPoint = new PostGISPoint(); tmp = pointgeomtxt.Split(' '); tmpX = tmp[0].Substring(6); tmpY = tmp[1].Substring(0, tmp[1].Length - 2); tmpPoint.x = double.Parse(tmpX); tmpPoint.y = double.Parse(tmpY); return tmpPoint; }
/// <summary> /// �����ߵ�wkt��������� /// </summary> /// <param name="vertexid">��ʼ��id</param> /// <param name="linegeomtxt">�����ӱߵ�wkt</param> /// <param name="isEndPoint">��ʼ���Ƿ�Ϊ�߶ε���ֹ���</param> /// <returns></returns> private PostGISPoint GetPointFromLine(string linegeomtxt,bool isEndPoint) { PostGISPoint point; string strpoint; string[] tmppoint,tmpXY; tmppoint = linegeomtxt.Split(','); point = new PostGISPoint(); //�����Ƿ�Ϊ�˵㣬�ֱ�ȡ��ͬ�ĵ� if (isEndPoint) { //��Ҫ������߶εĵ��������жϣ����Ϊ2����ֱ�ӻ�ȡ if (tmppoint.Length==2) { //��ʱ��Ҫȡ�߶εĵ�һ���㣬����ʼ�� strpoint = tmppoint[0].Substring(18); tmpXY = strpoint.Split(' '); point.x = double.Parse(tmpXY[0]); point.y = double.Parse(tmpXY[1]); } else { //��Ҫ��ȡ�����ڶ����� strpoint = tmppoint[tmppoint.Length - 2]; tmpXY = strpoint.Split(' '); point.x = double.Parse(tmpXY[0]); point.y = double.Parse(tmpXY[1]); } } else { if (tmppoint.Length == 2) { //��ʱ��Ҫȡ�߶εĵڶ����㣬����ֹ��� strpoint = tmppoint[1].Substring(0,tmppoint[1].Length-3); tmpXY = strpoint.Split(' '); point.x = double.Parse(tmpXY[0]); point.y = double.Parse(tmpXY[1]); } else { //��ȡ�ڶ����� strpoint = tmppoint[1]; tmpXY = strpoint.Split(' '); point.x = double.Parse(tmpXY[0]); point.y = double.Parse(tmpXY[1]); } } return point; }
/// <summary> /// �ڵ������в��Ҹ������Ƿ���ڣ����ڷ�������ֵ�������ڷ���-1 /// </summary> /// <param name="points"></param> /// <param name="point"></param> /// <returns></returns> private int FindPoint(PostGISPoint[] points, PostGISPoint point) { PostGISPoint tp = new PostGISPoint(); int k = -1; for (int i = 0; i < points.Length;i++) { tp = points[i]; if (IsSamePoint(tp,point,0.00000001)) { return i; } } return k; }
/// <summary> /// �Ӽ����ֶε��ı�����ȡ�����꣬�����Զ���ṹ�洢 /// </summary> /// <param name="point"></param> /// <returns></returns> private PostGISPoint Con2PostGISPoint(string point) { int index=point.LastIndexOf(')'); string tmpPoint = point.Substring(6, index - 6); string[] xy = tmpPoint.Split(' '); PostGISPoint tmpGISPoint = new PostGISPoint(); tmpGISPoint.x = Convert.ToDouble(xy[0]); tmpGISPoint.y = Convert.ToDouble(xy[1]); return tmpGISPoint; }
private void btnNewLines_Click(object sender, EventArgs e) { try { //20130228 //�˴��µ�·ֻ��Ҫ����ԭ�������·��kind���� string tablename = layerName + "_newlines"; //ɾ��line_gid�ֶΣ���Ϊ��������ѯ�в����ô��ֶ�20130513 string sqlstr = "create table" + " " + tablename + " (gid integer,kind integer)"; CheckCreateTable(tablename, sqlstr); string geoColumn = "geom"; string geoType = "MULTILINESTRING"; //�ж�newlines�����Ƿ���geom�ֶ� if (IsColumnExist(tablename, geoColumn)) { sqlstr = "alter table " + tablename + " " + "drop column geom cascade"; postDB.ExecNonQuery(sqlstr); sqlstr = "select addgeometrycolumn('" + tablename + "', '" + geoColumn + "', 4326,'" + geoType + "',2)"; postDB.ExecNonQuery(sqlstr); } else { sqlstr = "select addgeometrycolumn('" + tablename + "', '" + geoColumn + "', 4326,'" + geoType + "',2)"; postDB.ExecNonQuery(sqlstr); } string ftablename = layerName + "_lines_intersect_unique"; //ʹ�ý��㹹���߶� //ȷ����ѭ����ķ�Χ PostGISPoint[] TmpPoints; List<int> vIndex; string[] xy, coor; string geomety, startpoint, endpoint, gid, kind; //��ʶ�������߶� int newgid = 0; //��ѭ���� for (int i = 0; i < dt.Rows.Count; i++) { //��mls���������������Զ���ṹ�У����ڷ��ʣ�Ҳ����ѡ������ݿ���ж�ȡ���ٶȱȽ��� //��ȡ���������ַ���,���Ը�ʽ������ geomety = dt.Rows[i]["geom_txt"].ToString(); coor = geomety.Split(','); startpoint = coor[0].Substring(17); int tmpLength = coor[coor.Length - 1].Length; endpoint = coor[coor.Length - 1].Substring(0, tmpLength - 2); coor[0] = startpoint; coor[coor.Length - 1] = endpoint; TmpPoints = new PostGISPoint[coor.Length]; //�������ʽ���洢 for (int k = 0; k < coor.Length; k++) { //xy����ʹ�ÿո�ֿ� xy = coor[k].Split(' '); TmpPoints[k].x = Convert.ToDouble(xy[0]); TmpPoints[k].y = Convert.ToDouble(xy[1]); } gid = dt.Rows[i]["gid"].ToString(); kind = dt.Rows[i]["kind"].ToString(); //��ȡ��mls�Ľ��� //�Ĵ˴�ò��Ҳ���ԴﵽĿ�� //sqlstr = "select line_gid1, assvertex_index1,points from lines_intersect_unique1 where line_gid1=" + gid + "order by line_gid1,assvertex_index1,points asc"; sqlstr = "select line_gid1, svertex_index1, st_astext(points) as points_txt from" +" " + ftablename + " " + "where line_gid1=" + gid + "order by line_gid1,svertex_index1,points_txt asc"; DataTable pointTable = postDB.DoQueryEx(sqlstr); int pointsCount = pointTable.Rows.Count; //����ĺ�Ľ������ PostGISPoint[] resultPoints = TmpPoints; //Ӧ�ý�������Ĭ������ΪֵΪ0�����У�ֻ����ͬ���ֵ vIndex = new List<int>(); for (int x = 0; x < resultPoints.Length;x++ ) { vIndex.Add(0); } //ͳ�Ʋ����ĸ��������ڼ�����ȷ��vertexIndex int count = 0; int index = 0; int nindex = 0; //�Խ��������� for (int j = 0; j < pointsCount; j++) { int vertexIndex =Convert.ToInt32(pointTable.Rows[j]["svertex_index1"].ToString()); string point = pointTable.Rows[j]["points_txt"].ToString(); PostGISPoint interPoint = Con2PostGISPoint(point); //��������mls�����бȽϣ���������ڽ�������У��Դ˽����1 //������㲻�ڽ�������У����ս����vertexindex���뵽�����У����Ҷ��½����1 index = FindPoint(resultPoints, interPoint); if (index>=0) { vIndex[index] = 1; } else { //���㲻�ڽ�����У�Ӧ�ò��뵽vertexindex���֮�� //ÿ����һ���㣬vIndexҲӦ������һ��Ԫ�� //�ҵ������ԭ�����ڴ˴��趨vindex����������ȷ resultPoints=InsertPoint(resultPoints, vertexIndex + count, interPoint); vIndex.Add(0); nindex = FindIndex(resultPoints, interPoint); vIndex[nindex] = 1; count++; } } //��Ҫ��vIndex���н��д�����������˵��ֵ�ģ����ҽ���1ֵ���Ϊ0 for (int m = 0; m < resultPoints.Length;m++ ) { if (m==0 || m==resultPoints.Length-1) { vIndex[m] = 1; } else { if (vIndex[m]>0) { continue; } else { vIndex[m] = 0; } } } //����vIndex��������߶ν��зָ�洢 //�洢ֵΪ1�������� List<int> nVIndex = new List<int>(); for (int n = 0; n < vIndex.Count; n++) { if (vIndex[n]==1) { nVIndex.Add(n); } } for (int s = 1; s < nVIndex.Count;s++ ) { int preIndex=nVIndex[s-1]; int curIndex=nVIndex[s]; string tmpGeom = ""; for (int q = preIndex; q <= curIndex;q++ ) { //��������geometry���ַ��������ַ���ĩλ��һ��ð�� tmpGeom = tmpGeom + resultPoints[q].x.ToString() + " " + resultPoints[q].y.ToString() + ","; } //ȥ���������ð�� tmpGeom = tmpGeom.Substring(0, tmpGeom.Length - 1); tmpGeom = "MULTILINESTRING((" + tmpGeom + "))"; //�����д�뵽��subroad1_newlines�� sqlstr = "INSERT INTO" +" " + tablename +" " +"(gid,geom,kind) values (" + newgid + "," + "st_geomfromtext('" + tmpGeom + "', 4326)" +"," + kind +")"; postDB.InsertRow(sqlstr); newgid++; } } //������н�� DataTable tmpdt = GetData(tablename); GvwData.DataSource = tmpdt; } catch (System.Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); } }