Beispiel #1
0
        private BuildingMeshBuilderProperties MakeProperties(VectorTileLayer layer)
        {
            var output = new BuildingMeshBuilderProperties
            {
                VectorTileLayer     = layer,
                FeatureCount        = layer?.FeatureCount() ?? 0,
                LayerFeatureFilters =
                    SubLayerProperties.filterOptions.filters.Select(m => m.GetFilterComparer()).ToArray(),
                LayerFeatureFilterCombiner = new LayerFilterComparer()
            };

            switch (SubLayerProperties.filterOptions.combinerType)
            {
            case LayerFilterCombinerOperationType.Any:
                output.LayerFeatureFilterCombiner = LayerFilterComparer.AnyOf(output.LayerFeatureFilters);
                break;

            case LayerFilterCombinerOperationType.All:
                output.LayerFeatureFilterCombiner = LayerFilterComparer.AllOf(output.LayerFeatureFilters);
                break;

            case LayerFilterCombinerOperationType.None:
                output.LayerFeatureFilterCombiner = LayerFilterComparer.NoneOf(output.LayerFeatureFilters);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
            output.BuildingsWithUniqueIds = SubLayerProperties.honorBuildingIdSetting && SubLayerProperties.buildingsWithUniqueIds;
            return(output);
        }
Beispiel #2
0
 private void ProcessingFunction(BuildingMeshBuilderProperties properties, CustomTile tile)
 {
     for (var i = 0; i < properties.FeatureCount; ++i)
     {
         ProcessFeature(i, tile, properties);
     }
     CoroutineManager.Run(_processor.RunJob(tile));
 }
Beispiel #3
0
 private IEnumerator ProcessingRoutine(BuildingMeshBuilderProperties properties, CustomTile tile)
 {
     for (var i = 0; i < properties.FeatureCount; ++i)
     {
         ProcessFeature(i, tile, properties);
         yield return(null);
     }
     _processor.Terminate(tile);
 }
Beispiel #4
0
        private void ProcessFeature(int index, CustomTile tile, BuildingMeshBuilderProperties layerProperties)
        {
            var layerExtent = layerProperties.VectorTileLayer.Extent;
            var fe          = layerProperties.VectorTileLayer.GetFeature(index);
            List <List <Point2d <float> > > geom;

            if (layerProperties.BuildingsWithUniqueIds)
            {
                geom = fe.Geometry <float>();

                if (geom[0][0].X <0 || geom[0][0].X> layerExtent || geom[0][0].Y <0 || geom[0][0].Y> layerExtent)
                {
                    return;
                }
            }
            else
            {
                geom = fe.Geometry <float>(0); //passing zero means clip at tile edge
            }

            var feature = new CustomFeatureUnity(
                layerProperties.VectorTileLayer.GetFeature(index),
                geom,
                tile,
                layerProperties.VectorTileLayer.Extent,
                layerProperties.BuildingsWithUniqueIds);


            if (!IsFeatureEligibleAfterFiltering(feature, layerProperties) ||
                tile == null || tile.VectorDataState == TilePropertyState.Cancelled)
            {
                return;
            }

            if (feature.Properties.ContainsKey("extrude") && !Convert.ToBoolean(feature.Properties["extrude"]))
            {
                return;
            }
            if (feature.Points.Count < 1)
            {
                return;
            }

            _processor.Execute(tile, feature);
        }
Beispiel #5
0
 private static bool IsFeatureEligibleAfterFiltering(CustomFeatureUnity feature, BuildingMeshBuilderProperties layerProperties)
 {
     return(layerProperties.LayerFeatureFilters.Length < 1 || layerProperties.LayerFeatureFilterCombiner.Try((VectorFeatureUnity)feature));
 }