public bool Excute(string outputFilename, Extent extent, double cellSize) { int numColumns = (int)(extent.Width / cellSize); int numRows = (int)(extent.Height / cellSize); for (int i = 0; i < DIRECTION_COUNT; i++) { IRaster output = Raster.CreateRaster( outputFilename, string.Empty, numColumns, numRows, 1, typeof(double), new[] { string.Empty }); output.Extent = extent; output.Projection = DotSpatial.Projections.ProjectionInfo.FromEpsgCode(4326); for (int x = 0; x < numColumns; x++) { for (int y = 0; y < numRows; y++) { Coordinate cellCenter = output.CellToProj(y, x); var nearestSeg = segmentationRTree.Query(new Envelope(cellCenter)); for (int j = 0; j < nearestSeg.Count; j++) { GPSSegmentation gs = nearestSeg[j] as GPSSegmentation; if (GetIndexOfDirection(gs.Angle) == i) { //do something } } } } } return(false); }
/// <summary> /// DP算法的核心算法,是一个分治迭代函数,当I==j-1迭代结束 /// </summary> /// <param name="i">开始点</param> /// <param name="j">结束点</param> private void SimplifySection(int i, int j) { if ((i + 1) == j) { return; } GPSSegmentation _seg = new GPSSegmentation(GPSPts[i], GPSPts[j]); double maxDistance = -1.0; int maxIndex = i; for (int k = i + 1; k < j; k++) { double distance = _seg.Distance(GPSPts[k]); if (distance > maxDistance) { maxDistance = distance; maxIndex = k; } } if (maxDistance <= _distanceTolerance) { for (int k = i + 1; k < j; k++) { _usePt[k] = false; } } else { SimplifySection(i, maxIndex); SimplifySection(maxIndex, j); } }
private void BulidRTree() { try { segmentationRTree = new StRtree(); foreach (var item in trajData) { for (int i = 0; i < item.GPSCount - 1; i++) { GPSSegmentation gg = item.GetSeqmentationAtIndex(i); segmentationRTree.Insert(gg.GetOptimizeEnvelop(), gg); } } segmentationRTree.Build(); } catch (Exception ex) { throw ex; } }