/// <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);
            }
        }
Esempio n. 2
0
        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));
            }
        }