예제 #1
0
        /// <summary>
        /// 生成格网信息
        /// </summary>
        /// <param name="pFeature">Featureclass</param>
        /// <returns></returns>
        public string GetCodeString(IFeature pFeature)
        {
            double centroidX      = 0;
            double centroidY      = 0;
            IPoint pPoint         = null;
            IPoint pPointEverrage = new PointClass();
            IPoint pPointNearest  = new PointClass();

            IPoint pPointEverrage1 = new PointClass();
            IPoint pPointNearest1  = new PointClass();

            //求要素的质量中心
            switch (pFeature.Shape.GeometryType)
            {
            case esriGeometryType.esriGeometryPoint:
                pPoint    = pFeature.ShapeCopy as IPoint;
                centroidX = pPoint.X;
                centroidY = pPoint.Y;
                break;

            case esriGeometryType.esriGeometryPolyline:
                IPolyline        pPolyline        = pFeature.ShapeCopy as IPolyline;
                IPointCollection pPointCollection = pPolyline as IPointCollection;

                //20170607 先求出点集的中心点,然后再算出中心点到polyline的最近的点,之后用改点来替代整个polyline,保证了该点在改地理实体上
                IProximityOperator proOperator = pPolyline as IProximityOperator;

                double centerX = 0;
                double centerY = 0;
                for (int i = 0; i < pPointCollection.PointCount; i++)
                {
                    pPoint   = pPointCollection.get_Point(i);
                    centerX += pPoint.X;
                    centerY += pPoint.Y;
                }
                centroidX = centerX / pPointCollection.PointCount;
                centroidY = centerY / pPointCollection.PointCount;

                //20170607
                pPointEverrage.X = centroidX;
                pPointEverrage.Y = centroidY;
                if (pPointEverrage != null)
                {
                    pPointNearest = proOperator.ReturnNearestPoint(pPointEverrage, esriSegmentExtension.esriNoExtension);
                }
                centroidX = pPointNearest.X;
                centroidY = pPointNearest.Y;
                break;

            case esriGeometryType.esriGeometryPolygon:
                //多边形获取的是中心节点的坐标
                IPolygon         pPolygon           = pFeature.ShapeCopy as IPolygon;
                IPointCollection pPolygonCollection = pPolygon as IPointCollection;

                //20170607 先求出点集的中心点,然后再算出中心点到polyline的最近的点,之后用改点来替代整个polyline,保证了该点在改地理实体上
                IProximityOperator pOperator = pPolygon as IProximityOperator;

                double PolygoncenterX = 0;
                double PolygoncenterY = 0;
                for (int i = 0; i < pPolygonCollection.PointCount; i++)
                {
                    pPoint          = pPolygonCollection.get_Point(i);
                    PolygoncenterX += pPoint.X;
                    PolygoncenterY += pPoint.Y;
                }
                centroidX = PolygoncenterX / pPolygonCollection.PointCount;
                centroidY = PolygoncenterY / pPolygonCollection.PointCount;

                //20170607
                pPointEverrage1.X = centroidX;
                pPointEverrage1.Y = centroidY;
                if (pPointEverrage != null)
                {
                    pPointNearest1 = pOperator.ReturnNearestPoint(pPointEverrage1, esriSegmentExtension.esriNoExtension);
                }
                centroidX = pPointNearest1.X;
                centroidY = pPointNearest1.Y;
                break;
            }

            try
            {
                //加入第一级格网和第二级格网的信息
                string strCode = loadFirstGrid(centroidX, centroidY);

                return(strCode);
            }
            catch (Exception ex)
            {
                ClsLog.WriteFile(ex, pFeature.OID.ToString());
                return("");
            }
        }
예제 #2
0
        /// <summary>
        /// 生成指定精度的GeoHash编码
        /// </summary>
        /// <param name="pFeature"></param>
        /// <param name="precision"></param>
        /// <returns></returns>
        public string GetGeoHashCode(IFeature pFeature, int precision)
        {
            string geoHashGrid    = "";
            double centroidX      = 0;
            double centroidY      = 0;
            IPoint pPoint         = null;
            IPoint pPointEverrage = new PointClass();
            IPoint pPointNearest  = new PointClass();

            IPoint pPointEverrage1 = new PointClass();
            IPoint pPointNearest1  = new PointClass();

            if (pFeature != null)
            {
                //求要素的质量中心
                switch (pFeature.Shape.GeometryType)
                {
                case esriGeometryType.esriGeometryPoint:
                    pPoint    = pFeature.ShapeCopy as IPoint;
                    centroidX = pPoint.X;
                    centroidY = pPoint.Y;

                    break;

                case esriGeometryType.esriGeometryPolyline:
                    IPolyline        pPolyline        = pFeature.ShapeCopy as IPolyline;
                    IPointCollection pPointCollection = pPolyline as IPointCollection;

                    //20170607 先求出点集的中心点,然后再算出中心点到polyline的最近的点,之后用改点来替代整个polyline,保证了该点在改地理实体上
                    IProximityOperator proOperator = pPolyline as IProximityOperator;

                    double centerX = 0;
                    double centerY = 0;
                    for (int i = 0; i < pPointCollection.PointCount; i++)
                    {
                        pPoint   = pPointCollection.get_Point(i);
                        centerX += pPoint.X;
                        centerY += pPoint.Y;
                    }
                    centroidX = centerX / pPointCollection.PointCount;
                    centroidY = centerY / pPointCollection.PointCount;

                    //20170607
                    pPointEverrage.X = centroidX;
                    pPointEverrage.Y = centroidY;
                    if (pPointEverrage != null)
                    {
                        pPointNearest = proOperator.ReturnNearestPoint(pPointEverrage, esriSegmentExtension.esriNoExtension);
                    }
                    centroidX = pPointNearest.X;
                    centroidY = pPointNearest.Y;

                    break;

                case esriGeometryType.esriGeometryPolygon:
                    //多边形获取的是中心节点的坐标
                    IPolygon         pPolygon           = pFeature.ShapeCopy as IPolygon;
                    IPointCollection pPolygonCollection = pPolygon as IPointCollection;

                    //20170607 先求出点集的中心点,然后再算出中心点到polyline的最近的点,之后用改点来替代整个polyline,保证了该点在改地理实体上
                    IProximityOperator pOperator = pPolygon as IProximityOperator;

                    double PolygoncenterX = 0;
                    double PolygoncenterY = 0;
                    for (int i = 0; i < pPolygonCollection.PointCount; i++)
                    {
                        pPoint          = pPolygonCollection.get_Point(i);
                        PolygoncenterX += pPoint.X;
                        PolygoncenterY += pPoint.Y;
                    }
                    centroidX = PolygoncenterX / pPolygonCollection.PointCount;
                    centroidY = PolygoncenterY / pPolygonCollection.PointCount;

                    //20170607
                    pPointEverrage1.X = centroidX;
                    pPointEverrage1.Y = centroidY;
                    if (pPointEverrage != null)
                    {
                        pPointNearest1 = pOperator.ReturnNearestPoint(pPointEverrage1, esriSegmentExtension.esriNoExtension);
                    }
                    centroidX = pPointNearest1.X;
                    centroidY = pPointNearest1.Y;
                    break;
                }
                try
                {
                    //生成四级GeoHash格网
                    geoHashGrid = ClsGeoHash.Encode(centroidX, centroidY, precision);
                    geoHashGrid = geoHashGrid.ToUpper();
                }
                catch (Exception ex)
                {
                    ClsLog.WriteFile(ex, pFeature.OID.ToString());
                    return("");
                }
            }
            else
            {
                MessageBox.Show("要素为空!");
            }
            return(geoHashGrid);
        }