public OsmFeature FindBestDistanceMatch([NotNull][ItemNotNull] IReadOnlyCollection <WgsPoint> pointsToLookFor,
                                                [NotNull] out WgsPoint closestPoint,
                                                out double distance)
        {
            if (pointsToLookFor.Count == 0)
            {
                throw new Exception("Not a single point to look for");
            }

            var relevantTiles         = GetRelevantTiles(pointsToLookFor, NeighbourTileMode.IncludeBorderingTiles);
            var distancesToEachObject = new List <OsmFeatureToPointDistance>();

            foreach (var relevantTile in relevantTiles)
            {
                distancesToEachObject.AddRange(relevantTile.GetDistances(pointsToLookFor));
            }

            if (distancesToEachObject.Count == 0)
            {
                throw new Exception("Not a single distance was found");
            }

            distancesToEachObject.Sort((x, y) => x.Distance.CompareTo(y.Distance));
            closestPoint = distancesToEachObject[0].WgsPoint;
            distance     = distancesToEachObject[0].Distance;
            return(distancesToEachObject[0].Feature);
        }
        protected override void RunActualProcess()
        {
            SqlConnection.RecreateTable <OsmFeature>(Stage.Raw, Constants.PresentSlice);
            var          db          = SqlConnection.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            const string jsonfile    = "U:\\SimZukunft\\RawDataForMerging\\roadsBurgdorf.geojson";
            var          json        = File.ReadAllText(jsonfile);
            var          collection1 = JsonConvert.DeserializeObject <FeatureCollection>(json);

            const string jsonfileBuildings = "U:\\SimZukunft\\RawDataForMerging\\buildingsBurgdorf.geojson";
            var          jsonBuildings     = File.ReadAllText(jsonfileBuildings);
            var          collection2       = JsonConvert.DeserializeObject <FeatureCollection>(jsonBuildings);

            collection1.Features.AddRange(collection2.Features);
            db.Database.BeginTransaction();
            foreach (var feature in collection1.Features)
            {
                var osmf = new OsmFeature(feature, Guid.NewGuid().ToString());
                if (feature.Geometry.Type == GeoJSONObjectType.Polygon)
                {
                    var p  = (Polygon)feature.Geometry;
                    var ls = p.Coordinates[0];
                    foreach (var coordinate in ls.Coordinates)
                    {
                        var wp = new WgsPoint(coordinate.Longitude, coordinate.Latitude);
                        osmf.WgsPoints.Add(wp);
                    }
                }

                db.Database.Save(osmf);
            }

            db.Database.CompleteTransaction();
        }
Example #3
0
        public bool IsInside([NotNull] WgsPoint point)
        {
            if (point.Lon <= TopLon && point.Lon >= BottomLon && point.Lat >= LeftLat && point.Lat <= RightLat)
            {
                return(true);
            }

            return(false);
        }
Example #4
0
        public bool IsInside([NotNull] WgsPoint point)
        {
            if (point.Lon < Top && point.Lon > Bottom && point.Lat > Left && point.Lat < Right)
            {
                return(true);
            }

            return(false);
        }
Example #5
0
        protected override void RunChartMaking()
        {
            //var dbRaw = SqlConnection.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice).Database;
            var dbHouse = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;
            //var isnLocations = dbRaw.Fetch<HausanschlussImport>();
            var houses           = dbHouse.Fetch <House>();
            var houseanschlusses = dbHouse.Fetch <Hausanschluss>();

            ExportAsExcel(houseanschlusses, houses);

            RGB HouseFunc(House h)
            {
                var ha = houseanschlusses.FirstOrDefault(x => x.HouseGuid == h.HouseGuid);

                if (ha?.MatchingType == HouseMatchingType.Direct)
                {
                    return(Constants.Blue);
                }

                if (ha?.MatchingType == HouseMatchingType.Proximity)
                {
                    return(Constants.Green);
                }
                return(Constants.Orange);
            }

            var houseEntries = houses.Select(x => x.GetMapColorForHouse(HouseFunc)).ToList();
            var filename     = MakeAndRegisterFullFilename("DirektZugeordnete.png", Name, "", Constants.PresentSlice);
            var labels       = new List <MapLegendEntry> {
                new MapLegendEntry("Direkt Gemappt", Constants.Blue),
                new MapLegendEntry("Näherung", Constants.Green),
                new MapLegendEntry("Kein Hausobjekt hinterlegt", Constants.Orange),
                new MapLegendEntry("Nicht Teil von Burgdorf", Constants.Red)
            };
            var lines = new List <LineEntry>();

            foreach (var hausanschluss in houseanschlusses)
            {
                if (hausanschluss.MatchingType == HouseMatchingType.Direct)
                {
                    continue;
                }

                var house = houses.Single(x => x.HouseGuid == hausanschluss.HouseGuid);
                foreach (WgsPoint coord in house.WgsGwrCoords)
                {
                    WgsPoint isn = new WgsPoint(hausanschluss.Lon, hausanschluss.Lat);
                    //house.ComplexName + " - " + hausanschluss.ObjectID
                    lines.Add(new LineEntry(coord, isn, ""));
                }
            }
            Services.PlotMaker.MakeOsmMap(Name, filename, houseEntries, new List <WgsPoint>(), labels, lines);
        }
Example #6
0
        public bool IsOutside([NotNull] WgsPoint point)
        {
            if (point.Lon > Top || point.Lon < Bottom)
            {
                return(true);
            }

            if (point.Lat < Left || point.Lat > Right)
            {
                return(true);
            }

            return(false);
        }
Example #7
0
        private static void DoProximityAssignments([NotNull][ItemNotNull] List <House> houses, [NotNull][ItemNotNull] List <House> assignedHouses, [NotNull][ItemNotNull] List <HausanschlussImport> isnLocations,
                                                   [NotNull][ItemNotNull] List <Hausanschluss> hausanschlusses)
        {
            foreach (var assignedHouse in assignedHouses)
            {
                //check if every assigned house is actually assigned.
                var r = hausanschlusses.FirstOrDefault(x => x.HouseGuid == assignedHouse.HouseGuid);
                if (r == null)
                {
                    throw new FlaException("Assigned house is not actually assigned.");
                }
            }
            foreach (var house in houses)
            {
                if (!assignedHouses.Contains(house))
                {
                    var locations      = new List <Tuple <double, HausanschlussImport> >();
                    var houseWgsPoints = new List <WgsPoint>();
                    houseWgsPoints.AddRange(house.LocalWgsPoints);
                    if (houseWgsPoints.Count == 0)
                    {
                        houseWgsPoints.AddRange(house.WgsGwrCoords);
                    }

                    if (houseWgsPoints.Count > 0)
                    {
                        foreach (var isnLocation in isnLocations)
                        {
                            var wgsp     = new WgsPoint(isnLocation.Lon, isnLocation.Lat);
                            var distance = wgsp.GetMinimumDistance(houseWgsPoints);
                            locations.Add(new Tuple <double, HausanschlussImport>(distance, isnLocation));
                        }


                        locations.Sort((x, y) => x.Item1.CompareTo(y.Item1));
                        var pickedHa = locations[0].Item2;
                        //if (locations[0].Item1 > 200) {
                        //throw new Exception("More than 200 m");
                        //}

                        hausanschlusses.Add(new Hausanschluss(Guid.NewGuid().ToString(), house.HouseGuid,
                                                              pickedHa.ObjectID, pickedHa.Egid, pickedHa.Isn, pickedHa.Lon, pickedHa.Lat,
                                                              pickedHa.Trafokreis, HouseMatchingType.Proximity, locations[0].Item1, locations[0].Item2.Adress));
                    }
                }
            }
        }
Example #8
0
        private static double FindDistanceToSegment([NotNull] WgsPoint pt, [NotNull] WgsPoint p1,
                                                    [NotNull] WgsPoint p2) //, out PointF closest
        {
            var dx = p2.Lon - p1.Lon;
            var dy = p2.Lat - p1.Lat;

            if (dx == 0 && dy == 0)
            {
                // It's a point not a line segment.
                dx = pt.Lon - p1.Lon;
                dy = pt.Lat - p1.Lat;
                return(Math.Sqrt(dx * dx + dy * dy));
            }

            // Calculate the t that minimizes the distance.
            var t = ((pt.Lon - p1.Lon) * dx + (pt.Lat - p1.Lat) * dy) / (dx * dx + dy * dy);

            // See if this represents one of the segment's
            // end points or a point in the middle.
            if (t < 0)
            {
                dx = pt.Lon - p1.Lon;
                dy = pt.Lat - p1.Lat;
            }
            else if (t > 1)
            {
                dx = pt.Lon - p2.Lon;
                dy = pt.Lat - p2.Lat;
            }
            else
            {
                var closest = new WgsPoint(p1.Lon + t * dx, p1.Lat + t * dy);
                dx = pt.Lon - closest.Lon;
                dy = pt.Lat - closest.Lat;
            }

            return(Math.Sqrt(dx * dx + dy * dy));
        }
Example #9
0
        private static bool IsPointInPolygon([NotNull][ItemNotNull] List <WgsPoint> polygon, [NotNull] WgsPoint testPoint)

        {
            var result = false;
            var j      = polygon.Count - 1;

            for (var i = 0; i < polygon.Count; i++)
            {
                if (polygon[i].Lat < testPoint.Lat && polygon[j].Lat >= testPoint.Lat || polygon[j].Lat < testPoint.Lat && polygon[i].Lat >= testPoint.Lat)
                {
                    if (polygon[i].Lon + (testPoint.Lat - polygon[i].Lat) / (polygon[j].Lat - polygon[i].Lat) * (polygon[j].Lon - polygon[i].Lon) < testPoint.Lon)
                    {
                        result = !result;
                    }
                }

                j = i;
            }

            return(result);
        }
Example #10
0
 public OsmFeatureToPointDistance([NotNull] WgsPoint wgsPoint, [NotNull] OsmFeature feature)
 {
     WgsPoint = wgsPoint;
     Feature  = feature;
     Distance = CalcDistance();
 }
        protected override void RunActualProcess()
        {
            SqlConnection.RecreateTable <House>(Stage.Houses, Constants.PresentSlice);
            SqlConnection.RecreateTable <PotentialHousehold>(Stage.Houses, Constants.PresentSlice);
            var dbComplex = SqlConnection.GetDatabaseConnection(Stage.Complexes, Constants.PresentSlice).Database;
            //var dbRaw = SqlConnection.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice).Database;
            var buildingcomplexes = dbComplex.Fetch <BuildingComplex>();

            var dbComplexEnergy = SqlConnection.GetDatabaseConnection(Stage.ComplexEnergyData, Constants.PresentSlice).Database;
            var complexdata     = dbComplexEnergy.Fetch <ComplexBuildingData>();
            var dbHouse         = SqlConnection.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice).Database;

            //var sonnendach = dbRaw.Fetch<SonnenDach>();
            dbHouse.BeginTransaction();

            List <string> complexesToIgnore = new List <string> {
                "EGID191357110", "EGID1306724", "EGID1305755", "Fischermätteliweg nn"
            };
            //complexesToIgnore.Add("Bernstrasse 113a");
            //complexesToIgnore.Add("Finkhubelweg 8");
            //complexesToIgnore.Add("Friedhof 4");
            var manualCoordinates = ReadManualCoordinatesList();

            foreach (var complex in buildingcomplexes)
            {
                if (complexesToIgnore.Contains(complex.ComplexName))
                {
                    continue;
                }
                //haus anlegen
                var h = new House(complex.ComplexName,
                                  complex.ComplexGuid,
                                  Guid.NewGuid().ToString()
                                  )
                {
                    ComplexID = complex.ComplexID,
                };
                // ReSharper disable once ConditionIsAlwaysTrueOrFalse
                // ReSharper disable once HeuristicUnreachableCode
                if (h.HouseGuid == null)
                {
                    // ReSharper disable once HeuristicUnreachableCode
                    throw new Exception("House guid was null");
                }

                // ReSharper disable once ConditionIsAlwaysTrueOrFalse
                // ReSharper disable once HeuristicUnreachableCode
                if (h.ComplexGuid == null)
                {
                    // ReSharper disable once HeuristicUnreachableCode
                    throw new Exception("Complex guid was null");
                }

                //gebäudeobjektids zuordnen

                foreach (var complexGebäudeObjectID in complex.GebäudeObjectIDs)
                {
                    h.GebäudeObjectIDs.Add(complexGebäudeObjectID);
                }

                // egids zuordnen
                foreach (var eGid in complex.EGids)
                {
                    h.EGIDs.Add((int)eGid);
                }

                //geo coords zuordnen
                foreach (var coord in complex.Coords)
                {
                    h.WgsGwrCoords.Add(WgsPoint.ConvertKoordsToLonLat(coord.X, coord.Y));
                }

                var manualCoord = manualCoordinates.Where(x => x.Name == h.ComplexName).ToList();
                if (manualCoord.Count() > 0)
                {
                    foreach (var manualComplexCoordinatese in manualCoord)
                    {
                        h.WgsGwrCoords.Add(new WgsPoint(manualComplexCoordinatese.Lon, manualComplexCoordinatese.Lat));
                    }
                }

                foreach (var coord in complex.LocalnetCoords)
                {
                    h.LocalWgsPoints.Add(WgsPoint.ConvertKoordsToLonLat(coord.X, coord.Y));
                }

                //addressen zuordnen
                if (complex.Adresses.Count == 0)
                {
                    h.Adress = "Unknown";
                }
                else
                {
                    h.Adress = complex.Adresses[0];
                }

                if (complex.TrafoKreise.Count > 0)
                {
                    foreach (var erzId in complex.ErzeugerIDs)
                    {
                        h.ErzeugerIDs.Add(erzId);
                    }
                }


                //assign household data
                var thiscomplexdata = complexdata.FirstOrDefault(x => x.ComplexName == complex.ComplexName);
                if (thiscomplexdata == null)
                {
                    h.NumberOfHouseholds = 0;
                    h.Area = 0;
                    h.EnergieBezugsFläche = 0;
                }
                else
                {
                    h.NumberOfHouseholds = thiscomplexdata.AnzahlWohnungenBern;
                    h.Area += thiscomplexdata.TotalArea;
                    h.EnergieBezugsFläche += thiscomplexdata.TotalEnergieBezugsfläche;
                    h.AverageBuildingAge   = thiscomplexdata.BuildingAges.Average();
                }

                dbHouse.Save(h);
            }

            dbHouse.CompleteTransaction();
        }
 public LineEntry([NotNull] WgsPoint startPoint, [NotNull] WgsPoint endPoint, [NotNull] string text)
 {
     StartPoint = startPoint;
     EndPoint   = endPoint;
     Text       = text;
 }
        protected override void RunActualProcess()
        {
            var dbComplex = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Complexes, Constants.PresentSlice);
            //var dbRaw = SqlConnection.GetDatabaseConnection(Stage.Raw, Constants.PresentSlice);
            var buildingcomplexes = dbComplex.Fetch <BuildingComplex>();

            var dbComplexEnergy = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.ComplexEnergyData, Constants.PresentSlice);
            var complexdata     = dbComplexEnergy.Fetch <ComplexBuildingData>();
            var dbHouse         = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice);

            dbHouse.RecreateTable <House>();
            dbHouse.RecreateTable <PotentialHousehold>();
            //var sonnendach = dbRaw.Fetch<SonnenDach>();
            dbHouse.BeginTransaction();

            List <string> complexesToIgnore = new List <string> {
                "EGID191357110", "EGID1306724", "EGID1305755", "Fischermätteliweg nn"
            };
            //complexesToIgnore.Add("Bernstrasse 113a");
            //complexesToIgnore.Add("Finkhubelweg 8");
            //complexesToIgnore.Add("Friedhof 4");
            var manualCoordinates = ReadManualCoordinatesList();

            foreach (var complex in buildingcomplexes)
            {
                if (complexesToIgnore.Contains(complex.ComplexName))
                {
                    continue;
                }
                //haus anlegen
                var h = new House(complex.ComplexName,
                                  complex.ComplexGuid,
                                  Guid.NewGuid().ToString()
                                  )
                {
                    ComplexID = complex.ComplexID,
                };
                // ReSharper disable once ConditionIsAlwaysTrueOrFalse
                // ReSharper disable once HeuristicUnreachableCode
                if (h.Guid == null)
                {
                    // ReSharper disable once HeuristicUnreachableCode
                    throw new Exception("House guid was null");
                }

                // ReSharper disable once ConditionIsAlwaysTrueOrFalse
                // ReSharper disable once HeuristicUnreachableCode
                if (h.ComplexGuid == null)
                {
                    // ReSharper disable once HeuristicUnreachableCode
                    throw new Exception("Complex guid was null");
                }

                //gebäudeobjektids zuordnen

                foreach (var complexGebäudeObjectID in complex.GebäudeObjectIDs)
                {
                    h.GebäudeObjectIDs.Add(complexGebäudeObjectID);
                }

                // egids zuordnen
                foreach (var eGid in complex.EGids)
                {
                    h.EGIDs.Add((int)eGid);
                }

                //geo coords zuordnen
                foreach (var coord in complex.Coords)
                {
                    h.WgsGwrCoords.Add(WgsPoint.ConvertKoordsToLonLat(coord.X, coord.Y));
                }

                var manualCoord = manualCoordinates.Where(x => x.Name == h.ComplexName).ToList();
                if (manualCoord.Any())
                {
                    foreach (var manualComplexCoordinatese in manualCoord)
                    {
                        h.WgsGwrCoords.Add(new WgsPoint(manualComplexCoordinatese.Lon, manualComplexCoordinatese.Lat));
                    }
                }

                foreach (var coord in complex.LocalnetCoords)
                {
                    h.LocalWgsPoints.Add(WgsPoint.ConvertKoordsToLonLat(coord.X, coord.Y));
                }

                //addressen zuordnen
                if (complex.Adresses.Count == 0)
                {
                    h.Adress = "Unknown";
                }
                else
                {
                    h.Adress = complex.Adresses[0];
                }

                if (complex.TrafoKreise.Count > 0)
                {
                    foreach (var erzId in complex.ErzeugerIDs)
                    {
                        h.ErzeugerIDs.Add(erzId);
                    }
                }


                //assign household data
                var thiscomplexdata = complexdata.FirstOrDefault(x => x.ComplexName == complex.ComplexName);
                if (thiscomplexdata == null)
                {
                    h.Area = 0;
                    h.Appartments.Add(new AppartmentEntry(Guid.NewGuid().ToString(), 0, false, Constants.PresentSlice.DstYear));
                }
                else
                {
                    if (thiscomplexdata.AnzahlWohnungenBern > 0)
                    {
                        double avgArea = thiscomplexdata.TotalEnergieBezugsfläche / thiscomplexdata.AnzahlWohnungenBern;
                        for (int i = 0; i < thiscomplexdata.AnzahlWohnungenBern; i++)
                        {
                            h.Appartments.Add(new AppartmentEntry(Guid.NewGuid().ToString(), avgArea, true, Constants.PresentSlice.DstYear));
                        }
                    }
                    else
                    {
                        h.Appartments.Add(new AppartmentEntry(Guid.NewGuid().ToString(), thiscomplexdata.TotalEnergieBezugsfläche, false, Constants.PresentSlice.DstYear));
                    }
                    h.Area += thiscomplexdata.TotalArea;
                    h.AverageBuildingAge = thiscomplexdata.BuildingAges.Average();
                }

                dbHouse.Save(h);
            }

            dbHouse.CompleteTransaction();
            var           allHouses = dbHouse.FetchAsRepo <House>();
            RowCollection rc        = new RowCollection("houses", "houses");

            foreach (var house in allHouses)
            {
                RowBuilder rb = RowBuilder.Start("age", house.AverageBuildingAge);
                rc.Add(rb);
            }

            var fn = MakeAndRegisterFullFilename("HouseAges.xlsx", Constants.PresentSlice);

            XlsxDumper.WriteToXlsx(fn, rc);
        }
        protected override void RunChartMaking()
        {
            var dbHouse = Services.SqlConnectionPreparer.GetDatabaseConnection(Stage.Houses, Constants.PresentSlice);
            var houses  = dbHouse.Fetch <House>();
            var housesWithoutAnschluss = houses.Where(x => x.Hausanschluss.Count == 0).ToList();

            if (housesWithoutAnschluss.Count > 0)
            {
                throw new FlaException("Houses without anschluss");
            }

            var houseanschlusses = dbHouse.Fetch <Hausanschluss>();

            ExportAsExcel(houseanschlusses, houses);

            RGB HouseFunc(House h)
            {
                var ha = houseanschlusses.FirstOrDefault(x => x.HouseGuid == h.Guid);

                switch (ha?.MatchingType)
                {
                case HouseMatchingType.DirectByEgid:
                case HouseMatchingType.DirectByAdress:
                case HouseMatchingType.DirectByIsn:
                case HouseMatchingType.DirectByIsnSupplemental:
                case HouseMatchingType.DirectByAdressSupplemental:
                    return(Constants.Blue);

                case HouseMatchingType.Proximity:
                    return(Constants.Green);

                case HouseMatchingType.Leftover:
                    return(Constants.Orange);

                default:
                    return(Constants.Orange);
                }
            }

            var houseEntries = houses.Select(x => x.GetMapColorForHouse(HouseFunc)).ToList();
            var filename     = MakeAndRegisterFullFilename("DirektZugeordnete.png", Constants.PresentSlice);
            var labels       = new List <MapLegendEntry> {
                new MapLegendEntry("Direkt Gemappt", Constants.Blue),
                new MapLegendEntry("Näherung", Constants.Green),
                new MapLegendEntry("Kein Hausobjekt hinterlegt", Constants.Orange),
                new MapLegendEntry("Nicht Teil von Burgdorf", Constants.Red)
            };
            var lines = new List <LineEntry>();

            foreach (var hausanschluss in houseanschlusses)
            {
                if (hausanschluss.MatchingType == HouseMatchingType.DirectByEgid || hausanschluss.MatchingType == HouseMatchingType.DirectByIsn ||
                    hausanschluss.MatchingType == HouseMatchingType.DirectByAdress)
                {
                    continue;
                }

                var house = houses.Single(x => x.Guid == hausanschluss.HouseGuid);
                foreach (WgsPoint coord in house.WgsGwrCoords)
                {
                    WgsPoint isn = new WgsPoint(hausanschluss.Lon, hausanschluss.Lat);
                    //house.ComplexName + " - " + hausanschluss.ObjectID
                    lines.Add(new LineEntry(coord, isn, ""));
                }
            }

            Services.PlotMaker.MakeOsmMap(Name, filename, houseEntries, new List <WgsPoint>(), labels, lines);
        }
        private void DoProximityAssignments([NotNull][ItemNotNull] IReadOnlyCollection <House> houses,
                                            [NotNull][ItemNotNull] List <House> assignedHouses,
                                            [NotNull][ItemNotNull] List <HausanschlussImport> allIsnLocations,
                                            [NotNull][ItemNotNull] List <Hausanschluss> hausanschlusses)
        {
            var isnLocations = allIsnLocations.Where(x => !x.ObjectID.ToLower().Contains("leuchte")).ToList();

            foreach (var isnLocation in isnLocations)
            {
                if (isnLocation.ObjectID.ToLower().Contains("leuchte"))
                {
                    throw new FlaException("Leuchte gefunden");
                }
            }

            foreach (var assignedHouse in assignedHouses)
            {
                //check if every assigned house is actually assigned.
                var r = hausanschlusses.FirstOrDefault(x => x.HouseGuid == assignedHouse.Guid);
                if (r == null)
                {
                    throw new FlaException("Assigned house is not actually assigned.");
                }
            }

            //warning: multiple houses can share a hausanschluss
            houses = houses.Distinct().ToList();
            foreach (var house in houses)
            {
                if (assignedHouses.Contains(house))
                {
                    continue;
                }

                var locations      = new List <Tuple <double, HausanschlussImport> >();
                var houseWgsPoints = new List <WgsPoint>();
                houseWgsPoints.AddRange(house.LocalWgsPoints);
                if (houseWgsPoints.Count == 0)
                {
                    houseWgsPoints.AddRange(house.WgsGwrCoords);
                }

                if (houseWgsPoints.Count > 0)
                {
                    foreach (var isnLocation in isnLocations)
                    {
                        var wgsp     = new WgsPoint(isnLocation.Lon, isnLocation.Lat);
                        var distance = wgsp.GetMinimumDistance(houseWgsPoints);
                        locations.Add(new Tuple <double, HausanschlussImport>(distance, isnLocation));
                    }


                    locations.Sort((x, y) => x.Item1.CompareTo(y.Item1));
                    var pickedImported = locations[0].Item2;
                    //if (locations[0].Item1 > 200) {
                    //throw new Exception("More than 200 m");
                    //}

                    hausanschlusses.Add(new Hausanschluss(Guid.NewGuid().ToString(),
                                                          house.Guid,
                                                          pickedImported.ObjectID,
                                                          pickedImported.Egid,
                                                          pickedImported.Isn,
                                                          pickedImported.Lon,
                                                          pickedImported.Lat,
                                                          pickedImported.Trafokreis,
                                                          HouseMatchingType.Proximity,
                                                          locations[0].Item1,
                                                          locations[0].Item2.Adress,
                                                          pickedImported.Standort));
                }
            }

            var allAssignedHa   = hausanschlusses.Select(y => y.ObjectID);
            var allUnassignedHa = allIsnLocations.Where(x => !allAssignedHa.Contains(x.ObjectID)).ToList();

            foreach (var import in allUnassignedHa)
            {
                var houseDistances = new List <Tuple <double, House> >();
                var hawgs          = new WgsPoint(import.Lon, import.Lat);
                foreach (var house in houses)
                {
                    var houseCoords = house.WgsGwrCoords.ToList();
                    houseCoords.AddRange(house.LocalWgsPoints);
                    var distance = hawgs.GetMinimumDistance(houseCoords);
                    houseDistances.Add(new Tuple <double, House>(distance, house));
                }

                houseDistances.Sort((x, y) => x.Item1.CompareTo(y.Item1));
                var pickedHouse = houseDistances[0].Item2;

                hausanschlusses.Add(new Hausanschluss(Guid.NewGuid().ToString(),
                                                      pickedHouse.Guid,
                                                      import.ObjectID,
                                                      import.Egid,
                                                      import.Isn,
                                                      import.Lon,
                                                      import.Lat,
                                                      import.Trafokreis,
                                                      HouseMatchingType.Leftover,
                                                      houseDistances[0].Item1,
                                                      import.Adress,
                                                      import.Standort));
            }

            Info("Number of unassigned hausanschlüsse:" + allUnassignedHa.Count);
        }