public bool contains_point(CPoint pt) { bool rt = false; double angle = 0; double dist = CJWDHelper.distance1(center.longitude, center.latitude, pt.longitude, pt.latitude, ref angle); if(dist < radius) { double deltAngle = 0; if(angle > azimuth) { // angle is bigger deltAngle = angle - azimuth; if(deltAngle > 180) { deltAngle = azimuth + 360 - angle; } } else { // angle is smaller deltAngle = azimuth - angle; if(deltAngle > 180) { deltAngle = angle + 360 - azimuth; } } if(deltAngle < angleExt / 2.0) { // in angle span rt = true; } } return rt; }
private void calc_sector_covered_grid() { CPoint ct = new CPoint(); string destTableName = "tbGridAreaOverlap_test"; string deleteSql = @"delete from tbGridAreaOverlap_test where AreaGrandObjectName = 'GSM网扇区按半径'"; deleteSql = deleteSql.Replace("tbGridAreaOverlap_test", destTableName); DBHelper.instatnce().exec(deleteSql); DataTable insertDT = new DataTable(); insertDT.Columns.Add("GXID"); insertDT.Columns.Add("GYID"); insertDT.Columns.Add("AreaGrandObjectName"); insertDT.Columns.Add("OverlapRatio"); insertDT.Columns.Add("CellID"); int indexCT = 0; foreach(var item in cellInfo) { double r = indexCT++ / (double)cellInfo.Count; LogHelper.instance().write("# compute process: " + r.ToString()); string cellID = item.Key; string sql = @" declare @minLongitude float declare @maxLongitude float declare @minLatitude float declare @maxLatitude float set @minLongitude = minLongitude_V set @maxLongitude = maxLongitude_V set @minLatitude = minLatitude_V set @maxLatitude = maxLatitude_V SELECT [GXID],[GYID],[CLong],[CLat],[MaxLong],[MaxLat],[MinLong],[MinLat],[InNetCoverage],[GeoScene] FROM tbGrid_test where CLong <= @maxLongitude and CLong >= @minLongitude and CLat <= @maxLatitude and CLat >= @minLatitude "; sql = sql.Replace("minLongitude_V", item.Value.minPos.longitude.ToString()); sql = sql.Replace("minLatitude_V", item.Value.minPos.latitude.ToString()); sql = sql.Replace("maxLongitude_V", item.Value.maxPos.longitude.ToString()); sql = sql.Replace("maxLatitude_V", item.Value.maxPos.latitude.ToString()); DataTable dt = new DataTable(); DBHelper.instatnce().get_dataTable(ref dt, sql); foreach(DataRow dr in dt.Rows) { string GXID = dr["GXID"].ToString(); string GYID = dr["GYID"].ToString(); string CLong = dr["CLong"].ToString(); string CLat = dr["CLat"].ToString(); double MaxLong = double.Parse(dr["MaxLong"].ToString()); double MaxLat = double.Parse(dr["MaxLat"].ToString()); double MinLong = double.Parse(dr["MinLong"].ToString()); double MinLat = double.Parse(dr["MinLat"].ToString()); int containsPtCount = 0; ct.longitude = double.Parse(CLong); ct.latitude = double.Parse(CLat); if(item.Value.contains_point(ct)) { // 0 center pt containsPtCount++; } ct.longitude = MinLong; ct.latitude = MinLat; if(item.Value.contains_point(ct)) { // 1 left bottom pt containsPtCount++; } ct.longitude = MinLong; ct.latitude = MaxLat; if(item.Value.contains_point(ct)) { // 2 left top pt containsPtCount++; } ct.longitude = MaxLong; ct.latitude = MaxLat; if(item.Value.contains_point(ct)) { // 3 right top pt containsPtCount++; } ct.longitude = MaxLong; ct.latitude = MinLat; if(item.Value.contains_point(ct)) { // 4 right bottom pt containsPtCount++; } if(containsPtCount > 0) { // in pie DataRow nr = insertDT.NewRow(); nr["GXID"] = GXID; nr["GYID"] = GYID; nr["AreaGrandObjectName"] = "GSM网扇区按半径"; nr["OverlapRatio"] = containsPtCount / (double)5.0; nr["CellID"] = cellID; insertDT.Rows.Add(nr); //LogHelper.instance().write("# sector: " + cellID + ",(" + GXID + "," + GYID + ")", 0); if(insertDT.Rows.Count > 1000) { DBHelper.instatnce().batch_save_2_db(destTableName, ref insertDT); } } } } if(insertDT.Rows.Count > 0) { DBHelper.instatnce().batch_save_2_db(destTableName, ref insertDT); } }