/// <summary> /// Get the nearest segment for operational object. /// </summary> /// <param name="operationalObjectPoint">Operational object unique identifier.</param> /// <param name="referenceDataCategoryList">The reference data category list.</param> /// <returns>Nearest street and the intersection point.</returns> public List <Tuple <NetworkLinkDataDTO, SqlGeometry> > GetNearestSegment(DbGeometry operationalObjectPoint, List <ReferenceDataCategoryDTO> referenceDataCategoryList) { using (loggingHelper.RMTraceManager.StartTrace("DataService.GetNearestSegment")) { string methodName = typeof(StreetNetworkDataService) + "." + nameof(GetNearestSegment); loggingHelper.LogMethodEntry(methodName, priority, entryEventId); Guid networkPathLinkType = referenceDataCategoryList.Where(x => x.CategoryName.Replace(" ", string.Empty) == ReferenceDataCategoryNames.NetworkLinkType) .SelectMany(x => x.ReferenceDatas) .Single(x => x.ReferenceDataValue == ReferenceDataValues.NetworkLinkPathLink).ID; Guid networkRoadLinkType = referenceDataCategoryList.Where(x => x.CategoryName.Replace(" ", string.Empty) == ReferenceDataCategoryNames.NetworkLinkType) .SelectMany(x => x.ReferenceDatas) .Single(x => x.ReferenceDataValue == ReferenceDataValues.NetworkLinkRoadLink).ID; var accessLinkDiffRoadMaxDistance = Convert.ToInt32(referenceDataCategoryList.Where(x => x.CategoryName.Replace(" ", string.Empty) == ReferenceDataCategoryNames.AccessLinkParameters) .SelectMany(x => x.ReferenceDatas) .Single(x => x.ReferenceDataName == ReferenceDataValues.AccessLinkDiffRoadMaxDistance) .ReferenceDataValue); var networkLinkRoads = DataContext.NetworkLinks.AsNoTracking() .Where(m => (m.NetworkLinkTypeGUID == networkRoadLinkType || m.NetworkLinkTypeGUID == networkPathLinkType) && m.LinkGeometry.Distance(operationalObjectPoint) <= accessLinkDiffRoadMaxDistance) .OrderBy(n => n.LinkGeometry.Distance(operationalObjectPoint)) .AsEnumerable() .Select(l => new NetworkLinkDataDTO { ID = l.ID, LinkGeometry = l.LinkGeometry, NetworkLinkTypeGUID = l.NetworkLinkTypeGUID, TOID = l.TOID }); List <Tuple <NetworkLinkDataDTO, SqlGeometry> > result = new List <Tuple <NetworkLinkDataDTO, SqlGeometry> >(); SqlGeometry networkIntersectionPoint = SqlGeometry.Null; // check for nearest segment which does not cross any existing access link foreach (var item in networkLinkRoads) { var accessLinkLine = operationalObjectPoint.ToSqlGeometry().ShortestLineTo(item.LinkGeometry.ToSqlGeometry()); if (!accessLinkLine.IsNull) { DbGeometry accessLinkDbGeometry = accessLinkLine.ToDbGeometry(); result.Add(new Tuple <NetworkLinkDataDTO, SqlGeometry>(item, accessLinkLine.STEndPoint())); } } loggingHelper.LogMethodExit(methodName, priority, exitEventId); return(result); } }
public void AutoAssignProjectPriorityLandscapes(DbGeometry projectLocation) { var geometry = projectLocation.IsValid ? projectLocation : projectLocation.ToSqlGeometry().MakeValid().ToDbGeometryWithCoordinateSystem(); var updatedProjectPriorityLandscapes = HttpRequestStorage.DatabaseEntities.PriorityLandscapes .Where(x => x.PriorityLandscapeLocation.Intersects(geometry)) .ToList() .Select(x => new ProjectPriorityLandscape(ProjectID, x.PriorityLandscapeID)) .ToList(); ProjectPriorityLandscapes.Merge(updatedProjectPriorityLandscapes, HttpRequestStorage.DatabaseEntities.ProjectPriorityLandscapes.Local, (x, y) => x.ProjectID == y.ProjectID && x.PriorityLandscapeID == y.PriorityLandscapeID); var updatedProjectRegions = HttpRequestStorage.DatabaseEntities.DNRUplandRegions .Where(x => x.DNRUplandRegionLocation.Intersects(geometry)) .ToList() .Select(x => new ProjectRegion(ProjectID, x.DNRUplandRegionID)) .ToList(); ProjectRegions.Merge(updatedProjectRegions, HttpRequestStorage.DatabaseEntities.ProjectRegions.Local, (x, y) => x.ProjectID == y.ProjectID && x.DNRUplandRegionID == y.DNRUplandRegionID); }
/// <summary> /// Get the nearest street for operational object. /// </summary> /// <param name="operationalObjectPoint">Operational object unique identifier.</param> /// <param name="streetName">Street name.</param> /// <param name="referenceDataCategoryList">The reference data category list.</param> /// <returns>Nearest street and the intersection point.</returns> public Tuple <NetworkLinkDataDTO, SqlGeometry> GetNearestNamedRoad(DbGeometry operationalObjectPoint, string streetName, List <ReferenceDataCategoryDTO> referenceDataCategoryList) { using (loggingHelper.RMTraceManager.StartTrace("DataService.GetNearestNamedRoad")) { string methodName = typeof(StreetNetworkDataService) + "." + nameof(GetNearestNamedRoad); loggingHelper.LogMethodEntry(methodName, priority, entryEventId); SqlGeometry networkIntersectionPoint = SqlGeometry.Null; NetworkLinkDataDTO networkLink = null; // find the nearest named road for the provided operational object. var nearestNamedRoad = DataContext.StreetNames .Where(m => m.Descriptor == streetName || m.DesignatedName == streetName || m.LocalName == streetName) .OrderBy(n => operationalObjectPoint.Distance(n.Geometry)) .Select(l => new StreetNameDataDTO { ID = l.ID, StreetType = l.StreetType, NationalRoadCode = l.NationalRoadCode, DesignatedName = l.DesignatedName, Descriptor = l.Descriptor }).FirstOrDefault(); if (nearestNamedRoad != null) { // check if the there are no intersections with any other roads and the access link // intersection point Guid networkPathLinkType = referenceDataCategoryList.Where(x => x.CategoryName.Replace(" ", string.Empty) == ReferenceDataCategoryNames.NetworkLinkType) .SelectMany(x => x.ReferenceDatas) .Single(x => x.ReferenceDataValue == ReferenceDataValues.NetworkLinkPathLink).ID; Guid networkRoadLinkType = referenceDataCategoryList.Where(x => x.CategoryName.Replace(" ", string.Empty) == ReferenceDataCategoryNames.NetworkLinkType) .SelectMany(x => x.ReferenceDatas) .Single(x => x.ReferenceDataValue == ReferenceDataValues.NetworkLinkRoadLink).ID; networkLink = DataContext.NetworkLinks.AsNoTracking().Where(m => m.StreetNameGUID == nearestNamedRoad.ID) .OrderBy(n => n.LinkGeometry.Distance(operationalObjectPoint)) .Select(l => new NetworkLinkDataDTO { ID = l.ID, LinkGeometry = l.LinkGeometry, NetworkLinkTypeGUID = l.NetworkLinkTypeGUID, TOID = l.TOID }).FirstOrDefault(); if (networkLink != null) { SqlGeometry accessLinkLine = operationalObjectPoint.ToSqlGeometry().ShortestLineTo(networkLink.LinkGeometry.ToSqlGeometry()); if (!accessLinkLine.IsNull) { DbGeometry accessLinkDbGeometry = accessLinkLine.ToDbGeometry(); // find any road or path segment intersects with the planned access link. var intersectionCountForRoadOrPath = DataContext.NetworkLinks.AsNoTracking() .Count(m => m.LinkGeometry.Intersects(accessLinkDbGeometry) && (m.NetworkLinkTypeGUID == networkRoadLinkType || m.NetworkLinkTypeGUID == networkPathLinkType)); if (intersectionCountForRoadOrPath == 0) { networkIntersectionPoint = accessLinkLine.STEndPoint(); } } } } loggingHelper.LogMethodExit(methodName, priority, exitEventId); return(new Tuple <NetworkLinkDataDTO, SqlGeometry>(networkLink, networkIntersectionPoint)); } }