public async Task ConvertOSEastingsNorthingsDataToLatLongUK() { var filesToProcess = Directory.GetFiles(ukRawDataFolder); Stopwatch st = new Stopwatch(); st.Start(); foreach (var file in filesToProcess) { try { var contentRows = _csvParser.ReadCsvFromFile(file); List <LocationLatLng> latLongRows = new List <LocationLatLng>(); foreach (var row in contentRows) { if (String.IsNullOrWhiteSpace(row)) { continue; } var split = row.Split(','); var postcode = split[0]; Console.WriteLine(st.ElapsedMilliseconds + ":" + postcode); var easting = double.Parse(split[2]); // No Try here. We want it to bomb out if there's an error. var northing = double.Parse(split[3]); // A postcode covers multiple houses. // As it covers a fairly wide area, we don't need to go ultra-fine in the conversion. LatitudeLongitude latLong = _geoUKHelper.ConvertEastNorthToLatLong_LowerAccuracyFast(easting, northing); var gmaps = string.Format("https://www.google.co.uk/maps/@{0},{1},19z", Math.Round(latLong.Latitude, 6), Math.Round(latLong.Longitude, 6)); // We don't need more than 6 decimal places (11.1cm accuracy) // https://gis.stackexchange.com/questions/8650/measuring-accuracy-of-latitude-and-longitude?newreg=5f6bf4ba81534a7ea34606ceceb00b35 var latRounded = Math.Round(latLong.Latitude, 6); var longRounded = Math.Round(latLong.Longitude, 6); LocationLatLng postcodeZipLatLong = new LocationLatLng(postcode, latRounded, longRounded); latLongRows.Add(postcodeZipLatLong); } FileInfo fi = new FileInfo(file); var newFilePath = Path.Combine(ukLatLongDataFolder, fi.Name); await _postcodeZipLatLongMethods.SavePostcodeZipLatLongToFile(newFilePath, latLongRows); // Clear the data for quicker garbage disposal. latLongRows.Clear(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); Console.ReadLine(); } } }
public async Task ConvertSpecificPostcodesToGeneralised() { var slnPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location).Replace(@"Demo\bin\Debug\netcoreapp3.1", ""); var processedDataFolder = Path.Combine(slnPath, @"CoreLookup\Data\UK\CodePointOpen2020\Data_Processed_LatLong\Merged"); var startingFile = Path.Combine(processedDataFolder, "uk_postcodes_lat_long_full.csv"); var finalFile = Path.Combine(processedDataFolder, "uk_postcodes_lat_long_area_district_only.csv"); // 1. Read in the merged data List <LocationLatLng> fullPostcodesList = await _postcodeZipLatLongMethods.GetPostcodeZipLatLongFromFile(startingFile); // 2. Loop throug the data string currentEvalPostcode = ""; List <LocationLatLng> currentEvalPostcodeLookup = new List <LocationLatLng>(); List <LocationLatLng> finalShortPostcodes = new List <LocationLatLng>(); for (int i = 0; i < fullPostcodesList.Count; i++) { var pCode = fullPostcodesList[i]; var postcodeStart = ""; if (pCode.Identifier.Contains(" ")) { // e.g. PO4 8ZW postcodeStart = pCode.Identifier.Split(' ')[0]; } else { // e.g. PO142PY postcodeStart = pCode.Identifier.Substring(0, 4); } if ((String.IsNullOrWhiteSpace(currentEvalPostcode) || postcodeStart == currentEvalPostcode) && i != fullPostcodesList.Count - 1) { currentEvalPostcode = postcodeStart; currentEvalPostcodeLookup.Add(pCode); } else { // The list has moved on. So we need to process the last batch of data and start afresh. var previousSetCondensed = await CondensePostcodes(currentEvalPostcode, currentEvalPostcodeLookup); finalShortPostcodes.Add(previousSetCondensed); Console.WriteLine($"Processed Postcodes: {currentEvalPostcode}"); // Set up the new data currentEvalPostcodeLookup = new List <LocationLatLng>(); currentEvalPostcode = postcodeStart; currentEvalPostcodeLookup.Add(pCode); // This is the next postcode along. Make sure to include it :) } } await _postcodeZipLatLongMethods.SavePostcodeZipLatLongToFile(finalFile, finalShortPostcodes); }