示例#1
0
        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);
            }
        }
示例#2
0
 /// <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;
     }
 }
示例#3
0
 /// <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;
     }
 }
示例#4
0
 /// <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;
 }
示例#5
0
 /// <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;
     }
 }
示例#6
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;
        }
示例#7
0
        /// <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;
        }
示例#8
0
 /// <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;
 }
示例#9
0
 /// <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;
 }
示例#10
0
        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);
            }
        }