四参数反算以及百度鹰眼绑定

2017-12-09  本文已影响27人  山华水清

近来有轨迹平滑的需求,发现虽然轨迹平滑了,但是随之而来的是平滑后的轨迹会压盖房子,这就让人无法忍受了。遂放弃,发现我的数学功底不是一般的差,对于底层算法的实现有待提高,加油。还有就是试着把GPS转为平面坐标的点转为WGS84显示到百度里面,使用其鹰眼功能实现去噪,绑路等功能。先这样吧,到时候需要的时候再研究,那时候可能就会出现非吴下阿蒙的我了。

using System;
using System.Collections.Generic;
using System.Linq;
using GeoAPI.CoordinateSystems;
using GeoAPI.CoordinateSystems.Transformations;
using LeadMap.Framework.DBProvider;
using LmDataHandler;
using LmDataHandler.Utility;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using ProjNet.Converters.WellKnownText;
using ProjNet.CoordinateSystems;
using ProjNet.CoordinateSystems.Transformations;
using RestSharp;

namespace UnitTest
{
    [TestClass]
    public class UnitTest2
    {
        [TestMethod]
        public void TestMethod1()
        {
            //var wgs84Point = ConvertBj542Wgs84(91670.304, 73375.385);           
            //var dfp= transfer(bj54p[1], bj54p[0], 1, d, -3266736.9496, -439821.9753);

            DataBase.sysType = SysType.BS;
            var points = GetPatrolPoints("36798");
            points.ForEach(p =>
            {
                var cp = P2WGS84(p.Lat, p.Lon);
                p.Lat = cp[1];
                p.Lon = cp[0];
            });
            //循环通过restsharp取得坐标点
            int pagesize = 90;
            double pagecount = Math.Ceiling(points.Count / pagesize.Getdouble());
            for (int i = 0; i < pagecount; i++)
            {
                var pp = points.Skip(i * pagesize).Take(pagesize).ToList();
                var client = new RestClient("http://yingyan.baidu.com/api/v3/track/addpoints");
                var request = new RestRequest(Method.POST);
                request.AddParameter("ak", "AiyoOjdlW2ahgt0uoG2olod2t1dPhx99");
                request.AddParameter("service_id", "155954");
                JsonArray jArray = new JsonArray();
                for (int j = 0; j < pp.Count(); j++)
                {
                    JsonObject jo = new JsonObject()
                    {
                        {"entity_name", "leadmap02"},
                        {"latitude", pp[j].Lat},
                        {"longitude", pp[j].Lon},
                        {"loc_time", pp[j].Time.DateTimeToUnixTimestamps()},
                        {"coord_type_input", "wgs84"},
                        {"speed", pp[j].Vel},
                    };
                    jArray.Add(jo);
                }
                request.AddParameter("point_list", jArray.ToString());
                IRestResponse response = client.Execute(request);
                var content = response.Content;
            }
        }

        private List<PatrolPoint> GetPatrolPoints(string id)
        {
            var strsql = string.Format(@" select * from TAB_LMPATROLGPSPOINT{1} where PatrolId='{0}' order by Time,No ",
                id, "201710");
            var pointdt = DataBase.ExecuteDataTable(strsql, DataBase.Gpsconn);
            if (pointdt != null && pointdt.Rows.Count > 0)
            {
                return DbParameterUtility.ConvertDataTable2ListsP<PatrolPoint>(pointdt).ToList();
            }
            return new List<PatrolPoint>();
        }

        private double[] P2WGS84(double x, double y)
        {
            double d = (4.0 / 60.0) + (35.048000 / 3600);
            var mapPoint = transferP(x, y, 1, d, -3266736.9496, -439821.9753);
            return ConvertBj542Wgs84(mapPoint.Y, mapPoint.X);
        }

        private double[] ConvertBj542Wgs84(double lat, double lon)
        {
            IProjectedCoordinateSystem fromCS = CoordinateSystemWktReader.Parse(
                    "PROJCS[\"Beijing 1954 / 3-degree Gauss-Kruger CM 120E\",GEOGCS[\"Beijing 1954\",DATUM[\"Beijing_1954\",SPHEROID[\"Krassowsky 1940\",6378245,298.3,AUTHORITY[\"EPSG\",\"7024\"]],TOWGS84[15.8,-154.4,-82.3,0,0,0,0],AUTHORITY[\"EPSG\",\"6214\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4214\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",120],PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AUTHORITY[\"EPSG\",\"2437\"]]")
                as IProjectedCoordinateSystem;
            GeographicCoordinateSystem toCS = GeographicCoordinateSystem.WGS84;
            CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
            ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(fromCS, toCS);
            return trans.MathTransform.Transform(new double[] {lat, lon});
        }


        private double[] ConvertWgs84Bj54(double lat, double lon)
        {
            IProjectedCoordinateSystem fromCS = CoordinateSystemWktReader.Parse(
                    "PROJCS[\"Beijing 1954 / 3-degree Gauss-Kruger CM 120E\",GEOGCS[\"Beijing 1954\",DATUM[\"Beijing_1954\",SPHEROID[\"Krassowsky 1940\",6378245,298.3,AUTHORITY[\"EPSG\",\"7024\"]],TOWGS84[15.8,-154.4,-82.3,0,0,0,0],AUTHORITY[\"EPSG\",\"6214\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4214\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",120],PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AUTHORITY[\"EPSG\",\"2437\"]]")
                as IProjectedCoordinateSystem;
            GeographicCoordinateSystem toCS = GeographicCoordinateSystem.WGS84;
            CoordinateTransformationFactory ctfac = new CoordinateTransformationFactory();
            ICoordinateTransformation trans = ctfac.CreateFromCoordinateSystems(toCS, fromCS);
            return trans.MathTransform.Transform(new double[] {lat, lon});
        }

        private Point movePoint(Point point)
        {
            return new Point(point.getX() - 13.8747376725019, point.getY() + 10);
        }


        private Point transfer(double x_put, double y_put, double k, double red, double dx, double dy)
        {
            Point point = new Point();
            double x_out;
            double y_out;

            y_out = x_put * k * Math.Cos(red / 180 * Math.PI) - y_put * k * Math.Sin(red / 180 * Math.PI) + dx;
            x_out = x_put * k * Math.Sin(red / 180 * Math.PI) + y_put * k * Math.Cos(red / 180 * Math.PI) + dy;

            point.setXY(x_out, y_out);
            point.X = point.X - 13.8747376725019;
            point.Y = point.Y + 10;

            return point;
        }

        private Point transferP(double x_out, double y_out, double k, double red, double dx, double dy)
        {
            Point point = new Point();
            double x_put;
            double y_put;

            x_out = x_out + 13.8747376725019;
            y_out = y_out - 10;
            x_put = (Math.Cos(red / 180 * Math.PI) * (y_out - dx) + Math.Sin(red / 180 * Math.PI) * (x_out - dy)) *
                    (1 / k);
            y_put = (Math.Cos(red / 180 * Math.PI) * (x_out - dy) - Math.Sin(red / 180 * Math.PI) * (y_out - dx)) *
                    (1 / k);

            point.setXY(x_put, y_put);
            return point;
        }
    }
}

public class Point
{
    public double X { get; set; }
    public double Y { get; set; }

    public Point()
    {
    }

    public Point(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }

    public void setXY(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }

    public double getX()
    {
        return this.X;
    }

    public double getY()
    {
        return this.Y;
    }
}
上一篇下一篇

猜你喜欢

热点阅读