GIS开发:分享常用的gis算法(C#)

在系统开发中,有时会用到一些常用的空间算法,引用一些类库是可以解决问题,但是有时类库的运行效率比较慢,引用的东西比较多,如果需要的方法不多,可以写一些简单的计算方法。

下边分享几个常用的gis计算方法:

//判断点是否在面里

public bool IsPointInPolygon(List<CVector> poly, CVector point)

  {

     int i, j;

     bool c = false;

     for (i = 0, j = poly.Count - 1; i < poly.Count; j = i++)

     {

        if ((((poly[i].VY <= point.VY) && (point.VY < poly[j].VY))

                  || ((poly[j].VY <= point.VY) && (point.VY < poly[i].VY)))

                  && (point.VX < (poly[j].VX - poly[i].VX) * (point.VY - poly[i].VY)

                      / (poly[j].VY - poly[i].VY) + poly[i].VX))

          {

              c = !c;

          }

      }

      return c;

  }

//计算弧度

 public double Rad(double d)
{
 return d * Math.PI / 180.0;
}

//计算角度

public static double RAngle(double d)
 {
 return d * 180.0 / Math.PI;
}

//计算两个坐标的中心点

 public double[] ComputeMidPoint(double lat1, double long1, double lat2, double long2)

    {

        lat1 = Rad(lat1);

        long1 = Rad(long1);

        lat2 = Rad(lat2);

        long2 = Rad(long2);

        var Bx = Math.Cos(lat2) * Math.Cos(long2 - long1);

        var By = Math.Cos(lat2) * Math.Sin(long2 - long1);

        var _rlat = Math.Atan2(Math.Sin(lat1) + Math.Sin(lat2), Math.Sqrt((Math.Cos(lat1) + Bx) * (Math.Cos(lat1) + Bx) + By * By));

        var _rlong = long1 + Math.Atan2(By, Math.Cos(lat1) + Bx);

        return new double[] { _rlat, _rlong };

    }   

//计算一批点的四至坐标

 public OCExtent GetPointsExtent(List<CVector> PList)
  {

        OCExtent cET = new OCExtent();

        for (int i = 0; i < PList.Count; i++)

        {

            CVector aP = PList[i];

            if (i == 0)

            {

                cET.minX = aP.VX;

                cET.maxX = aP.VX;

                cET.minY = aP.VY;

                cET.maxY = aP.VY;

            }

            else

            {

                if (cET.minX > aP.VX)

                {

                    cET.minX = aP.VX;

                }

                else if (cET.maxX < aP.VX)

                {

                    cET.maxX = aP.VX;

                }



                if (cET.minY > aP.VY)

                {

                    cET.minY = aP.VY;

                }

                else if (cET.maxY < aP.VY)

                {

                    cET.maxY = aP.VY;

                }

            }

        }

        return cET;

    }

关注公众号,多多支持!
在这里插入图片描述

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值