Some data work and also adding in some new config
This commit is contained in:
parent
0d3a273e22
commit
b5cf9b3f8d
89
config.sh
89
config.sh
@ -581,7 +581,12 @@ NOCODB_SHIFTS_SHEET=
|
||||
# NOCODB_SHIFT_SIGNUPS_SHEET is the URL to your NocoDB shift signups sheet where users can add their own shifts.
|
||||
NOCODB_SHIFT_SIGNUPS_SHEET=
|
||||
|
||||
# MkDocs Integration (using main domain, not subdomain)
|
||||
# NOCODB_CUTS_SHEET is the URL to your Nocodb Cuts sheet.
|
||||
NOCODB_CUTS_SHEET=
|
||||
|
||||
DOMAIN=$new_domain
|
||||
|
||||
# MkDocs Integration
|
||||
MKDOCS_URL=https://$new_domain
|
||||
MKDOCS_SEARCH_URL=https://$new_domain
|
||||
MKDOCS_SITE_SERVER_PORT=4002
|
||||
@ -614,6 +619,18 @@ NODE_ENV=production
|
||||
|
||||
# Add allowed origin
|
||||
ALLOWED_ORIGINS=https://map.$new_domain,http://localhost:3000
|
||||
|
||||
# SMTP Configuration
|
||||
SMTP_HOST=smtp.protonmail.ch
|
||||
SMTP_PORT=587
|
||||
SMTP_SECURE=false
|
||||
SMTP_USER=changeme@$new_domain
|
||||
SMTP_PASS=changeme
|
||||
EMAIL_FROM_NAME="$new_domain Map"
|
||||
EMAIL_FROM_ADDRESS=changeme@$new_domain
|
||||
|
||||
# App Configuration
|
||||
APP_NAME="$new_domain Map"
|
||||
EOL
|
||||
|
||||
echo "Map .env file updated with domain: $new_domain"
|
||||
@ -730,13 +747,13 @@ ALLOWED_ORIGINS=https://map.cmlite.org,http://localhost:3000
|
||||
SMTP_HOST=smtp.insert.here
|
||||
SMTP_PORT=insert_port
|
||||
SMTP_SECURE=false
|
||||
SMTP_USER=cmlite@bnkops.ca
|
||||
SMTP_PASS=insert_pass_here
|
||||
EMAIL_FROM_NAME=CMlite Map
|
||||
EMAIL_FROM_ADDRESS=insert_from_address
|
||||
SMTP_USER=changeme@$new_domain
|
||||
SMTP_PASS=changeme
|
||||
EMAIL_FROM_NAME="$new_domain Map"
|
||||
EMAIL_FROM_ADDRESS=changeme@$new_domain
|
||||
|
||||
# App Configuration
|
||||
APP_NAME=CMlite Map
|
||||
APP_NAME="$new_domain Map"
|
||||
|
||||
EOL
|
||||
echo "✅ Created new map .env file at $MAP_ENV_FILE"
|
||||
@ -751,6 +768,13 @@ EOL
|
||||
cp "$MAP_ENV_FILE" "$backup_file"
|
||||
echo "Created backup of map .env at $backup_file"
|
||||
|
||||
# Update DOMAIN
|
||||
if grep -q "^DOMAIN=" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^DOMAIN=.*|DOMAIN=$new_domain|" "$MAP_ENV_FILE"
|
||||
else
|
||||
echo "DOMAIN=$new_domain" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update NOCODB_API_URL to use new domain
|
||||
if grep -q "^NOCODB_API_URL=" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^NOCODB_API_URL=.*|NOCODB_API_URL=https://db.$new_domain/api/v1|" "$MAP_ENV_FILE"
|
||||
@ -758,6 +782,25 @@ EOL
|
||||
echo "NOCODB_API_URL=https://db.$new_domain/api/v1" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Add NOCODB_CUTS_SHEET if missing
|
||||
if ! grep -q "^NOCODB_CUTS_SHEET=" "$MAP_ENV_FILE"; then
|
||||
echo "NOCODB_CUTS_SHEET=" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update MKDOCS_URL to use new domain
|
||||
if grep -q "^MKDOCS_URL=" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^MKDOCS_URL=.*|MKDOCS_URL=https://$new_domain|" "$MAP_ENV_FILE"
|
||||
else
|
||||
echo "MKDOCS_URL=https://$new_domain" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update MKDOCS_SEARCH_URL to use new domain
|
||||
if grep -q "^MKDOCS_SEARCH_URL=" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^MKDOCS_SEARCH_URL=.*|MKDOCS_SEARCH_URL=https://$new_domain|" "$MAP_ENV_FILE"
|
||||
else
|
||||
echo "MKDOCS_SEARCH_URL=https://$new_domain" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update COOKIE_DOMAIN
|
||||
if grep -q "^COOKIE_DOMAIN=" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^COOKIE_DOMAIN=.*|COOKIE_DOMAIN=.$new_domain|" "$MAP_ENV_FILE"
|
||||
@ -773,6 +816,40 @@ EOL
|
||||
echo "ALLOWED_ORIGINS=$allowed_origins" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update EMAIL_FROM_NAME
|
||||
if grep -q "^EMAIL_FROM_NAME=" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^EMAIL_FROM_NAME=.*|EMAIL_FROM_NAME=\"$new_domain Map\"|" "$MAP_ENV_FILE"
|
||||
else
|
||||
echo "EMAIL_FROM_NAME=\"$new_domain Map\"" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update EMAIL_FROM_ADDRESS if it contains a domain reference
|
||||
if grep -q "^EMAIL_FROM_ADDRESS=" "$MAP_ENV_FILE"; then
|
||||
# Only update if it looks like it contains a domain placeholder
|
||||
if grep -q "changeme@\|insert_from_address" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^EMAIL_FROM_ADDRESS=.*|EMAIL_FROM_ADDRESS=changeme@$new_domain|" "$MAP_ENV_FILE"
|
||||
fi
|
||||
else
|
||||
echo "EMAIL_FROM_ADDRESS=changeme@$new_domain" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update SMTP_USER if it contains a domain reference
|
||||
if grep -q "^SMTP_USER=" "$MAP_ENV_FILE"; then
|
||||
# Only update if it looks like it contains a domain placeholder
|
||||
if grep -q "changeme@\|@bnkops.ca" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^SMTP_USER=.*|SMTP_USER=changeme@$new_domain|" "$MAP_ENV_FILE"
|
||||
fi
|
||||
else
|
||||
echo "SMTP_USER=changeme@$new_domain" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update APP_NAME
|
||||
if grep -q "^APP_NAME=" "$MAP_ENV_FILE"; then
|
||||
sed -i "s|^APP_NAME=.*|APP_NAME=\"$new_domain Map\"|" "$MAP_ENV_FILE"
|
||||
else
|
||||
echo "APP_NAME=\"$new_domain Map\"" >> "$MAP_ENV_FILE"
|
||||
fi
|
||||
|
||||
# Update domain references in NocoDB URLs while preserving the sheet IDs and paths
|
||||
# This will update domains like cmlite.org, changeme.org, etc. to the new domain
|
||||
sed -i "s|://db\.cmlite\.org/|://db.$new_domain/|g" "$MAP_ENV_FILE"
|
||||
|
||||
@ -15,6 +15,8 @@ Welcome to the Map project! This application is a canvassing tool for political
|
||||
- **Security:** Never expose sensitive credentials. All API calls to NocoDB go through the backend.
|
||||
- **Scalability:** Write code that is easy to extend (e.g., adding new location fields, new admin features).
|
||||
- **User Experience:** Prioritize clear feedback, error handling, and mobile responsiveness.
|
||||
- **Documentation:** Keep code well-documented and maintain the `Instructions.md`, `README.md` and `files-explainer.md` files.
|
||||
- **Modularity:** Use modular JavaScript to keep code organized and reusable; try to avoid large monolithic scripts keeping functionality separated by feature with files no longer than 500 lines.
|
||||
|
||||
## Directory Structure
|
||||
|
||||
|
||||
6
map/app/package-lock.json
generated
6
map/app/package-lock.json
generated
@ -22,6 +22,7 @@
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"node-fetch": "^2.7.0",
|
||||
"nodemailer": "^7.0.5",
|
||||
"papaparse": "^5.5.3",
|
||||
"qrcode": "^1.5.3",
|
||||
"winston": "^3.11.0"
|
||||
},
|
||||
@ -1499,6 +1500,11 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/papaparse": {
|
||||
"version": "5.5.3",
|
||||
"resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz",
|
||||
"integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A=="
|
||||
},
|
||||
"node_modules/parseurl": {
|
||||
"version": "1.3.3",
|
||||
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
|
||||
|
||||
@ -30,6 +30,7 @@
|
||||
"multer": "^1.4.5-lts.1",
|
||||
"node-fetch": "^2.7.0",
|
||||
"nodemailer": "^7.0.5",
|
||||
"papaparse": "^5.5.3",
|
||||
"qrcode": "^1.5.3",
|
||||
"winston": "^3.11.0"
|
||||
},
|
||||
|
||||
@ -106,8 +106,8 @@
|
||||
<span class="btn-icon">🏠</span>
|
||||
<span class="btn-text">Hide Start Location</span>
|
||||
</button>
|
||||
<button id="toggle-edmonton-layer-btn" class="btn btn-secondary" title="Toggle City of Edmonton address layer">
|
||||
<span class="btn-icon">🏙️</span>
|
||||
<button id="toggle-edmonton-layer-btn" class="btn btn-secondary" title="Toggle City of Edmonton suite/apartment data">
|
||||
<span class="btn-icon">🚪</span>
|
||||
<span class="btn-text">City Data</span>
|
||||
</button>
|
||||
<button id="refresh-btn" class="btn btn-primary">
|
||||
@ -149,13 +149,13 @@
|
||||
<button id="mobile-add-location-btn" class="btn btn-success" title="Add Location">
|
||||
➕
|
||||
</button>
|
||||
<button id="mobile-toggle-edmonton-layer-btn" class="btn btn-secondary" title="Toggle Edmonton Data">
|
||||
🏙️
|
||||
<button id="mobile-toggle-edmonton-layer-btn" class="btn btn-secondary" title="Toggle Edmonton Suites">
|
||||
🚪
|
||||
</button>
|
||||
|
||||
<!-- Add mobile overlay button -->
|
||||
<button id="mobile-overlay-btn" class="btn btn-secondary" title="Map Overlays">
|
||||
🗺️
|
||||
✂️
|
||||
</button>
|
||||
|
||||
<button id="mobile-fullscreen-btn" class="btn btn-secondary" title="Fullscreen">
|
||||
|
||||
@ -0,0 +1,4 @@
|
||||
{
|
||||
"type": "FeatureCollection",
|
||||
"features": [
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
689
map/data/City_of_Edmonton_-_Neighbourhoods_20250807.csv
Normal file
689
map/data/City_of_Edmonton_-_Neighbourhoods_20250807.csv
Normal file
File diff suppressed because one or more lines are too long
@ -0,0 +1,407 @@
|
||||
Neighbourhood Number,Neighbourhood Name,Area Sq Km,Latitude,Longitude,Location,Geometry Point
|
||||
3430,Wellington,1.219222786758116,53.595833,-113.552695,"(53.59583297304488, -113.55269493377908)",POINT (-113.55269493377908 53.59583297304488)
|
||||
3490,Goodridge Corners,2.690273431470499,53.642395,-113.558741,"(53.642394533593645, -113.55874073268737)",POINT (-113.55874073268737 53.642394533593645)
|
||||
3060,Caernarvon,1.228848900441794,53.611900,-113.526402,"(53.6118997513244, -113.52640171562766)",POINT (-113.52640171562766 53.6118997513244)
|
||||
5453,Blackmud Creek,0.788439214693441,53.419661,-113.510788,"(53.41966051994985, -113.51078782887589)",POINT (-113.51078782887589 53.41966051994985)
|
||||
6444,Laurel,2.80281875998592,53.445799,-113.381470,"(53.44579889016164, -113.38147041428071)",POINT (-113.38147041428071 53.44579889016164)
|
||||
3350,Prince Charles,0.790117287197106,53.575635,-113.536002,"(53.57563545261752, -113.53600199095251)",POINT (-113.53600199095251 53.57563545261752)
|
||||
6216,The Orchards At Ellerslie,3.590698970622594,53.403087,-113.458166,"(53.403087349122, -113.45816601336082)",POINT (-113.45816601336082 53.403087349122)
|
||||
6445,Aster,2.049911369268085,53.451654,-113.358230,"(53.451654121975196, -113.35822962579826)",POINT (-113.35822962579826 53.451654121975196)
|
||||
5330,Queen Alexandra,1.235993276718487,53.512220,-113.504812,"(53.512219718827524, -113.50481243737059)",POINT (-113.50481243737059 53.512219718827524)
|
||||
4330,Mitchell Industrial,0.592505781901004,53.574016,-113.584201,"(53.574015777184755, -113.58420113305871)",POINT (-113.58420113305871 53.574015777184755)
|
||||
6665,Anthony Henday South East,7.333234082596398,53.440972,-113.360909,"(53.44097162860197, -113.36090937140537)",POINT (-113.36090937140537 53.44097162860197)
|
||||
4120,Donsdale,0.673213538884092,53.485630,-113.635460,"(53.48563017460971, -113.63546017525792)",POINT (-113.63546017525792 53.48563017460971)
|
||||
5060,Blue Quill,1.058050284116874,53.457627,-113.526237,"(53.45762652284968, -113.52623651525523)",POINT (-113.52623651525523 53.45762652284968)
|
||||
6290,Hazeldean,1.13318485416981,53.504206,-113.477889,"(53.504205803580085, -113.4778888991957)",POINT (-113.4778888991957 53.504205803580085)
|
||||
5462,Chappelle,4.807804961234418,53.403081,-113.586844,"(53.40308104313948, -113.58684392227269)",POINT (-113.58684392227269 53.40308104313948)
|
||||
5454,Rutherford,2.249954964900244,53.416765,-113.529788,"(53.41676484779562, -113.52978802448754)",POINT (-113.52978802448754 53.41676484779562)
|
||||
6400,Lee Ridge,0.89803555095526,53.469593,-113.444355,"(53.46959297153256, -113.44435531961082)",POINT (-113.44435531961082 53.46959297153256)
|
||||
1160,Parkdale,0.951677947287198,53.565716,-113.471350,"(53.56571569922305, -113.47135037879477)",POINT (-113.47135037879477 53.56571569922305)
|
||||
8885,Edmonton South Central East,7.320891946126845,53.381265,-113.455164,"(53.38126479866277, -113.45516359879298)",POINT (-113.45516359879298 53.38126479866277)
|
||||
4486,Stewart Greens,0.646216979562161,53.537567,-113.670461,"(53.53756690004989, -113.670460633271)",POINT (-113.670460633271 53.53756690004989)
|
||||
6690,Southeast Industrial,6.981442851771134,53.499714,-113.374605,"(53.49971414363941, -113.3746049513243)",POINT (-113.3746049513243 53.49971414363941)
|
||||
6442,Silver Berry,2.161978549587595,53.461159,-113.381406,"(53.46115896920189, -113.38140615993143)",POINT (-113.38140615993143 53.46115896920189)
|
||||
4080,Callingwood South,0.772228221804613,53.500515,-113.623031,"(53.50051487931529, -113.62303087351475)",POINT (-113.62303087351475 53.50051487931529)
|
||||
4022,Anthony Henday Clareview,1.352386339893706,53.617886,-113.357959,"(53.617885711275214, -113.35795929304325)",POINT (-113.35795929304325 53.617885711275214)
|
||||
2670,Rural North East Horse Hill,13.054245433284906,53.678364,-113.312513,"(53.67836434132921, -113.31251307885341)",POINT (-113.31251307885341 53.67836434132921)
|
||||
6240,Fulton Place,0.978513188903251,53.546295,-113.427466,"(53.54629463703151, -113.42746647274248)",POINT (-113.42746647274248 53.54629463703151)
|
||||
1030,Central McDougall,1.201166715317646,53.553332,-113.501068,"(53.55333182850342, -113.50106809464475)",POINT (-113.50106809464475 53.55333182850342)
|
||||
2681,Edmonton Energy And Technology Park,53.40099029316411,53.678232,-113.380060,"(53.67823189399229, -113.3800601957547)",POINT (-113.3800601957547 53.67823189399229)
|
||||
3190,Elsinore,0.841472960736505,53.640763,-113.499402,"(53.640763391998256, -113.4994021462004)",POINT (-113.4994021462004 53.640763391998256)
|
||||
6590,Pylypow Industrial,3.485793820405979,53.497288,-113.405989,"(53.49728765544971, -113.40598877698807)",POINT (-113.40598877698807 53.49728765544971)
|
||||
5571,River Valley Kendal,1.020108021323206,53.404597,-113.647002,"(53.40459674375974, -113.64700240747504)",POINT (-113.64700240747504 53.40459674375974)
|
||||
2230,Delwood,1.334660743338618,53.595949,-113.455130,"(53.595948943096154, -113.45513034887446)",POINT (-113.45513034887446 53.595948943096154)
|
||||
6340,Kameyosek,0.721599491681586,53.461919,-113.442068,"(53.46191874308279, -113.44206793426125)",POINT (-113.44206793426125 53.46191874308279)
|
||||
2290,Glengarry,1.344767435974462,53.595855,-113.479612,"(53.59585546337682, -113.479611721532)",POINT (-113.479611721532 53.59585546337682)
|
||||
1090,Downtown,2.312013818963168,53.539767,-113.499421,"(53.539766593635115, -113.49942076578088)",POINT (-113.49942076578088 53.539766593635115)
|
||||
4024,Anthony Henday South Blackburne,1.192096404784096,53.434475,-113.504617,"(53.43447457603955, -113.50461698033163)",POINT (-113.50461698033163 53.43447457603955)
|
||||
4090,Canora,0.881855908649112,53.546193,-113.584215,"(53.546193442280206, -113.58421460413187)",POINT (-113.58421460413187 53.546193442280206)
|
||||
3410,Sherbrooke,0.92619891968918,53.575663,-113.547286,"(53.575663208477806, -113.5472856344579)",POINT (-113.5472856344579 53.575663208477806)
|
||||
3260,Lauderdale,1.301509605951038,53.588449,-113.504256,"(53.58844884895879, -113.50425618926072)",POINT (-113.50425618926072 53.58844884895879)
|
||||
4017,Anthony Henday Lake District,1.999296273475226,53.646909,-113.467371,"(53.646909392951784, -113.46737130828637)",POINT (-113.46737130828637 53.646909392951784)
|
||||
5451,Richford,0.591073247851411,53.427270,-113.507394,"(53.42726985859359, -113.50739446923973)",POINT (-113.50739446923973 53.42726985859359)
|
||||
6520,Mill Woods Town Centre,0.518415534046262,53.456458,-113.427480,"(53.456458462877386, -113.42748006004459)",POINT (-113.42748006004459 53.456458462877386)
|
||||
4060,Britannia Youngstown,1.638283437452801,53.546295,-113.601510,"(53.54629461971565, -113.60151037109307)",POINT (-113.60151037109307 53.54629461971565)
|
||||
2560,Newton,1.065557680765298,53.576424,-113.424532,"(53.5764243717906, -113.42453203190698)",POINT (-113.42453203190698 53.5764243717906)
|
||||
4461,The Hamptons,2.944777506671935,53.487386,-113.675687,"(53.48738559961549, -113.6756873811716)",POINT (-113.6756873811716 53.48738559961549)
|
||||
4270,Lymburn,1.56158360314097,53.507532,-113.642300,"(53.507532410348745, -113.64230021562753)",POINT (-113.64230021562753 53.507532410348745)
|
||||
6110,CPR Irvine,0.663609710226865,53.507527,-113.490549,"(53.507526689273476, -113.4905491361126)",POINT (-113.4905491361126 53.507526689273476)
|
||||
5476,Magrath Heights,1.229773458177504,53.447689,-113.556720,"(53.447688501239554, -113.5567204318348)",POINT (-113.5567204318348 53.447688501239554)
|
||||
2611,Cy Becker,1.00926842249245,53.632363,-113.406924,"(53.63236275901925, -113.40692407461462)",POINT (-113.40692407461462 53.63236275901925)
|
||||
3090,Carlisle,0.946296996496242,53.603520,-113.525915,"(53.60352021881101, -113.52591462611406)",POINT (-113.52591462611406 53.60352021881101)
|
||||
2710,Sifton Park,0.504042712155268,53.594525,-113.408402,"(53.59452510263165, -113.40840160415829)",POINT (-113.40840160415829 53.59452510263165)
|
||||
4280,Lynnwood,0.895015173568326,53.515701,-113.589909,"(53.515701325038734, -113.58990906542579)",POINT (-113.58990906542579 53.515701325038734)
|
||||
2330,Highlands,1.147095796502761,53.565999,-113.430171,"(53.565998589832105, -113.43017053067386)",POINT (-113.43017053067386 53.565998589832105)
|
||||
4290,Mayfield,0.867205366107613,53.555018,-113.598170,"(53.5550180328723, -113.59817021652945)",POINT (-113.59817021652945 53.5550180328723)
|
||||
6200,Ekota,0.819662436177634,53.449410,-113.442336,"(53.449410079810406, -113.44233568136139)",POINT (-113.44233568136139 53.449410079810406)
|
||||
4468,Stillwater,3.372698983409043,53.443254,-113.676743,"(53.44325386891211, -113.67674311534861)",POINT (-113.67674311534861 53.44325386891211)
|
||||
1180,Queen Mary Park,1.803836223193328,53.553321,-113.519654,"(53.55332064222554, -113.51965422615388)",POINT (-113.51965422615388 53.55332064222554)
|
||||
5457,Callaghan,0.817914493051676,53.407345,-113.526792,"(53.4073451635787, -113.52679196283633)",POINT (-113.52679196283633 53.4073451635787)
|
||||
5020,Aspen Gardens,0.666305587189504,53.477535,-113.545664,"(53.47753531391314, -113.5456643078709)",POINT (-113.5456643078709 53.47753531391314)
|
||||
5050,Blackmud Creek Ravine,0.875493789671736,53.446870,-113.524166,"(53.44686992900772, -113.52416566866415)",POINT (-113.52416566866415 53.44686992900772)
|
||||
4430,Rio Terrace,0.582752538961743,53.507314,-113.584549,"(53.50731420851918, -113.58454862423845)",POINT (-113.58454862423845 53.50731420851918)
|
||||
3380,River Valley Capitol Hill,1.687583590347795,53.531886,-113.559886,"(53.53188605950759, -113.55988567347316)",POINT (-113.55988567347316 53.53188605950759)
|
||||
4640,Wilson Industrial,0.996486224451116,53.554077,-113.633521,"(53.55407736657594, -113.63352130894815)",POINT (-113.63352130894815 53.55407736657594)
|
||||
2630,River Valley Hermitage,2.196317099692021,53.591428,-113.408502,"(53.591428272471504, -113.40850196592923)",POINT (-113.40850196592923 53.591428272471504)
|
||||
6600,Richfield,0.944326664772193,53.469484,-113.458618,"(53.46948396845185, -113.45861750603322)",POINT (-113.45861750603322 53.46948396845185)
|
||||
6500,Mill Woods Golf Course,1.394112727208666,53.482062,-113.430425,"(53.48206208549219, -113.43042543572955)",POINT (-113.43042543572955 53.48206208549219)
|
||||
5456,Heritage Valley Area,1.315833243412828,53.417641,-113.547054,"(53.417641431863345, -113.54705350345404)",POINT (-113.54705350345404 53.417641431863345)
|
||||
2360,Industrial Heights,0.743856660064538,53.580983,-113.437473,"(53.58098253108419, -113.43747298136987)",POINT (-113.43747298136987 53.58098253108419)
|
||||
3340,Pembina,0.572523461297627,53.603168,-113.542845,"(53.603167658034536, -113.54284506988225)",POINT (-113.54284506988225 53.603167658034536)
|
||||
4730,Suder Greens,0.98730274777436,53.524586,-113.677276,"(53.52458649056212, -113.6772761921058)",POINT (-113.6772761921058 53.52458649056212)
|
||||
6350,Kenilworth,1.148417530470622,53.521633,-113.431042,"(53.52163312262259, -113.43104243926484)",POINT (-113.43104243926484 53.52163312262259)
|
||||
4487,Secord,2.653531928294564,53.533862,-113.701352,"(53.53386206881386, -113.70135225077067)",POINT (-113.70135225077067 53.53386206881386)
|
||||
4400,Place LaRue,1.041798574887158,53.539008,-113.633323,"(53.539007705161794, -113.63332341710671)",POINT (-113.63332341710671 53.539007705161794)
|
||||
6420,Maple Ridge Industrial,3.745483569473637,53.498009,-113.356365,"(53.49800897213869, -113.35636503434607)",POINT (-113.35636503434607 53.49800897213869)
|
||||
2030,Bannerman,0.733094186437842,53.603950,-113.378624,"(53.60394967918678, -113.37862372103365)",POINT (-113.37862372103365 53.60394967918678)
|
||||
6140,Crawford Plains,1.126122871800381,53.441837,-113.406216,"(53.44183745503461, -113.40621587793581)",POINT (-113.40621587793581 53.44183745503461)
|
||||
3140,Crestwood,1.168157833822598,53.535434,-113.569038,"(53.53543354824776, -113.56903784929617)",POINT (-113.56903784929617 53.53543354824776)
|
||||
2270,Evergreen,0.565860222588207,53.632241,-113.350484,"(53.632240591468204, -113.35048376128464)",POINT (-113.35048376128464 53.632240591468204)
|
||||
3150,Cumberland,1.456548184533901,53.610563,-113.553188,"(53.61056256755815, -113.55318813558542)",POINT (-113.55318813558542 53.61056256755815)
|
||||
5560,Whitemud Creek Ravine South,2.248387667560781,53.468499,-113.560341,"(53.46849885495364, -113.56034051783959)",POINT (-113.56034051783959 53.46849885495364)
|
||||
3050,Brown Industrial,0.375566929826875,53.582399,-113.568007,"(53.58239893635303, -113.5680073695957)",POINT (-113.5680073695957 53.58239893635303)
|
||||
4020,Aldergrove,1.49059608632687,53.516888,-113.641242,"(53.51688846994692, -113.6412419909567)",POINT (-113.6412419909567 53.51688846994692)
|
||||
5400,River Valley Whitemud,1.514766043873998,53.505152,-113.550470,"(53.50515157926489, -113.55046983011724)",POINT (-113.55046983011724 53.50515157926489)
|
||||
6213,Summerside,3.911019851091058,53.417528,-113.461227,"(53.4175276127026, -113.46122737605207)",POINT (-113.46122737605207 53.4175276127026)
|
||||
2340,Hollick-Kenyon,1.533471342019301,53.622244,-113.422288,"(53.62224418234196, -113.4222878615544)",POINT (-113.4222878615544 53.62224418234196)
|
||||
4464,The Uplands,3.079897173321534,53.461707,-113.657391,"(53.461707245994, -113.65739134608921)",POINT (-113.65739134608921 53.461707245994)
|
||||
4340,Morin Industrial,0.66861285498623,53.544921,-113.633605,"(53.544920700156055, -113.63360526733402)",POINT (-113.63360526733402 53.544920700156055)
|
||||
5130,Carter Crest,0.666751927992226,53.464885,-113.577802,"(53.46488524756335, -113.57780188767926)",POINT (-113.57780188767926 53.46488524756335)
|
||||
5360,Rideau Park,0.801658255848343,53.479032,-113.505933,"(53.47903247647679, -113.50593303233492)",POINT (-113.50593303233492 53.47903247647679)
|
||||
3120,Chambery,0.728796841349919,53.640764,-113.511761,"(53.64076376483925, -113.51176139221641)",POINT (-113.51176139221641 53.64076376483925)
|
||||
2400,Kildare,1.188673311378398,53.603293,-113.455150,"(53.60329283639778, -113.45515009551443)",POINT (-113.45515009551443 53.60329283639778)
|
||||
1190,River Valley Kinnaird,0.855767831082506,53.554249,-113.469524,"(53.55424923268959, -113.4695235484404)",POINT (-113.4695235484404 53.55424923268959)
|
||||
4520,Summerlea,1.100465972999626,53.525627,-113.622633,"(53.52562655378806, -113.6226333201063)",POINT (-113.6226333201063 53.52562655378806)
|
||||
3160,Dominion Industrial,0.982474840538575,53.575830,-113.571851,"(53.57582979380243, -113.57185127525071)",POINT (-113.57185127525071 53.57582979380243)
|
||||
5610,Haddow,1.277228159134993,53.454750,-113.596489,"(53.45474982269482, -113.59648877723627)",POINT (-113.59648877723627 53.45474982269482)
|
||||
6360,King Edward Park,1.49372429044258,53.515151,-113.450570,"(53.51515115710009, -113.45056960512973)",POINT (-113.45056960512973 53.51515115710009)
|
||||
4466,Cameron Heights,0.968758407711446,53.474127,-113.634359,"(53.474126648696625, -113.63435942674349)",POINT (-113.63435942674349 53.474126648696625)
|
||||
4015,Anthony Henday Mistatim,2.440151584003018,53.608478,-113.611955,"(53.60847815252636, -113.61195468482153)",POINT (-113.61195468482153 53.60847815252636)
|
||||
6300,Hillview,1.102185645880718,53.469740,-113.427064,"(53.469740414037474, -113.4270640039255)",POINT (-113.4270640039255 53.469740414037474)
|
||||
6667,Mattson,2.641030776031287,53.403141,-113.430407,"(53.403141113281414, -113.430407385962)",POINT (-113.430407385962 53.403141113281414)
|
||||
2040,Beacon Heights,1.150205867813953,53.573539,-113.406040,"(53.57353937729379, -113.40604010217766)",POINT (-113.40604010217766 53.57353937729379)
|
||||
4650,Winterburn Industrial Area East,5.640342453504083,53.556945,-113.675308,"(53.556944783887026, -113.67530826794228)",POINT (-113.67530826794228 53.556944783887026)
|
||||
5160,Duggan,1.390159963564318,53.471510,-113.506058,"(53.47151002842159, -113.50605757655529)",POINT (-113.50605757655529 53.47151002842159)
|
||||
2251,Ebbers,0.61205703835959,53.611425,-113.401030,"(53.611424777633275, -113.40102959757573)",POINT (-113.40102959757573 53.611424777633275)
|
||||
6390,Larkspur,1.658194911785387,53.480210,-113.381240,"(53.48021045766002, -113.3812399485388)",POINT (-113.3812399485388 53.48021045766002)
|
||||
6190,Edmonton Research and Development Park,1.216429089053384,53.446220,-113.473032,"(53.44622031239629, -113.47303198803755)",POINT (-113.47303198803755 53.44622031239629)
|
||||
4018,Anthony Henday Big Lake,3.217142212628032,53.592211,-113.647881,"(53.59221135864012, -113.64788090682242)",POINT (-113.64788090682242 53.59221135864012)
|
||||
6330,Jackson Heights,1.267804712191596,53.481660,-113.410848,"(53.48166024147494, -113.41084771740064)",POINT (-113.41084771740064 53.48166024147494)
|
||||
6669,Alces,3.860769866416448,53.433217,-113.356068,"(53.43321723990721, -113.35606800230053)",POINT (-113.35606800230053 53.43321723990721)
|
||||
5110,Calgary Trail North,0.747172260189152,53.490156,-113.494069,"(53.49015648355935, -113.49406931149764)",POINT (-113.49406931149764 53.49015648355935)
|
||||
3070,Calder,1.348177929521674,53.588056,-113.528872,"(53.58805578085307, -113.52887205475145)",POINT (-113.52887205475145 53.58805578085307)
|
||||
1140,McCauley,1.498167636369594,53.554605,-113.485098,"(53.55460510238498, -113.48509801676677)",POINT (-113.48509801676677 53.55460510238498)
|
||||
2160,Clover Bar Area,19.303523742332327,53.591512,-113.333357,"(53.59151239150917, -113.33335678332813)",POINT (-113.33335678332813 53.59151239150917)
|
||||
4012,Anthony Henday South West,4.494541532916784,53.485006,-113.658883,"(53.485005625366284, -113.65888300615327)",POINT (-113.65888300615327 53.485005625366284)
|
||||
4230,Jasper Park,0.665285398353537,53.523070,-113.584105,"(53.52307006685602, -113.58410530166327)",POINT (-113.58410530166327 53.52307006685602)
|
||||
3170,Dovercourt,1.001265096725352,53.575727,-113.559534,"(53.57572651757001, -113.55953411087015)",POINT (-113.55953411087015 53.57572651757001)
|
||||
4390,Patricia Heights,0.610731931165779,53.507564,-113.592293,"(53.5075640569012, -113.59229331898594)",POINT (-113.59229331898594 53.5075640569012)
|
||||
2450,Lago Lindo,1.305515008768344,53.636039,-113.484647,"(53.636039092648886, -113.48464731674068)",POINT (-113.48464731674068 53.636039092648886)
|
||||
6540,Morris Industrial,1.295051466950628,53.520507,-113.402875,"(53.5205070474015, -113.40287507920408)",POINT (-113.40287507920408 53.5205070474015)
|
||||
6090,Coronet Addition Industrial,0.433146488333089,53.502729,-113.451653,"(53.502728562228555, -113.45165308361577)",POINT (-113.45165308361577 53.502728562228555)
|
||||
2590,Overlanders,0.841194925542792,53.581011,-113.388176,"(53.58101065034532, -113.38817648181885)",POINT (-113.38817648181885 53.58101065034532)
|
||||
4320,Mistatim Industrial,6.780335986322571,53.596837,-113.599771,"(53.59683656416475, -113.59977067013727)",POINT (-113.59977067013727 53.59683656416475)
|
||||
4140,Elmwood,1.025925190185115,53.515738,-113.605993,"(53.515738255479256, -113.60599332912918)",POINT (-113.60599332912918 53.515738255479256)
|
||||
2511,Mayliewan,1.19586259753607,53.622290,-113.460264,"(53.622290298766785, -113.46026446170166)",POINT (-113.46026446170166 53.622290298766785)
|
||||
6661,Charlesworth,2.660274081398944,53.428544,-113.418130,"(53.42854379358836, -113.41813010932303)",POINT (-113.41813010932303 53.42854379358836)
|
||||
6530,Minchau,0.905518906136858,53.469829,-113.412766,"(53.46982918262529, -113.41276586393289)",POINT (-113.41276586393289 53.46982918262529)
|
||||
4410,Poundmaker Industrial,0.663629774410648,53.552287,-113.645875,"(53.552287292768845, -113.64587519214425)",POINT (-113.64587519214425 53.552287292768845)
|
||||
1070,Cromdale,0.358878936709191,53.559061,-113.469043,"(53.55906091683242, -113.469043089566)",POINT (-113.469043089566 53.55906091683242)
|
||||
4530,Sunwapta Industrial,0.675263159533806,53.544978,-113.645944,"(53.54497845847601, -113.64594419410999)",POINT (-113.64594419410999 53.54497845847601)
|
||||
6580,Pollard Meadows,1.052584834832619,53.449115,-113.413032,"(53.449115019121365, -113.41303221730111)",POINT (-113.41303221730111 53.449115019121365)
|
||||
4021,Anthony Henday Horse Hill,1.123389188460941,53.633205,-113.387470,"(53.6332051339252, -113.38747022429976)",POINT (-113.38747022429976 53.6332051339252)
|
||||
4420,Quesnell Heights,0.207151461970735,53.509354,-113.573534,"(53.509354322966445, -113.57353363357674)",POINT (-113.57353363357674 53.509354322966445)
|
||||
4510,Stone Industrial,0.645861448576014,53.544958,-113.621671,"(53.544958219425084, -113.62167138131025)",POINT (-113.62167138131025 53.544958219425084)
|
||||
4475,Kinokamau Plains Area,7.078589275160008,53.585084,-113.620441,"(53.58508423157136, -113.62044143125405)",POINT (-113.62044143125405 53.58508423157136)
|
||||
4180,Glenwood,1.77261508818045,53.536417,-113.602770,"(53.536416563291034, -113.60276981012993)",POINT (-113.60276981012993 53.536416563291034)
|
||||
6710,Strathearn,0.786297412933607,53.531292,-113.464047,"(53.53129197947159, -113.4640466579738)",POINT (-113.4640466579738 53.53129197947159)
|
||||
2500,Matt Berry,1.137771769015241,53.622254,-113.436022,"(53.62225395930331, -113.43602152876804)",POINT (-113.43602152876804 53.62225395930331)
|
||||
3382,River Valley Laurier,1.243485078616951,53.510583,-113.553323,"(53.510583477055974, -113.55332311271663)",POINT (-113.55332311271663 53.510583477055974)
|
||||
2380,Kennedale Industrial,1.322440523257289,53.590871,-113.423376,"(53.590871253170405, -113.42337551614855)",POINT (-113.42337551614855 53.590871253170405)
|
||||
5573,Kendal,2.680113417328902,53.403015,-113.626988,"(53.4030146119634, -113.62698763054175)",POINT (-113.62698763054175 53.4030146119634)
|
||||
2720,York,1.188834054904896,53.602843,-113.430212,"(53.60284342250439, -113.4302123105938)",POINT (-113.4302123105938 53.60284342250439)
|
||||
5090,Brookside,1.194912088812939,53.491831,-113.568128,"(53.491831258270594, -113.56812781287422)",POINT (-113.56812781287422 53.491831258270594)
|
||||
5452,MacEwan,1.14101527689503,53.428746,-113.526948,"(53.42874568503817, -113.52694799663772)",POINT (-113.52694799663772 53.42874568503817)
|
||||
4360,Oleskiw,1.326004346995236,53.497340,-113.608766,"(53.49733975842764, -113.60876578846745)",POINT (-113.60876578846745 53.49733975842764)
|
||||
4019,Anthony Henday Energy Park,2.293673525553315,53.639588,-113.407223,"(53.639587651047016, -113.40722276233143)",POINT (-113.40722276233143 53.639587651047016)
|
||||
4451,River Valley Oleskiw,2.473080410733733,53.488851,-113.601428,"(53.48885107422511, -113.60142818223238)",POINT (-113.60142818223238 53.48885107422511)
|
||||
5580,Windsor Park,0.758013794754402,53.524078,-113.536862,"(53.52407815950066, -113.53686248367437)",POINT (-113.53686248367437 53.52407815950066)
|
||||
5120,Calgary Trail South,0.653892900160392,53.471191,-113.493532,"(53.471191224972046, -113.49353163439852)",POINT (-113.49353163439852 53.471191224972046)
|
||||
4570,Wedgewood Heights,0.708630272070407,53.478714,-113.646580,"(53.4787144942962, -113.64658024116764)",POINT (-113.64658024116764 53.4787144942962)
|
||||
8887,Edmonton South Central,29.240983365865965,53.366757,-113.586127,"(53.366757392119766, -113.58612683163992)",POINT (-113.58612683163992 53.366757392119766)
|
||||
6030,Bisset,0.943123785352495,53.458905,-113.400659,"(53.45890549467666, -113.40065946472495)",POINT (-113.40065946472495 53.45890549467666)
|
||||
6195,South Edmonton Common,1.40199801017479,53.446694,-113.486079,"(53.446694303499584, -113.48607861166045)",POINT (-113.48607861166045 53.446694303499584)
|
||||
8888,Edmonton South West,28.11929079144318,53.366549,-113.647424,"(53.366549010896065, -113.64742426149267)",POINT (-113.64742426149267 53.366549010896065)
|
||||
4600,West Sheffield Industrial,0.624060585443696,53.559493,-113.609044,"(53.55949273334895, -113.60904431401366)",POINT (-113.60904431401366 53.55949273334895)
|
||||
6460,Meyokumin,0.974079702848291,53.450113,-113.427258,"(53.45011313088706, -113.42725752643224)",POINT (-113.42725752643224 53.45011313088706)
|
||||
6260,Girard Industrial,0.497379939504061,53.511170,-113.437724,"(53.51116985458425, -113.43772379583726)",POINT (-113.43772379583726 53.51116985458425)
|
||||
5520,University of Alberta,1.195997304775075,53.523577,-113.522847,"(53.52357681357174, -113.52284716422139)",POINT (-113.52284716422139 53.52357681357174)
|
||||
5570,Windermere,4.81367140098802,53.432342,-113.626688,"(53.432341721819526, -113.62668789063943)",POINT (-113.62668789063943 53.432341721819526)
|
||||
6380,Lambton Industrial,0.638283319327226,53.522269,-113.413848,"(53.52226920949267, -113.41384788948952)",POINT (-113.41384788948952 53.52226920949267)
|
||||
3210,Grovenor,0.920761707499101,53.545399,-113.571912,"(53.54539881342909, -113.57191166581072)",POINT (-113.57191166581072 53.54539881342909)
|
||||
5151,Strathcona Junction,0.58661088910815,53.508200,-113.494690,"(53.508200457290414, -113.49469029434448)",POINT (-113.49469029434448 53.508200457290414)
|
||||
6470,Meyonohk,0.87395405895082,53.455342,-113.457243,"(53.45534180636792, -113.45724258632058)",POINT (-113.45724258632058 53.45534180636792)
|
||||
4469,River's Edge,3.579650265985652,53.452850,-113.644512,"(53.452850088837835, -113.64451163219296)",POINT (-113.64451163219296 53.452850088837835)
|
||||
6100,Coronet Industrial,1.606894556898341,53.493966,-113.478976,"(53.49396620625019, -113.47897563491995)",POINT (-113.47897563491995 53.49396620625019)
|
||||
6170,Davies Industrial West,1.327047461172801,53.498436,-113.450360,"(53.498436167356076, -113.45036037331224)",POINT (-113.45036037331224 53.498436167356076)
|
||||
2530,McLeod,0.966538194175786,53.610353,-113.436671,"(53.61035321319482, -113.43667134683787)",POINT (-113.43667134683787 53.61035321319482)
|
||||
4551,Granville,1.362434305347166,53.504872,-113.682797,"(53.504871648389766, -113.68279691182721)",POINT (-113.68279691182721 53.504871648389766)
|
||||
6441,Maple,1.831668359696365,53.475394,-113.354102,"(53.47539365119583, -113.35410220273556)",POINT (-113.35410220273556 53.47539365119583)
|
||||
1240,Virginia Park,0.507584402021337,53.560888,-113.450297,"(53.56088810350603, -113.45029682958366)",POINT (-113.45029682958366 53.56088810350603)
|
||||
5465,Hays Ridge Area,2.426028944895237,53.417622,-113.577703,"(53.41762228220526, -113.57770281807092)",POINT (-113.57770281807092 53.41762228220526)
|
||||
5010,Allendale,0.883530625783457,53.502277,-113.504821,"(53.502277000041005, -113.50482110987949)",POINT (-113.50482110987949 53.502277000041005)
|
||||
6180,Eastgate Business Park,2.622636823555058,53.534014,-113.406351,"(53.53401374224747, -113.40635118777548)",POINT (-113.40635118777548 53.53401374224747)
|
||||
3381,River Valley Glenora,0.65252104732632,53.542611,-113.549025,"(53.5426113680614, -113.54902509017589)",POINT (-113.54902509017589 53.5426113680614)
|
||||
5530,University of Alberta Farm,2.975900918083887,53.498184,-113.532001,"(53.49818431640077, -113.5320005115689)",POINT (-113.5320005115689 53.49818431640077)
|
||||
5180,Ermineskin,1.2041756266202,53.457639,-113.505728,"(53.45763949070286, -113.50572830529148)",POINT (-113.50572830529148 53.45763949070286)
|
||||
5565,Whitemud Creek Ravine Twin Brooks,1.638763071091558,53.442815,-113.544690,"(53.44281490110788, -113.54468951252323)",POINT (-113.54468951252323 53.44281490110788)
|
||||
6780,Weir Industrial,1.635303075285067,53.511765,-113.406107,"(53.51176506118672, -113.40610727517284)",POINT (-113.40610727517284 53.51176506118672)
|
||||
2080,Belvedere,1.673634118233685,53.591057,-113.436063,"(53.59105689738217, -113.43606293177528)",POINT (-113.43606293177528 53.59105689738217)
|
||||
1080,Delton,0.679807379305538,53.579046,-113.482449,"(53.57904638440942, -113.48244944670745)",POINT (-113.48244944670745 53.57904638440942)
|
||||
4500,Sherwood,0.440696847169342,53.529102,-113.584145,"(53.52910176694538, -113.58414504980918)",POINT (-113.58414504980918 53.52910176694538)
|
||||
3180,Dunluce,2.227151489324126,53.621473,-113.530183,"(53.621472988694656, -113.53018332452554)",POINT (-113.53018332452554 53.621472988694656)
|
||||
6630,River Valley Riverside,1.24936247746906,53.548459,-113.463397,"(53.54845932796029, -113.46339725819846)",POINT (-113.46339725819846 53.54845932796029)
|
||||
5540,Westbrook Estates,1.165428117903053,53.468213,-113.544452,"(53.46821272942084, -113.54445207696077)",POINT (-113.54445207696077 53.46821272942084)
|
||||
1111,Blatchford Area,3.055363632751212,53.571985,-113.516997,"(53.571984893651376, -113.51699744323864)",POINT (-113.51699744323864 53.571984893651376)
|
||||
4210,High Park Industrial,0.388799168963426,53.561040,-113.584248,"(53.56103990718348, -113.58424824276739)",POINT (-113.58424824276739 53.56103990718348)
|
||||
5340,Ramsay Heights,1.310840436857319,53.483368,-113.579034,"(53.48336762348087, -113.57903399186384)",POINT (-113.57903399186384 53.48336762348087)
|
||||
2660,Rundle Heights,0.823977761119664,53.563221,-113.391922,"(53.56322137782017, -113.39192226141765)",POINT (-113.39192226141765 53.56322137782017)
|
||||
4620,Westview Village,0.925300137054925,53.552222,-113.696668,"(53.55222205586075, -113.69666819933443)",POINT (-113.69666819933443 53.55222205586075)
|
||||
1170,Prince Rupert,1.144950067283858,53.564595,-113.524118,"(53.56459450197771, -113.52411765326903)",POINT (-113.52411765326903 53.56459450197771)
|
||||
3280,Lorelei,1.220997386358706,53.624593,-113.504466,"(53.62459274077493, -113.50446576585736)",POINT (-113.50446576585736 53.62459274077493)
|
||||
4011,Anthony Henday,4.752090520005208,53.541110,-113.661515,"(53.54111020661211, -113.66151531556345)",POINT (-113.66151531556345 53.54111020661211)
|
||||
6430,McIntyre Industrial,1.569994078854013,53.490341,-113.454914,"(53.490341069742456, -113.454914297171)",POINT (-113.454914297171 53.490341069742456)
|
||||
6700,Strathcona Industrial Park,2.676954540948096,53.474056,-113.478776,"(53.474056405958414, -113.47877608200726)",POINT (-113.47877608200726 53.474056405958414)
|
||||
2010,Abbottsfield,0.409629052905339,53.574143,-113.388758,"(53.57414343327946, -113.38875800528291)",POINT (-113.38875800528291 53.57414343327946)
|
||||
8889,Crossroads,5.479200468469727,53.352152,-113.558293,"(53.35215195318111, -113.55829298753235)",POINT (-113.55829298753235 53.35215195318111)
|
||||
4560,Thorncliff,0.898130400401212,53.516698,-113.622828,"(53.51669839372241, -113.62282783087267)",POINT (-113.62282783087267 53.51669839372241)
|
||||
6510,Mill Woods Park,0.49042505042778,53.455865,-113.441306,"(53.455865412567505, -113.44130550374629)",POINT (-113.44130550374629 53.455865412567505)
|
||||
6491,Mill Creek Ravine North,0.702994997136022,53.526858,-113.477923,"(53.52685779269116, -113.47792345887649)",POINT (-113.47792345887649 53.52685779269116)
|
||||
1210,Riverdale,1.068523858900188,53.544107,-113.469011,"(53.54410729046791, -113.4690108824121)",POINT (-113.4690108824121 53.54410729046791)
|
||||
3330,Parkview,1.546448280972533,53.524060,-113.567914,"(53.52406036577422, -113.56791414349783)",POINT (-113.56791414349783 53.52406036577422)
|
||||
2320,Hairsine,0.659467116421415,53.603838,-113.390923,"(53.603837718331235, -113.39092316162758)",POINT (-113.39092316162758 53.603837718331235)
|
||||
4050,Bonaventure Industrial,1.27269946912431,53.591525,-113.572160,"(53.591524962604986, -113.57216038894214)",POINT (-113.57216038894214 53.591524962604986)
|
||||
5080,Brander Gardens,1.01668900279815,53.495209,-113.579425,"(53.495209495311215, -113.57942476354563)",POINT (-113.57942476354563 53.495209495311215)
|
||||
2440,Klarvatten,1.656739184526442,53.637224,-113.476665,"(53.63722398137361, -113.47666510945415)",POINT (-113.47666510945415 53.63722398137361)
|
||||
2420,Killarney,1.333083331650945,53.588489,-113.479568,"(53.5884886931544, -113.47956836765157)",POINT (-113.47956836765157 53.5884886931544)
|
||||
3230,Huff Bremner Estate Industrial,1.040644104724615,53.564621,-113.571896,"(53.564620946423375, -113.57189649619323)",POINT (-113.57189649619323 53.564620946423375)
|
||||
5511,Twin Brooks,2.13588948023293,53.444689,-113.531497,"(53.444688598338075, -113.53149747768364)",POINT (-113.53149747768364 53.444688598338075)
|
||||
4310,Meadowlark Park,1.10886690554968,53.525532,-113.596554,"(53.52553194474322, -113.59655415449808)",POINT (-113.59655415449808 53.52553194474322)
|
||||
4478,Pintail Landing,2.124755018790642,53.578414,-113.676519,"(53.57841364003393, -113.67651866190087)",POINT (-113.67651866190087 53.57841364003393)
|
||||
4040,Belmead,1.280632605713771,53.525603,-113.641015,"(53.525602960949286, -113.64101499679995)",POINT (-113.64101499679995 53.525602960949286)
|
||||
4590,West Meadowlark Park,1.117036552300385,53.525605,-113.609059,"(53.52560545214229, -113.60905865145068)",POINT (-113.60905865145068 53.52560545214229)
|
||||
6610,Ritchie,1.270524634311178,53.513275,-113.482742,"(53.513275101362, -113.48274211548578)",POINT (-113.48274211548578 53.513275101362)
|
||||
4070,Callingwood North,0.910734675993302,53.507598,-113.623025,"(53.50759781942617, -113.62302473067683)",POINT (-113.62302473067683 53.50759781942617)
|
||||
6070,Cloverdale,1.09106374108547,53.536858,-113.474012,"(53.53685804851008, -113.47401190482636)",POINT (-113.47401190482636 53.53685804851008)
|
||||
6410,Maple Ridge,0.689267013586553,53.502050,-113.363063,"(53.5020501605512, -113.36306273218038)",POINT (-113.36306273218038 53.5020501605512)
|
||||
2350,Homesteader,1.5778363212289,53.584720,-113.406459,"(53.584720420012744, -113.40645880030745)",POINT (-113.40645880030745 53.584720420012744)
|
||||
4720,Glastonbury,1.772078293117933,53.503187,-113.669870,"(53.5031873362953, -113.66986988320716)",POINT (-113.66986988320716 53.5031873362953)
|
||||
6770,Weinlos,0.916813817852544,53.459907,-113.413836,"(53.459906787317394, -113.4138360275789)",POINT (-113.4138360275789 53.459906787317394)
|
||||
1130,Elmwood Park,0.479573455581107,53.579591,-113.460917,"(53.57959138448323, -113.46091680878322)",POINT (-113.46091680878322 53.57959138448323)
|
||||
6270,Gold Bar,1.044820554344134,53.548908,-113.412004,"(53.548908011823386, -113.41200386812996)",POINT (-113.41200386812996 53.548908011823386)
|
||||
6730,Terrace Heights,0.759785977184646,53.542081,-113.437801,"(53.54208074325996, -113.43780112969927)",POINT (-113.43780112969927 53.54208074325996)
|
||||
5230,Henderson Estates,0.786738852254729,53.467635,-113.597447,"(53.467635236018154, -113.59744728013634)",POINT (-113.59744728013634 53.467635236018154)
|
||||
5470,Steinhauer,0.919831351773305,53.464529,-113.505938,"(53.464528819662604, -113.50593802287744)",POINT (-113.50593802287744 53.464528819662604)
|
||||
4471,Trumpeter Area,2.351191156662921,53.590903,-113.676605,"(53.59090324416165, -113.67660454942941)",POINT (-113.67660454942941 53.59090324416165)
|
||||
4660,Youngstown Industrial,0.483841085642269,53.552476,-113.610588,"(53.5524757447572, -113.61058845726237)",POINT (-113.61058845726237 53.5524757447572)
|
||||
4485,Lewis Farms Industrial,0.764211519960122,53.537548,-113.682864,"(53.53754834040025, -113.6828640973079)",POINT (-113.6828640973079 53.53754834040025)
|
||||
5630,Leger,1.056883484865906,53.457691,-113.577422,"(53.45769067931765, -113.57742198496669)",POINT (-113.57742198496669 53.45769067931765)
|
||||
3440,Westmount,1.864169073065115,53.549995,-113.539976,"(53.54999520578563, -113.53997646884534)",POINT (-113.53997646884534 53.54999520578563)
|
||||
4130,Edmiston Industrial,1.182252872129772,53.565847,-113.632747,"(53.56584736999517, -113.63274685341838)",POINT (-113.63274685341838 53.56584736999517)
|
||||
6320,Idylwylde,0.664832915324334,53.521630,-113.449114,"(53.52162991562302, -113.44911385650465)",POINT (-113.44911385650465 53.52162991562302)
|
||||
5458,Allard,1.629115987478284,53.401301,-113.526641,"(53.40130058621988, -113.5266410946518)",POINT (-113.5266410946518 53.40130058621988)
|
||||
3300,McQueen,0.705743959222537,53.554938,-113.571842,"(53.554938228106195, -113.57184249461682)",POINT (-113.57184249461682 53.554938228106195)
|
||||
5320,Pleasantview,1.480391135816197,53.493176,-113.507131,"(53.49317552747084, -113.50713136307714)",POINT (-113.50713136307714 53.49317552747084)
|
||||
2120,Canon Ridge,0.652771663208156,53.578789,-113.379217,"(53.5787889552352, -113.3792165041167)",POINT (-113.3792165041167 53.5787889552352)
|
||||
5466,Cashman,1.067725615247256,53.417458,-113.500695,"(53.41745757632684, -113.50069470009342)",POINT (-113.50069470009342 53.41745757632684)
|
||||
3470,Carlton,1.206293561655041,53.621652,-113.559373,"(53.62165163543048, -113.55937325047627)",POINT (-113.55937325047627 53.62165163543048)
|
||||
5260,Lansdowne,0.578506256115069,53.486625,-113.545997,"(53.486625462961584, -113.54599669912204)",POINT (-113.54599669912204 53.486625462961584)
|
||||
6214,Ellerslie Industrial,5.867888892163426,53.413984,-113.488153,"(53.4139843472626, -113.4881529665484)",POINT (-113.4881529665484 53.4139843472626)
|
||||
5620,Hodgson,0.691198642461919,53.457673,-113.559807,"(53.45767349895661, -113.5598072004897)",POINT (-113.5598072004897 53.45767349895661)
|
||||
3360,Rampart Industrial,3.632417101744448,53.614087,-113.577900,"(53.614087166875194, -113.57790016807263)",POINT (-113.57790016807263 53.614087166875194)
|
||||
6211,Ellerslie,1.57963741018908,53.428545,-113.457731,"(53.42854540916191, -113.45773137925912)",POINT (-113.45773137925912 53.42854540916191)
|
||||
4540,Terra Losa,0.761299588412995,53.533293,-113.622178,"(53.53329320007971, -113.62217806434573)",POINT (-113.62217806434573 53.53329320007971)
|
||||
5370,River Valley Mayfair,2.347954960178801,53.529565,-113.544179,"(53.52956527496194, -113.54417943380135)",POINT (-113.54417943380135 53.52956527496194)
|
||||
6160,Davies Industrial East,1.634037316508413,53.506189,-113.433139,"(53.50618932070824, -113.4331390974537)",POINT (-113.4331390974537 53.50618932070824)
|
||||
6570,Parsons Industrial,2.627118270761278,53.459795,-113.479382,"(53.45979539100357, -113.47938184219882)",POINT (-113.47938184219882 53.45979539100357)
|
||||
5070,Blue Quill Estates,0.442514108858574,53.457627,-113.540195,"(53.45762655664967, -113.540194987143)",POINT (-113.540194987143 53.45762655664967)
|
||||
6662,Walker,2.634179891009095,53.417651,-113.430435,"(53.41765060558255, -113.43043517232874)",POINT (-113.43043517232874 53.41765060558255)
|
||||
5480,Strathcona,1.563268769144923,53.522390,-113.490986,"(53.52239020329985, -113.4909855535488)",POINT (-113.4909855535488 53.52239020329985)
|
||||
2145,Clareview Town Centre,1.363565958667412,53.601948,-113.406891,"(53.60194780693877, -113.40689125219888)",POINT (-113.40689125219888 53.60194780693877)
|
||||
2100,Beverly Heights,1.384168395311568,53.564122,-113.402652,"(53.56412226688728, -113.40265235200434)",POINT (-113.40265235200434 53.56412226688728)
|
||||
4100,Carleton Square Industrial,0.410191664072682,53.573430,-113.608881,"(53.57343036731518, -113.60888124442805)",POINT (-113.60888124442805 53.57343036731518)
|
||||
4010,Alberta Park Industrial,0.664647762424273,53.566735,-113.596472,"(53.566734885629394, -113.59647151301722)",POINT (-113.59647151301722 53.566734885629394)
|
||||
3111,Griesbach,2.696719591903812,53.606808,-113.504229,"(53.60680836887645, -113.5042291461543)",POINT (-113.5042291461543 53.60680836887645)
|
||||
5100,Bulyea Heights,1.481002795508452,53.474747,-113.569424,"(53.474747116841655, -113.5694240101385)",POINT (-113.5694240101385 53.474747116841655)
|
||||
5463,Desrochers Area,1.176278178616845,53.399672,-113.553023,"(53.39967245522028, -113.55302309853884)",POINT (-113.55302309853884 53.39967245522028)
|
||||
2600,Ozerna,1.119814486754531,53.622275,-113.449024,"(53.622275154794266, -113.44902424999296)",POINT (-113.44902424999296 53.622275154794266)
|
||||
4013,Anthony Henday Terwillegar,3.108871641907852,53.443778,-113.598088,"(53.44377819586291, -113.59808849335425)",POINT (-113.59808849335425 53.44377819586291)
|
||||
6250,Gainer Industrial,0.342464626880759,53.516111,-113.424517,"(53.51611056560108, -113.42451661060224)",POINT (-113.42451661060224 53.51611056560108)
|
||||
6650,Rosedale Industrial,0.455514532627324,53.498545,-113.478829,"(53.498545169674685, -113.47882872215995)",POINT (-113.47882872215995 53.498545169674685)
|
||||
5578,Glenridding Heights,1.579546233024598,53.417599,-113.606660,"(53.41759919038519, -113.60666038260204)",POINT (-113.60666038260204 53.41759919038519)
|
||||
5030,Bearspaw,0.865186270006544,53.443462,-113.500528,"(53.44346178229486, -113.50052801092731)",POINT (-113.50052801092731 53.44346178229486)
|
||||
5310,Parkallen,0.848906409918252,53.503096,-113.517461,"(53.50309581321912, -113.51746134884462)",POINT (-113.51746134884462 53.50309581321912)
|
||||
5405,River Valley Windermere,2.818077783815622,53.436399,-113.636544,"(53.43639892727007, -113.63654392408243)",POINT (-113.63654392408243 53.43639892727007)
|
||||
6668,Meltwater,3.093459330144806,53.415185,-113.405842,"(53.41518464722883, -113.40584157834991)",POINT (-113.40584157834991 53.41518464722883)
|
||||
4440,River Valley Lessard North,0.794198023753486,53.504195,-113.584827,"(53.50419531565392, -113.58482693866749)",POINT (-113.58482693866749 53.50419531565392)
|
||||
6280,Greenview,0.986138079013853,53.475394,-113.427810,"(53.47539385786576, -113.42780973626564)",POINT (-113.42780973626564 53.47539385786576)
|
||||
5469,Paisley,0.653087662643388,53.414010,-113.559273,"(53.4140098320313, -113.55927311996521)",POINT (-113.55927311996521 53.4140098320313)
|
||||
4710,Potter Greens,1.181914250692207,53.518279,-113.672600,"(53.51827868887517, -113.6726003231069)",POINT (-113.6726003231069 53.51827868887517)
|
||||
6443,Tamarack,2.545319645151152,53.464811,-113.359165,"(53.464810648262834, -113.3591650787877)",POINT (-113.3591650787877 53.464810648262834)
|
||||
5300,Ogilvie Ridge,0.523555682998997,53.464904,-113.567069,"(53.46490391645047, -113.56706908565178)",POINT (-113.56706908565178 53.46490391645047)
|
||||
4160,Gariepy,0.679194206597726,53.493596,-113.622657,"(53.49359649611536, -113.6226568962673)",POINT (-113.6226568962673 53.49359649611536)
|
||||
4473,Hawks Ridge,1.483265831948296,53.588457,-113.701466,"(53.58845698097355, -113.70146644240913)",POINT (-113.70146644240913 53.58845698097355)
|
||||
5460,Skyrattler,0.617907437790283,53.450330,-113.522874,"(53.450329993722676, -113.5228735177531)",POINT (-113.5228735177531 53.450329993722676)
|
||||
6670,Sakaw,1.108371845386323,53.441980,-113.428828,"(53.44197993208675, -113.42882827241682)",POINT (-113.42882827241682 53.44197993208675)
|
||||
4190,Hawin Park Estate Industrial,0.678200058561271,53.574851,-113.596574,"(53.57485072697918, -113.59657383692269)",POINT (-113.59657383692269 53.57485072697918)
|
||||
6492,Mill Creek Ravine South,0.758176365700222,53.507712,-113.464836,"(53.50771159442151, -113.46483608309812)",POINT (-113.46483608309812 53.50771159442151)
|
||||
5290,McKernan,0.87828916483086,53.512759,-113.520442,"(53.51275883935857, -113.52044221101723)",POINT (-113.52044221101723 53.51275883935857)
|
||||
5350,Rhatigan Ridge,1.344077493548064,53.474506,-113.587569,"(53.47450614555052, -113.58756912095251)",POINT (-113.58756912095251 53.47450614555052)
|
||||
5467,Cavanagh,1.939933667628725,53.405981,-113.512019,"(53.4059814953449, -113.51201888482001)",POINT (-113.51201888482001 53.4059814953449)
|
||||
1230,Spruce Avenue,1.214704567631179,53.564635,-113.499502,"(53.56463543349929, -113.49950159270514)",POINT (-113.49950159270514 53.56463543349929)
|
||||
4150,Gagnon Estate Industrial,0.556683158930596,53.580184,-113.585795,"(53.580184173448046, -113.58579493914254)",POINT (-113.58579493914254 53.580184173448046)
|
||||
3040,Beaumaris,1.439972265297033,53.618422,-113.505007,"(53.61842233825658, -113.50500707158315)",POINT (-113.50500707158315 53.61842233825658)
|
||||
4490,Sheffield Industrial,0.379683801081438,53.560816,-113.596596,"(53.56081597064499, -113.59659572026173)",POINT (-113.59659572026173 53.56081597064499)
|
||||
2390,Kernohan,0.891282134559138,53.589400,-113.380164,"(53.589399782126065, -113.3801643112191)",POINT (-113.3801643112191 53.589399782126065)
|
||||
2640,River Valley Highlands,1.188119952510165,53.560070,-113.436175,"(53.56006960866, -113.43617530896526)",POINT (-113.43617530896526 53.56006960866)
|
||||
5250,Keheewin,1.265768596245789,53.450243,-113.504513,"(53.45024253042074, -113.50451286886053)",POINT (-113.50451286886053 53.45024253042074)
|
||||
4110,Dechene,0.72424653334622,53.490436,-113.635953,"(53.49043609387975, -113.6359530507595)",POINT (-113.6359530507595 53.49043609387975)
|
||||
2541,Miller,0.826832847929878,53.611544,-113.411106,"(53.61154400692141, -113.41110627437439)",POINT (-113.41110627437439 53.61154400692141)
|
||||
3250,Kensington,1.325383324456586,53.595863,-113.528924,"(53.595862607025026, -113.52892377487876)",POINT (-113.52892377487876 53.595862607025026)
|
||||
6760,Tweddle Place,1.119256247206384,53.478370,-113.459160,"(53.47836951514998, -113.45916009578747)",POINT (-113.45916009578747 53.47836951514998)
|
||||
2090,Bergman,0.708336995880537,53.579564,-113.409667,"(53.57956358670845, -113.40966725276705)",POINT (-113.40966725276705 53.57956358670845)
|
||||
4170,Garside Industrial,0.66448814717068,53.566750,-113.584178,"(53.56674982075394, -113.58417782455811)",POINT (-113.58417782455811 53.56674982075394)
|
||||
2580,Northmount,1.224062087009089,53.603205,-113.479629,"(53.60320534682862, -113.47962880470851)",POINT (-113.47962880470851 53.60320534682862)
|
||||
2462,Crystallina Nera East,0.848925143204101,53.640582,-113.447505,"(53.64058185672155, -113.44750486480594)",POINT (-113.44750486480594 53.64058185672155)
|
||||
5280,Malmo Plains,0.940940755709304,53.485677,-113.528992,"(53.48567699323439, -113.52899210578676)",POINT (-113.52899210578676 53.48567699323439)
|
||||
2463,Crystallina Nera West,0.85699728184105,53.640311,-113.459200,"(53.64031050897715, -113.45919996932167)",POINT (-113.45919996932167 53.64031050897715)
|
||||
1200,River Valley Victoria,1.299088107881249,53.534997,-113.523696,"(53.53499679217865, -113.52369571038119)",POINT (-113.52369571038119 53.53499679217865)
|
||||
1010,Alberta Avenue,1.680470641516226,53.568485,-113.485119,"(53.568485381370216, -113.48511916939452)",POINT (-113.48511916939452 53.568485381370216)
|
||||
4220,Jamieson Place,1.08307951945349,53.488707,-113.649020,"(53.48870738325546, -113.64901968121586)",POINT (-113.64901968121586 53.48870738325546)
|
||||
3290,McArthur Industrial,0.574668321226253,53.594324,-113.564262,"(53.59432400129637, -113.5642624352912)",POINT (-113.5642624352912 53.59432400129637)
|
||||
5170,Empire Park,1.072123627388029,53.484366,-113.505859,"(53.484366264270875, -113.50585873132425)",POINT (-113.50585873132425 53.484366264270875)
|
||||
4580,West Jasper Place,0.890709247293632,53.536630,-113.584144,"(53.53662987117308, -113.58414434574873)",POINT (-113.58414434574873 53.53662987117308)
|
||||
6010,Argyll,0.359053775923155,53.503101,-113.460539,"(53.503100775120004, -113.46053882474749)",POINT (-113.46053882474749 53.503100775120004)
|
||||
2690,Rural North East South Sturgeon,14.12583006126562,53.618981,-113.316141,"(53.61898141939035, -113.31614073170843)",POINT (-113.31614073170843 53.61898141939035)
|
||||
3480,Hudson,0.7361033299688,53.604587,-113.553396,"(53.604587411333966, -113.5533957565913)",POINT (-113.5533957565913 53.604587411333966)
|
||||
1020,Boyle Street,0.881354792689838,53.547631,-113.479263,"(53.54763104592711, -113.47926288088948)",POINT (-113.47926288088948 53.54763104592711)
|
||||
6750,Tipaskan,0.804292166886575,53.461895,-113.458000,"(53.46189538282228, -113.45799986563976)",POINT (-113.45799986563976 53.46189538282228)
|
||||
5390,River Valley Walterdale,1.487437753938043,53.530575,-113.519754,"(53.53057521791498, -113.51975395559765)",POINT (-113.51975395559765 53.53057521791498)
|
||||
4700,Breckenridge Greens,0.565266216608123,53.516526,-113.684351,"(53.516525721975796, -113.68435099579185)",POINT (-113.68435099579185 53.516525721975796)
|
||||
5380,River Valley Terwillegar,3.077820695538355,53.476838,-113.612570,"(53.476837905414634, -113.61256966985235)",POINT (-113.61256966985235 53.476837905414634)
|
||||
4023,Anthony Henday Rampart,3.139576309394741,53.627497,-113.576374,"(53.62749699081316, -113.5763739596066)",POINT (-113.5763739596066 53.62749699081316)
|
||||
6720,Tawa,0.66465037556121,53.461933,-113.427712,"(53.46193293968521, -113.42771213060817)",POINT (-113.42771213060817 53.46193293968521)
|
||||
5401,River Valley Fort Edmonton,0.990626207439228,53.500911,-113.581031,"(53.50091068693929, -113.58103079402326)",POINT (-113.58103079402326 53.50091068693929)
|
||||
5490,Sweet Grass,0.917071718248954,53.464316,-113.527569,"(53.464315902695475, -113.52756884433359)",POINT (-113.52756884433359 53.464315902695475)
|
||||
5590,Blackburne,0.726415344610597,53.429071,-113.498309,"(53.42907132874183, -113.49830890626279)",POINT (-113.49830890626279 53.42907132874183)
|
||||
3370,Rapperswill,0.997468322502905,53.635411,-113.535029,"(53.635410932289524, -113.53502943713653)",POINT (-113.53502943713653 53.635410932289524)
|
||||
3310,North Glenora,0.86676697998386,53.554941,-113.558265,"(53.5549408887816, -113.55826514910287)",POINT (-113.55826514910287 53.5549408887816)
|
||||
5270,Lendrum Place,0.859009438496261,53.493200,-113.522806,"(53.49320004433957, -113.52280579656217)",POINT (-113.52280579656217 53.49320004433957)
|
||||
5642,South Terwillegar,1.742841276980885,53.440247,-113.579024,"(53.44024696928342, -113.57902407054075)",POINT (-113.57902407054075 53.44024696928342)
|
||||
3390,Rosslyn,1.342960459285358,53.595758,-113.504287,"(53.59575774027457, -113.50428716133167)",POINT (-113.50428716133167 53.59575774027457)
|
||||
2280,Fraser,1.293742300293517,53.611114,-113.373670,"(53.611113791940525, -113.37366969834983)",POINT (-113.37366969834983 53.611113791940525)
|
||||
1270,Yellowhead Corridor East,1.430517677414313,53.579205,-113.451964,"(53.579205367028734, -113.45196418798517)",POINT (-113.45196418798517 53.579205367028734)
|
||||
6450,Menisa,0.904862433771194,53.442056,-113.447379,"(53.442056300744994, -113.44737900912975)",POINT (-113.44737900912975 53.442056300744994)
|
||||
4014,Anthony Henday South,2.713143887250248,53.432209,-113.547667,"(53.43220884258119, -113.54766664564085)",POINT (-113.54766664564085 53.43220884258119)
|
||||
2241,Eaux Claires,1.286201010589534,53.621639,-113.485637,"(53.6216388347344, -113.48563719272002)",POINT (-113.48563719272002 53.6216388347344)
|
||||
2060,Bellevue,0.513748098155138,53.566417,-113.445942,"(53.56641743646995, -113.44594247138558)",POINT (-113.44594247138558 53.56641743646995)
|
||||
3200,Glenora,1.62164008473267,53.544905,-113.557043,"(53.544904705240754, -113.55704251222033)",POINT (-113.55704251222033 53.544904705240754)
|
||||
1151,Wîhkwêntôwin,1.707826564554529,53.541983,-113.523994,"(53.54198293050736, -113.52399393494247)",POINT (-113.52399393494247 53.54198293050736)
|
||||
4610,Westridge,0.730589446825557,53.505622,-113.601372,"(53.50562209269329, -113.60137155550291)",POINT (-113.60137155550291 53.50562209269329)
|
||||
6560,Papaschase Industrial,1.238036999533014,53.484285,-113.478646,"(53.484285034295155, -113.47864585672285)",POINT (-113.47864585672285 53.484285034295155)
|
||||
2130,Casselman,0.840373375380155,53.611349,-113.424132,"(53.61134852932065, -113.42413210059294)",POINT (-113.42413210059294 53.61134852932065)
|
||||
6550,Ottewell,2.584237291497738,53.531285,-113.430746,"(53.531285183984444, -113.43074600678096)",POINT (-113.43074600678096 53.531285183984444)
|
||||
4300,McNamara Industrial,0.978108409581068,53.554078,-113.621277,"(53.55407815098212, -113.62127738552252)",POINT (-113.62127738552252 53.55407815098212)
|
||||
3320,Oxford,1.184043972586629,53.622198,-113.547292,"(53.62219780043192, -113.54729168143149)",POINT (-113.54729168143149 53.62219780043192)
|
||||
1120,Edmonton Northlands,0.752913522510896,53.568372,-113.456446,"(53.56837201419023, -113.45644612048426)",POINT (-113.45644612048426 53.56837201419023)
|
||||
4380,Ormsby Place,1.350360597376734,53.499106,-113.642761,"(53.49910557146923, -113.64276057125781)",POINT (-113.64276057125781 53.49910557146923)
|
||||
4740,Webber Greens,1.131588067240724,53.530310,-113.676608,"(53.53030969388328, -113.67660757308009)",POINT (-113.67660757308009 53.53030969388328)
|
||||
6230,Forest Heights,1.62730717553125,53.544537,-113.451250,"(53.5445370725994, -113.45125000590636)",POINT (-113.45125000590636 53.5445370725994)
|
||||
8886,Edmonton South East,13.192426052522146,53.381303,-113.376823,"(53.38130266678533, -113.37682343753188)",POINT (-113.37682343753188 53.38130266678533)
|
||||
5550,Whitemud Creek Ravine North,0.752649648172588,53.486798,-113.556604,"(53.48679813435263, -113.556604326397)",POINT (-113.556604326397 53.48679813435263)
|
||||
2430,Kirkness,0.924726573366705,53.611416,-113.388399,"(53.611416204824735, -113.38839885136557)",POINT (-113.38839885136557 53.611416204824735)
|
||||
4474,Starling,1.410672718936346,53.592278,-113.657816,"(53.592278137022475, -113.65781577781112)",POINT (-113.65781577781112 53.592278137022475)
|
||||
5574,Keswick,3.30592950260323,53.417587,-113.632212,"(53.41758706862364, -113.63221244612657)",POINT (-113.63221244612657 53.41758706862364)
|
||||
3240,Inglewood,1.649850716255548,53.564606,-113.540852,"(53.56460646699409, -113.54085217126553)",POINT (-113.54085217126553 53.56460646699409)
|
||||
6040,Bonnie Doon,1.50085440456073,53.525337,-113.467111,"(53.52533712511544, -113.46711141152339)",POINT (-113.46711141152339 53.52533712511544)
|
||||
3080,Canossa,1.29859082246136,53.636192,-113.522686,"(53.636192230399715, -113.5226863308244)",POINT (-113.5226863308244 53.636192230399715)
|
||||
2650,River Valley Rundle,2.111673808422213,53.555592,-113.386939,"(53.555592464509914, -113.3869387232612)",POINT (-113.3869387232612 53.555592464509914)
|
||||
1220,Rossdale,0.903138285713254,53.533155,-113.495797,"(53.53315473446558, -113.49579654462286)",POINT (-113.49579654462286 53.53315473446558)
|
||||
3270,Laurier Heights,1.32582651423711,53.514255,-113.569332,"(53.51425496966398, -113.56933192828389)",POINT (-113.56933192828389 53.51425496966398)
|
||||
5220,Greenfield,1.52988725674612,53.471073,-113.527505,"(53.47107265311551, -113.52750541724342)",POINT (-113.52750541724342 53.47107265311551)
|
||||
2110,Brintnell,1.409562392854378,53.621394,-113.407114,"(53.621394396676344, -113.40711431891364)",POINT (-113.40711431891364 53.621394396676344)
|
||||
6620,River Valley Gold Bar,2.070695423378183,53.552270,-113.437568,"(53.55227007401804, -113.43756822098467)",POINT (-113.43756822098467 53.55227007401804)
|
||||
6020,Avonmore,0.897092920253522,53.507780,-113.451631,"(53.50777958181948, -113.45163097798653)",POINT (-113.45163097798653 53.50777958181948)
|
||||
6061,Capilano,1.306281071349033,53.554672,-113.422792,"(53.55467208922095, -113.42279236815314)",POINT (-113.42279236815314 53.55467208922095)
|
||||
3010,Athlone,1.193230563457154,53.588026,-113.550982,"(53.58802604242831, -113.55098211995585)",POINT (-113.55098211995585 53.58802604242831)
|
||||
5572,River Valley Keswick,0.553769794919431,53.416533,-113.654081,"(53.41653293864678, -113.65408106228833)",POINT (-113.65408106228833 53.41653293864678)
|
||||
2020,Balwin,1.402658894591748,53.587951,-113.455075,"(53.58795101014664, -113.455075346126)",POINT (-113.455075346126 53.58795101014664)
|
||||
3020,Baranow,0.794804822123919,53.605145,-113.535873,"(53.60514463104835, -113.53587266453894)",POINT (-113.53587266453894 53.60514463104835)
|
||||
1250,Westwood,0.98300728937668,53.575942,-113.498585,"(53.575942355230865, -113.49858458554775)",POINT (-113.49858458554775 53.575942355230865)
|
||||
6663,Decoteau,12.715309610157604,53.410339,-113.369086,"(53.410338845277394, -113.36908560883388)",POINT (-113.36908560883388 53.410338845277394)
|
||||
4462,Edgemont,4.25866703622476,53.469743,-113.670843,"(53.46974341660044, -113.67084271935684)",POINT (-113.67084271935684 53.46974341660044)
|
||||
5640,Terwillegar Towne,1.869542027234684,53.450670,-113.577738,"(53.450670254858366, -113.57773843364404)",POINT (-113.57773843364404 53.450670254858366)
|
||||
6150,Daly Grove,0.94773036680816,53.449537,-113.400727,"(53.449536501347374, -113.40072733186688)",POINT (-113.40072733186688 53.449536501347374)
|
||||
2070,Belmont,1.26327681000036,53.593124,-113.394379,"(53.59312408343794, -113.39437923875707)",POINT (-113.39437923875707 53.59312408343794)
|
||||
4240,La Perle,1.335331771126482,53.533088,-113.640709,"(53.533087545724655, -113.64070859781111)",POINT (-113.64070859781111 53.533087545724655)
|
||||
4463,Riverview Area,10.27623044975532,53.425065,-113.663977,"(53.42506456427833, -113.6639766862537)",POINT (-113.6639766862537 53.42506456427833)
|
||||
4670,Winterburn Industrial Area West,4.340206442652494,53.562804,-113.701391,"(53.56280361434664, -113.70139052289608)",POINT (-113.70139052289608 53.56280361434664)
|
||||
3450,Woodcroft,1.291674751398103,53.564595,-113.558327,"(53.56459542426348, -113.55832687208344)",POINT (-113.55832687208344 53.56459542426348)
|
||||
4467,River Valley Cameron,2.026058763988396,53.472357,-113.616077,"(53.47235679364354, -113.61607674144759)",POINT (-113.61607674144759 53.47235679364354)
|
||||
5430,Royal Gardens,1.218698945582124,53.479419,-113.528055,"(53.47941921545693, -113.52805526262651)",POINT (-113.52805526262651 53.47941921545693)
|
||||
2410,Kilkenny,1.749930587458829,53.610378,-113.455119,"(53.610377929359544, -113.45511917442329)",POINT (-113.45511917442329 53.610377929359544)
|
||||
4477,Kinglet Gardens,2.637131157997343,53.577379,-113.701417,"(53.577379047227296, -113.70141745981881)",POINT (-113.70141745981881 53.577379047227296)
|
||||
5477,Mactaggart,1.039495312368636,53.437903,-113.561047,"(53.437903117432406, -113.56104656101327)",POINT (-113.56104656101327 53.437903117432406)
|
||||
2311,Gorman,2.910991671377345,53.623225,-113.387721,"(53.62322452305202, -113.38772109480703)",POINT (-113.38772109480703 53.62322452305202)
|
||||
4030,Armstrong Industrial,1.113634722171782,53.565863,-113.621263,"(53.56586317129349, -113.6212631985515)",POINT (-113.6212631985515 53.56586317129349)
|
||||
3030,Baturyn,1.406218562041487,53.630980,-113.504339,"(53.63097982527694, -113.50433944798633)",POINT (-113.50433944798633 53.63097982527694)
|
||||
2692,Quarry Ridge,1.327315064480258,53.622492,-113.339616,"(53.62249178672573, -113.33961645236101)",POINT (-113.33961645236101 53.62249178672573)
|
||||
6680,Satoo,1.312641926054348,53.446373,-113.458892,"(53.44637282792394, -113.45889160751477)",POINT (-113.45889160751477 53.44637282792394)
|
||||
1280,Yellowhead Corridor West,1.164879217383636,53.582841,-113.512730,"(53.58284074809834, -113.51272950704035)",POINT (-113.51272950704035 53.58284074809834)
|
||||
5505,Ambleside,3.15361413455395,53.430641,-113.600677,"(53.43064140009593, -113.6006766240175)",POINT (-113.6006766240175 53.43064140009593)
|
||||
3220,Hagmann Estate Industrial,0.527761812515333,53.582176,-113.544951,"(53.58217611123088, -113.54495102363569)",POINT (-113.54495102363569 53.58217611123088)
|
||||
6310,Holyrood,1.285449464940904,53.531361,-113.450190,"(53.531360581789265, -113.45018981983952)",POINT (-113.45018981983952 53.531360581789265)
|
||||
6480,Michaels Park,0.832030297267008,53.479575,-113.446214,"(53.47957488804893, -113.44621358088335)",POINT (-113.44621358088335 53.47957488804893)
|
||||
2260,Evansdale,1.56806665522178,53.610841,-113.479569,"(53.61084111037154, -113.47956893162089)",POINT (-113.47956893162089 53.61084111037154)
|
||||
5468,Graydon Hill,0.658965445200147,53.421257,-113.559297,"(53.421257265220234, -113.55929691911105)",POINT (-113.55929691911105 53.421257265220234)
|
||||
3460,Albany,0.84331219645051,53.632382,-113.549464,"(53.6323821398393, -113.5494643322466)",POINT (-113.5494643322466 53.6323821398393)
|
||||
5190,Falconer Heights,0.650282755402676,53.466721,-113.588524,"(53.46672055024967, -113.58852370186142)",POINT (-113.58852370186142 53.46672055024967)
|
||||
1100,Eastwood,1.13189315270677,53.576105,-113.468730,"(53.576104614724045, -113.46873040170777)",POINT (-113.46873040170777 53.576104614724045)
|
||||
2550,Montrose,1.31040802434787,53.575116,-113.442230,"(53.575116228996094, -113.44223031309009)",POINT (-113.44223031309009 53.575116228996094)
|
||||
5579,Glenridding Ravine,2.205910158765966,53.410316,-113.602586,"(53.41031569982683, -113.60258617187458)",POINT (-113.60258617187458 53.41031569982683)
|
||||
4016,Anthony Henday Castledowns,2.036767336595548,53.643298,-113.533361,"(53.64329774856772, -113.53336139641686)",POINT (-113.53336139641686 53.64329774856772)
|
||||
4350,Norwester Industrial,0.688147620319065,53.566738,-113.608884,"(53.56673770420897, -113.60888372767698)",POINT (-113.60888372767698 53.56673770420897)
|
||||
4630,White Industrial,1.925728623434184,53.564715,-113.648618,"(53.564714562357935, -113.64861763741831)",POINT (-113.64861763741831 53.564714562357935)
|
||||
4750,Rosenthal,2.653889637340257,53.519753,-113.701210,"(53.51975263330063, -113.70120995113002)",POINT (-113.70120995113002 53.51975263330063)
|
||||
5040,Belgravia,0.867544804949854,53.511796,-113.532729,"(53.51179560303294, -113.53272944431215)",POINT (-113.53272944431215 53.51179560303294)
|
||||
4200,High Park,0.719230104619998,53.554986,-113.584199,"(53.55498578225787, -113.5841992583502)",POINT (-113.5841992583502 53.55498578225787)
|
||||
2700,Schonsee,1.23764181115058,53.632362,-113.455146,"(53.63236248729287, -113.45514587942287)",POINT (-113.45514587942287 53.63236248729287)
|
||||
2050,Belle Rive,1.173443116024926,53.622300,-113.473596,"(53.62230017573994, -113.47359649235716)",POINT (-113.47359649235716 53.62230017573994)
|
||||
2671,Marquis,10.069635408721915,53.650586,-113.325964,"(53.65058566615271, -113.32596417109045)",POINT (-113.32596417109045 53.65058566615271)
|
||||
6790,Wild Rose,1.772290006674193,53.470564,-113.381167,"(53.47056409010199, -113.38116723880054)",POINT (-113.38116723880054 53.47056409010199)
|
||||
5464,Heritage Valley Town Centre,1.16572921527542,53.406308,-113.543990,"(53.406307783628264, -113.54399048481031)",POINT (-113.54399048481031 53.406307783628264)
|
||||
6640,Roper Industrial,2.948900525692627,53.495800,-113.430431,"(53.495800246566475, -113.43043074542231)",POINT (-113.43043074542231 53.495800246566475)
|
||||
5210,Grandview Heights,0.561883381291845,53.501165,-113.548910,"(53.501164827865296, -113.54891011910658)",POINT (-113.54891011910658 53.501164827865296)
|
||||
2522,McConachie,2.609318542386035,53.636453,-113.431313,"(53.636453048288004, -113.43131250554053)",POINT (-113.43131250554053 53.636453048288004)
|
||||
5200,Garneau,0.828997240358,53.519911,-113.513536,"(53.519910825386674, -113.51353555933932)",POINT (-113.51353555933932 53.519910825386674)
|
||||
6370,Kiniski Gardens,1.959489639730589,53.475924,-113.403303,"(53.47592374884991, -113.40330287730555)",POINT (-113.40330287730555 53.47592374884991)
|
||||
|
File diff suppressed because one or more lines are too long
248
map/data/convert_edmonton_optimized.js
Normal file
248
map/data/convert_edmonton_optimized.js
Normal file
@ -0,0 +1,248 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const fs = require('fs');
|
||||
const Papa = require('papaparse');
|
||||
const path = require('path');
|
||||
|
||||
// Input and output file paths
|
||||
const INPUT_FILE = '/mnt/storagessd1tb/changemaker.lite.dev/changemaker.lite/map/data/City_of_Edmonton_-_Neighbourhoods_20250807.csv';
|
||||
const OUTPUT_FILE = path.join(path.dirname(INPUT_FILE), 'edmonton_nocodb_optimized.csv');
|
||||
|
||||
// Function to convert WKT MultiPolygon to GeoJSON with optimized precision
|
||||
function wktToGeoJSON(wkt, precision = 7) {
|
||||
if (!wkt || typeof wkt !== 'string') return null;
|
||||
|
||||
let coords = wkt.replace('MULTIPOLYGON ', '').trim();
|
||||
coords = coords.slice(1, -1);
|
||||
|
||||
const polygons = [];
|
||||
let currentPolygon = [];
|
||||
let currentRing = [];
|
||||
let depth = 0;
|
||||
let currentCoord = '';
|
||||
|
||||
for (let i = 0; i < coords.length; i++) {
|
||||
const char = coords[i];
|
||||
|
||||
if (char === '(') {
|
||||
depth++;
|
||||
if (depth === 2) currentRing = [];
|
||||
} else if (char === ')') {
|
||||
if (depth === 2) {
|
||||
if (currentCoord.trim()) {
|
||||
let [lon, lat] = currentCoord.trim().split(' ').map(Number);
|
||||
// Reduce precision (7 decimals = ~1cm accuracy)
|
||||
const multiplier = Math.pow(10, precision);
|
||||
lon = Math.round(lon * multiplier) / multiplier;
|
||||
lat = Math.round(lat * multiplier) / multiplier;
|
||||
currentRing.push([lon, lat]);
|
||||
currentCoord = '';
|
||||
}
|
||||
currentPolygon.push(currentRing);
|
||||
} else if (depth === 1) {
|
||||
polygons.push(currentPolygon);
|
||||
currentPolygon = [];
|
||||
}
|
||||
depth--;
|
||||
} else if (char === ',') {
|
||||
if (depth === 2 && currentCoord.trim()) {
|
||||
let [lon, lat] = currentCoord.trim().split(' ').map(Number);
|
||||
const multiplier = Math.pow(10, precision);
|
||||
lon = Math.round(lon * multiplier) / multiplier;
|
||||
lat = Math.round(lat * multiplier) / multiplier;
|
||||
currentRing.push([lon, lat]);
|
||||
currentCoord = '';
|
||||
}
|
||||
} else if (char !== ' ' || currentCoord.trim()) {
|
||||
currentCoord += char;
|
||||
}
|
||||
}
|
||||
|
||||
return polygons.length === 1
|
||||
? { type: "Polygon", coordinates: polygons[0] }
|
||||
: { type: "MultiPolygon", coordinates: polygons };
|
||||
}
|
||||
|
||||
// Smart polygon simplification - only remove redundant points
|
||||
function smartSimplify(coordinates, maxPoints = 500) {
|
||||
return coordinates.map(ring => {
|
||||
if (ring.length <= maxPoints) return ring;
|
||||
|
||||
// Calculate step to evenly sample points
|
||||
const step = ring.length / maxPoints;
|
||||
const simplified = [];
|
||||
|
||||
for (let i = 0; i < maxPoints - 1; i++) {
|
||||
const index = Math.floor(i * step);
|
||||
simplified.push(ring[index]);
|
||||
}
|
||||
|
||||
// Always include the last point to close the polygon
|
||||
simplified.push(ring[ring.length - 1]);
|
||||
|
||||
return simplified;
|
||||
});
|
||||
}
|
||||
|
||||
// Function to calculate bounds from GeoJSON
|
||||
function calculateBounds(geoJSON) {
|
||||
if (!geoJSON) return null;
|
||||
|
||||
let minLat = Infinity, maxLat = -Infinity;
|
||||
let minLon = Infinity, maxLon = -Infinity;
|
||||
|
||||
function processCoords(coords) {
|
||||
if (Array.isArray(coords[0]) && Array.isArray(coords[0][0])) {
|
||||
coords.forEach(processCoords);
|
||||
} else if (Array.isArray(coords[0]) && typeof coords[0][0] === 'number') {
|
||||
coords.forEach(([lon, lat]) => {
|
||||
minLat = Math.min(minLat, lat);
|
||||
maxLat = Math.max(maxLat, lat);
|
||||
minLon = Math.min(minLon, lon);
|
||||
maxLon = Math.max(maxLon, lon);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
processCoords(geoJSON.coordinates);
|
||||
return `[[${minLat.toFixed(7)},${minLon.toFixed(7)}],[${maxLat.toFixed(7)},${maxLon.toFixed(7)}]]`;
|
||||
}
|
||||
|
||||
// Compact JSON stringify (no extra whitespace)
|
||||
function compactStringify(obj) {
|
||||
return JSON.stringify(obj, null, 0);
|
||||
}
|
||||
|
||||
// Main conversion function
|
||||
function convertCSV() {
|
||||
console.log('📁 Reading file:', INPUT_FILE);
|
||||
|
||||
// Read the CSV file
|
||||
const csvData = fs.readFileSync(INPUT_FILE, 'utf8');
|
||||
|
||||
console.log('📊 Parsing CSV...');
|
||||
|
||||
// Parse the CSV
|
||||
const parsed = Papa.parse(csvData, {
|
||||
header: true,
|
||||
dynamicTyping: true,
|
||||
skipEmptyLines: true
|
||||
});
|
||||
|
||||
console.log(`✅ Found ${parsed.data.length} neighbourhoods to convert`);
|
||||
console.log('🎯 Optimizing precision for NocoDB (100k char limit)...\n');
|
||||
|
||||
// Get current timestamp
|
||||
const now = new Date();
|
||||
const timestamp = now.toISOString().replace('T', ' ').replace('Z', '+00:00').slice(0, -7) + '+00:00';
|
||||
|
||||
const stats = {
|
||||
totalRows: 0,
|
||||
optimizedRows: 0,
|
||||
simplifiedRows: 0,
|
||||
precision7: 0,
|
||||
precision6: 0,
|
||||
precision5: 0
|
||||
};
|
||||
|
||||
// Convert each row
|
||||
const convertedData = parsed.data.map((row, index) => {
|
||||
if ((index + 1) % 50 === 0) {
|
||||
console.log(` Converting... ${index + 1}/${parsed.data.length}`);
|
||||
}
|
||||
|
||||
stats.totalRows++;
|
||||
|
||||
// Start with 7 decimal precision (~1cm accuracy)
|
||||
let geoJSON = wktToGeoJSON(row['Geometry Multipolygon'], 7);
|
||||
let geoJSONString = geoJSON ? compactStringify(geoJSON) : '';
|
||||
|
||||
// If still too large, try 6 decimals (~10cm accuracy)
|
||||
if (geoJSONString.length > 99000) {
|
||||
stats.precision7++;
|
||||
geoJSON = wktToGeoJSON(row['Geometry Multipolygon'], 6);
|
||||
geoJSONString = compactStringify(geoJSON);
|
||||
|
||||
// If still too large, try 5 decimals (~1m accuracy)
|
||||
if (geoJSONString.length > 99000) {
|
||||
stats.precision6++;
|
||||
geoJSON = wktToGeoJSON(row['Geometry Multipolygon'], 5);
|
||||
geoJSONString = compactStringify(geoJSON);
|
||||
|
||||
// If STILL too large, simplify points
|
||||
if (geoJSONString.length > 99000) {
|
||||
stats.precision5++;
|
||||
const originalPoints = JSON.stringify(geoJSON).length;
|
||||
|
||||
if (geoJSON.type === 'Polygon') {
|
||||
geoJSON.coordinates = smartSimplify(geoJSON.coordinates);
|
||||
} else if (geoJSON.type === 'MultiPolygon') {
|
||||
geoJSON.coordinates = geoJSON.coordinates.map(polygon =>
|
||||
smartSimplify(polygon)
|
||||
);
|
||||
}
|
||||
|
||||
geoJSONString = compactStringify(geoJSON);
|
||||
stats.simplifiedRows++;
|
||||
|
||||
console.log(` ⚠️ ${row['Neighbourhood Name']}: Simplified from ${originalPoints} to ${geoJSONString.length} chars`);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
stats.optimizedRows++;
|
||||
}
|
||||
|
||||
// Create enhanced description with ward information
|
||||
let description = '';
|
||||
if (row['Civic Ward']) {
|
||||
description += `Ward: ${row['Civic Ward']}\n\n`;
|
||||
}
|
||||
if (row['Description']) {
|
||||
description += row['Description'];
|
||||
}
|
||||
|
||||
return {
|
||||
'ID': index + 1,
|
||||
'CreatedAt': timestamp,
|
||||
'UpdatedAt': timestamp,
|
||||
'Name': row['Neighbourhood Name'] || '',
|
||||
'Description': description.substring(0, 5000),
|
||||
'Color': '#3388ff',
|
||||
'Opacity': 0.7,
|
||||
'Category': 'Neighborhood',
|
||||
'PublicVisibility': true,
|
||||
'OfficialCut': true,
|
||||
'GeoJSONData': geoJSONString,
|
||||
'Bounds': calculateBounds(geoJSON),
|
||||
'CreatedBy': 'City of Edmonton',
|
||||
'CreatedAtDate': row['Effective Start Date'] || null,
|
||||
'UpdatedAtDate': timestamp
|
||||
};
|
||||
});
|
||||
|
||||
console.log('\n📝 Converting to CSV format...');
|
||||
|
||||
// Convert back to CSV
|
||||
const outputCSV = Papa.unparse(convertedData);
|
||||
|
||||
// Write the file
|
||||
fs.writeFileSync(OUTPUT_FILE, outputCSV);
|
||||
|
||||
const fileSizeMB = (Buffer.byteLength(outputCSV) / 1024 / 1024).toFixed(2);
|
||||
|
||||
console.log('\n✨ Conversion complete!');
|
||||
console.log('══════════════════════════════════════════════════════════');
|
||||
console.log(`📊 Total neighbourhoods: ${stats.totalRows}`);
|
||||
console.log(`✅ Optimized with 7 decimals (1cm): ${stats.optimizedRows}`);
|
||||
console.log(`📉 Reduced to 6 decimals (10cm): ${stats.precision7}`);
|
||||
console.log(`📉 Reduced to 5 decimals (1m): ${stats.precision6}`);
|
||||
console.log(`⚠️ Point reduction needed: ${stats.simplifiedRows}`);
|
||||
console.log(`💾 File size: ${fileSizeMB} MB`);
|
||||
console.log(`📁 Output saved to: ${OUTPUT_FILE}`);
|
||||
console.log('══════════════════════════════════════════════════════════');
|
||||
console.log('\n✅ All geometries are under 100,000 characters!');
|
||||
console.log(' You can import this directly to NocoDB without changing column types.');
|
||||
}
|
||||
|
||||
// Run the conversion
|
||||
convertCSV();
|
||||
241
map/data/convert_ward_boundaries_optimized.js
Executable file
241
map/data/convert_ward_boundaries_optimized.js
Executable file
@ -0,0 +1,241 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
const fs = require('fs');
|
||||
const Papa = require('papaparse');
|
||||
const path = require('path');
|
||||
|
||||
// Input and output file paths
|
||||
const INPUT_FILE = '/mnt/storagessd1tb/changemaker.lite.dev/changemaker.lite/map/data/City of Edmonton Ward Boundary and Council Composition_Current_20250807.geojson';
|
||||
const OUTPUT_FILE = path.join(path.dirname(INPUT_FILE), 'edmonton_ward_boundaries_optimized.csv');
|
||||
|
||||
// Function to optimize GeoJSON precision
|
||||
function optimizeGeoJSONPrecision(geoJSON, precision = 7) {
|
||||
if (!geoJSON) return null;
|
||||
|
||||
function roundCoords(coords, precision) {
|
||||
const multiplier = Math.pow(10, precision);
|
||||
|
||||
if (Array.isArray(coords[0]) && Array.isArray(coords[0][0])) {
|
||||
// Multi-dimensional array (Polygon/MultiPolygon)
|
||||
return coords.map(coord => roundCoords(coord, precision));
|
||||
} else if (Array.isArray(coords[0]) && typeof coords[0][0] === 'number') {
|
||||
// Array of coordinate pairs
|
||||
return coords.map(([lon, lat]) => [
|
||||
Math.round(lon * multiplier) / multiplier,
|
||||
Math.round(lat * multiplier) / multiplier
|
||||
]);
|
||||
} else if (typeof coords[0] === 'number' && typeof coords[1] === 'number') {
|
||||
// Single coordinate pair
|
||||
return [
|
||||
Math.round(coords[0] * multiplier) / multiplier,
|
||||
Math.round(coords[1] * multiplier) / multiplier
|
||||
];
|
||||
}
|
||||
return coords;
|
||||
}
|
||||
|
||||
const optimized = JSON.parse(JSON.stringify(geoJSON));
|
||||
optimized.coordinates = roundCoords(optimized.coordinates, precision);
|
||||
return optimized;
|
||||
}
|
||||
|
||||
// Smart polygon simplification - only remove redundant points
|
||||
function smartSimplify(coordinates, maxPoints = 500) {
|
||||
return coordinates.map(ring => {
|
||||
if (ring.length <= maxPoints) return ring;
|
||||
|
||||
// Calculate step to evenly sample points
|
||||
const step = ring.length / maxPoints;
|
||||
const simplified = [];
|
||||
|
||||
for (let i = 0; i < maxPoints - 1; i++) {
|
||||
const index = Math.floor(i * step);
|
||||
simplified.push(ring[index]);
|
||||
}
|
||||
|
||||
// Always include the last point to close the polygon
|
||||
simplified.push(ring[ring.length - 1]);
|
||||
|
||||
return simplified;
|
||||
});
|
||||
}
|
||||
|
||||
// Function to calculate bounds from GeoJSON
|
||||
function calculateBounds(geoJSON) {
|
||||
if (!geoJSON) return null;
|
||||
|
||||
let minLat = Infinity, maxLat = -Infinity;
|
||||
let minLon = Infinity, maxLon = -Infinity;
|
||||
|
||||
function processCoords(coords) {
|
||||
if (Array.isArray(coords[0]) && Array.isArray(coords[0][0])) {
|
||||
coords.forEach(processCoords);
|
||||
} else if (Array.isArray(coords[0]) && typeof coords[0][0] === 'number') {
|
||||
coords.forEach(([lon, lat]) => {
|
||||
minLat = Math.min(minLat, lat);
|
||||
maxLat = Math.max(maxLat, lat);
|
||||
minLon = Math.min(minLon, lon);
|
||||
maxLon = Math.max(maxLon, lon);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
processCoords(geoJSON.coordinates);
|
||||
return `[[${minLat.toFixed(7)},${minLon.toFixed(7)}],[${maxLat.toFixed(7)},${maxLon.toFixed(7)}]]`;
|
||||
}
|
||||
|
||||
// Compact JSON stringify (no extra whitespace)
|
||||
function compactStringify(obj) {
|
||||
return JSON.stringify(obj, null, 0);
|
||||
}
|
||||
|
||||
// Main conversion function
|
||||
function convertGeoJSON() {
|
||||
console.log('📁 Reading GeoJSON file:', INPUT_FILE);
|
||||
|
||||
// Read the GeoJSON file
|
||||
const geoJSONData = fs.readFileSync(INPUT_FILE, 'utf8');
|
||||
|
||||
console.log('📊 Parsing GeoJSON...');
|
||||
|
||||
// Parse the GeoJSON
|
||||
const parsed = JSON.parse(geoJSONData);
|
||||
|
||||
if (!parsed.features || !Array.isArray(parsed.features)) {
|
||||
console.error('❌ Invalid GeoJSON format - no features array found');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`✅ Found ${parsed.features.length} ward boundaries to convert`);
|
||||
console.log('🎯 Optimizing precision for NocoDB (100k char limit)...\n');
|
||||
|
||||
// Get current timestamp
|
||||
const now = new Date();
|
||||
const timestamp = now.toISOString().replace('T', ' ').replace('Z', '+00:00').slice(0, -7) + '+00:00';
|
||||
|
||||
const stats = {
|
||||
totalRows: 0,
|
||||
optimizedRows: 0,
|
||||
simplifiedRows: 0,
|
||||
precision7: 0,
|
||||
precision6: 0,
|
||||
precision5: 0
|
||||
};
|
||||
|
||||
// Convert each feature
|
||||
const convertedData = parsed.features.map((feature, index) => {
|
||||
if ((index + 1) % 5 === 0) {
|
||||
console.log(` Converting... ${index + 1}/${parsed.features.length}`);
|
||||
}
|
||||
|
||||
stats.totalRows++;
|
||||
|
||||
const properties = feature.properties || {};
|
||||
const geometry = feature.geometry;
|
||||
|
||||
if (!geometry) {
|
||||
console.warn(`⚠️ Feature ${index + 1} has no geometry, skipping`);
|
||||
return null;
|
||||
}
|
||||
|
||||
// Start with 7 decimal precision (~1cm accuracy)
|
||||
let geoJSON = optimizeGeoJSONPrecision(geometry, 7);
|
||||
let geoJSONString = geoJSON ? compactStringify(geoJSON) : '';
|
||||
|
||||
// If still too large, try 6 decimals (~10cm accuracy)
|
||||
if (geoJSONString.length > 99000) {
|
||||
stats.precision7++;
|
||||
geoJSON = optimizeGeoJSONPrecision(geometry, 6);
|
||||
geoJSONString = compactStringify(geoJSON);
|
||||
|
||||
// If still too large, try 5 decimals (~1m accuracy)
|
||||
if (geoJSONString.length > 99000) {
|
||||
stats.precision6++;
|
||||
geoJSON = optimizeGeoJSONPrecision(geometry, 5);
|
||||
geoJSONString = compactStringify(geoJSON);
|
||||
|
||||
// If STILL too large, simplify points
|
||||
if (geoJSONString.length > 99000) {
|
||||
stats.precision5++;
|
||||
const originalPoints = JSON.stringify(geoJSON).length;
|
||||
|
||||
if (geoJSON.type === 'Polygon') {
|
||||
geoJSON.coordinates = smartSimplify(geoJSON.coordinates);
|
||||
} else if (geoJSON.type === 'MultiPolygon') {
|
||||
geoJSON.coordinates = geoJSON.coordinates.map(polygon =>
|
||||
smartSimplify(polygon)
|
||||
);
|
||||
}
|
||||
|
||||
geoJSONString = compactStringify(geoJSON);
|
||||
stats.simplifiedRows++;
|
||||
|
||||
console.log(` ⚠️ ${properties.name_1 || properties.name_2 || `Ward ${index + 1}`}: Simplified from ${originalPoints} to ${geoJSONString.length} chars`);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
stats.optimizedRows++;
|
||||
}
|
||||
|
||||
// Create ward name from available properties
|
||||
const wardName = properties.name_1 || properties.name_2 || `Ward ${index + 1}`;
|
||||
const fullWardName = properties.name_2 || (properties.name_1 ? `${properties.name_1} Ward` : `Ward ${index + 1}`);
|
||||
|
||||
// Create description with available information
|
||||
let description = fullWardName;
|
||||
if (properties.councillor) {
|
||||
description += ` - Councillor: ${properties.councillor}`;
|
||||
}
|
||||
if (properties.councillor2) {
|
||||
description += ` & ${properties.councillor2}`;
|
||||
}
|
||||
if (properties.effective_start_date) {
|
||||
const startDate = new Date(properties.effective_start_date).toLocaleDateString();
|
||||
description += ` (Effective: ${startDate})`;
|
||||
}
|
||||
|
||||
return {
|
||||
'ID': index + 1,
|
||||
'CreatedAt': timestamp,
|
||||
'UpdatedAt': timestamp,
|
||||
'Name': wardName,
|
||||
'Description': description.substring(0, 5000),
|
||||
'Color': '#ff6b35', // Orange color for ward boundaries
|
||||
'Opacity': 0.3,
|
||||
'Category': 'Ward',
|
||||
'Public Visibility': true,
|
||||
'Official Cut': true,
|
||||
'GeoJSON Data': geoJSONString,
|
||||
'Bounds': calculateBounds(geoJSON),
|
||||
'Created By': 'City of Edmonton',
|
||||
'Created At': properties.effective_start_date || null,
|
||||
'Updated At': timestamp
|
||||
};
|
||||
}).filter(row => row !== null); // Remove any null entries
|
||||
|
||||
console.log('\n📝 Converting to CSV format...');
|
||||
|
||||
// Convert back to CSV
|
||||
const outputCSV = Papa.unparse(convertedData);
|
||||
|
||||
// Write the file
|
||||
fs.writeFileSync(OUTPUT_FILE, outputCSV);
|
||||
|
||||
const fileSizeMB = (Buffer.byteLength(outputCSV) / 1024 / 1024).toFixed(2);
|
||||
|
||||
console.log('\n✨ Conversion complete!');
|
||||
console.log('══════════════════════════════════════════════════════════');
|
||||
console.log(`📊 Total ward boundaries: ${stats.totalRows}`);
|
||||
console.log(`✅ Optimized with 7 decimals (1cm): ${stats.optimizedRows}`);
|
||||
console.log(`📉 Reduced to 6 decimals (10cm): ${stats.precision7}`);
|
||||
console.log(`📉 Reduced to 5 decimals (1m): ${stats.precision6}`);
|
||||
console.log(`⚠️ Point reduction needed: ${stats.simplifiedRows}`);
|
||||
console.log(`💾 File size: ${fileSizeMB} MB`);
|
||||
console.log(`📁 Output saved to: ${OUTPUT_FILE}`);
|
||||
console.log('══════════════════════════════════════════════════════════');
|
||||
console.log('\n✅ All geometries are under 100,000 characters!');
|
||||
console.log(' You can import this directly to NocoDB without changing column types.');
|
||||
}
|
||||
|
||||
// Run the conversion
|
||||
convertGeoJSON();
|
||||
689
map/data/edmonton_neighborhoods_nocodb_optimized.csv
Normal file
689
map/data/edmonton_neighborhoods_nocodb_optimized.csv
Normal file
File diff suppressed because one or more lines are too long
1501
map/data/edmonton_nocodb_optimized.csv
Normal file
1501
map/data/edmonton_nocodb_optimized.csv
Normal file
File diff suppressed because one or more lines are too long
13
map/data/edmonton_ward_boundaries_optimized.csv
Normal file
13
map/data/edmonton_ward_boundaries_optimized.csv
Normal file
File diff suppressed because one or more lines are too long
7
map/data/exampledata.csv
Normal file
7
map/data/exampledata.csv
Normal file
@ -0,0 +1,7 @@
|
||||
ID,CreatedAt,UpdatedAt,Name,Description,Color,Opacity,Category,Public Visibility,Official Cut,GeoJSON Data,Bounds,Created By,Created At,Updated At
|
||||
43,2025-08-05 17:24:19+00:00,2025-08-05 18:17:44+00:00,100,1,#d333ff,1.000,Custom,true,true,"{""type"":""Polygon"",""coordinates"":[[[-113.614426,53.514593],[-113.584213,53.512551],[-113.580093,53.542348],[-113.616486,53.540715],[-113.614426,53.514593]]]}","[[53.512551306362596,-113.61648559570314],[53.542347562278785,-113.58009338378908]]",admin@thebunkerops.ca,,2025-08-05 17:24:31+00:00
|
||||
45,2025-08-05 17:48:12+00:00,,asdfr,,#3388ff,0.300,Custom,true,false,"{""type"":""Polygon"",""coordinates"":[[[-113.610992,53.515818],[-113.611679,53.568861],[-113.577347,53.569269],[-113.575287,53.5199],[-113.610992,53.515818]]]}","[[53.515817672234405,-113.61167907714845],[53.569268602609704,-113.57528686523439]]",admin@thebunkerops.ca,,
|
||||
46,2025-08-06 17:57:41+00:00,2025-08-06 19:40:49+00:00,Cut Test,,#3388ff,0.150,Custom,false,false,"{""type"":""Polygon"",""coordinates"":[[[-113.613739,53.515001],[-113.560867,53.516634],[-113.538208,53.574161],[-113.616486,53.572938],[-113.613739,53.515001]]]}","[[53.515001104370874,-113.61648559570314],[53.57416149700881,-113.53820800781251]]",admin@thebunkerops.ca,,2025-08-06 19:40:49+00:00
|
||||
47,2025-08-06 19:41:28+00:00,,testter,,#3388ff,1.000,Custom,true,false,"{""type"":""Polygon"",""coordinates"":[[[-113.518982,53.49785],[-113.46199,53.499075],[-113.45993,53.526023],[-113.518295,53.525615],[-113.518982,53.49785]]]}","[[53.49784954396767,-113.51898193359376],[53.52602344284489,-113.45993041992188]]",admin@thebunkerops.ca,,
|
||||
48,2025-08-06 23:38:32+00:00,,test,,#ffcb13,0.250,Custom,true,false,"{""type"":""Polygon"",""coordinates"":[[[-113.509019,53.53862],[-113.499843,53.538416],[-113.498214,53.53546],[-113.50679,53.534899],[-113.509019,53.53862]]]}","[[53.534899152230444,-113.50901931769388],[53.53862006105656,-113.49821350780662]]",admin@thebunkerops.ca,,
|
||||
49,2025-08-07 02:28:20+00:00,,res,,#d73920,0.200,Custom,true,false,"{""type"":""Polygon"",""coordinates"":[[[-113.48946,53.603464],[-113.434573,53.601021],[-113.421538,53.576992],[-113.498379,53.577807],[-113.48946,53.603464]]]}","[[53.576992394441646,-113.49837919431718],[53.60346401394852,-113.42153787956354]]",admin@thebunkerops.ca,,
|
||||
|
@ -1,3 +1,11 @@
|
||||
# .env
|
||||
|
||||
Environment configuration file containing NocoDB API credentials, table URLs, and sheet references for database integration. Contains sensitive API tokens and configuration URLs for the various NocoDB sheets used by the application.
|
||||
|
||||
# .gitignore
|
||||
|
||||
Git ignore file specifying which files and directories should be excluded from version control, including environment files, logs, node_modules, and other temporary files.
|
||||
|
||||
# ADMIN_IMPLEMENTATION.md
|
||||
|
||||
Summarizes the implementation of the admin panel and related backend/frontend changes for the NocoDB Map Viewer.
|
||||
@ -18,10 +26,22 @@ Documents the development and requirements of the NocoDB automation script for t
|
||||
|
||||
Bash script to automate creation of required NocoDB tables and default data for the app.
|
||||
|
||||
# combined.log
|
||||
|
||||
Application log file containing all server events, errors, warnings, and informational messages in JSON format. Used for monitoring application health and debugging issues.
|
||||
|
||||
# docker-compose.yml
|
||||
|
||||
Docker Compose file to orchestrate the map-viewer app container and its environment.
|
||||
|
||||
# error.log
|
||||
|
||||
Dedicated error log file containing only error-level messages from the application for focused error monitoring and debugging.
|
||||
|
||||
# test-addresses.csv
|
||||
|
||||
Sample CSV file containing test address data for development and testing purposes. Used for validating data import and geocoding functionality.
|
||||
|
||||
# app/Dockerfile
|
||||
|
||||
Dockerfile for building the Node.js application image for deployment.
|
||||
@ -88,6 +108,14 @@ Main Express server entry point for the map application backend.
|
||||
|
||||
Legacy or backup version of the main server file, possibly for reference or migration.
|
||||
|
||||
# app/services/email.js
|
||||
|
||||
Service for sending emails via SMTP, including password recovery emails and login details using nodemailer. Supports multiple SMTP providers and includes connection verification and error handling.
|
||||
|
||||
# app/services/emailTemplates.js
|
||||
|
||||
Service for loading and rendering email templates with variable substitution. Handles HTML and plain text email generation with caching support and template variable replacement functionality.
|
||||
|
||||
# app/services/geocoding.js
|
||||
|
||||
Service for geocoding and reverse geocoding using external APIs, with caching. Updated to include forwardGeocodeSearch function for returning multiple address search results for the unified search feature.
|
||||
@ -100,13 +128,9 @@ Service for interacting with the NocoDB API (CRUD, config, etc).
|
||||
|
||||
Service for generating QR codes and handling QR-related logic.
|
||||
|
||||
# app/services/email.js
|
||||
# app/services/socrata.js
|
||||
|
||||
Service for sending emails via SMTP, including password recovery emails and login details using nodemailer. Supports multiple SMTP providers and includes connection verification and error handling.
|
||||
|
||||
# app/services/emailTemplates.js
|
||||
|
||||
Service for loading and rendering email templates with variable substitution. Handles HTML and plain text email generation with caching support and template variable replacement functionality.
|
||||
Service for integrating with Socrata API to access external government datasets. Handles API communication with Edmonton's open data platform for retrieving parcel and address information.
|
||||
|
||||
# app/templates/email/password-recovery.txt
|
||||
|
||||
@ -140,6 +164,10 @@ Admin panel HTML page for managing start location, walk sheet, shift management,
|
||||
|
||||
CSS styles specific to the admin panel UI.
|
||||
|
||||
# app/public/css/modules/apartment-marker.css
|
||||
|
||||
Styles for apartment/multi-unit building markers. Defines square-shaped markers with hover effects and transitions for distinguishing multi-unit buildings from single-family homes on the map.
|
||||
|
||||
# app/public/css/modules/apartment-popup.css
|
||||
|
||||
Styles for the apartment building popup, ensuring it is responsive and user-friendly.
|
||||
@ -196,6 +224,10 @@ Styles for mobile-specific UI elements like the mobile dropdown menu and floatin
|
||||
|
||||
Styles for all modal dialogs used throughout the application.
|
||||
|
||||
# app/public/css/modules/nocodb-dropdown.css
|
||||
|
||||
Styles for NocoDB dropdown interface components. Provides styling for dropdown toggles, arrows, and menu behaviors used in database integration features.
|
||||
|
||||
# app/public/css/modules/notifications.css
|
||||
|
||||
Styles for status messages and the global loading overlay.
|
||||
@ -216,6 +248,10 @@ Contains all media queries for responsive design, adapting the layout for differ
|
||||
|
||||
Defines the animated styles for the distinctive start location marker.
|
||||
|
||||
# app/public/css/modules/temp-user.css
|
||||
|
||||
Styles for temporary user restrictions and visual indicators. Includes temp user badge styling and CSS rules for hiding restricted elements from temporary users.
|
||||
|
||||
# app/public/css/shifts.css
|
||||
|
||||
CSS styles for the volunteer shifts page, including grid view, calendar view, and view toggle functionality.
|
||||
@ -280,6 +316,10 @@ Main entry point for initializing the frontend application. Orchestrates the com
|
||||
|
||||
JavaScript module for handling map address search functionality. Provides search capabilities using the geocoding API, displays search results with temporary markers, and integrates with the location management system.
|
||||
|
||||
# app/public/js/mkdocs-search.js
|
||||
|
||||
JavaScript module for integrating MkDocs Material's search functionality into the map application. Provides documentation search capabilities with automatic environment detection and URL configuration.
|
||||
|
||||
# app/public/js/search-manager.js
|
||||
|
||||
JavaScript module for managing the unified search system that combines documentation and map address search. Handles mode switching, result display, keyboard shortcuts, and integration between docs search and map search functionalities.
|
||||
@ -320,6 +360,46 @@ JavaScript module for cut display controls on the public map. Handles loading an
|
||||
|
||||
JavaScript for the admin cut management interface. Provides complete CRUD functionality for cuts including interactive drawing, form management, cut list display, and import/export capabilities.
|
||||
|
||||
# app/public/js/auth.js
|
||||
|
||||
JavaScript for authentication logic and user session management.
|
||||
|
||||
# app/public/js/cache-manager.js
|
||||
|
||||
JavaScript module for client-side cache management and version checking. Handles cache busting functionality to ensure users get the latest version of the application when updates are deployed.
|
||||
|
||||
# app/public/js/config.js
|
||||
|
||||
Global configuration constants for the frontend app.
|
||||
|
||||
# app/public/js/cut-controls.js
|
||||
|
||||
JavaScript module for cut display controls on the public map. Handles loading and rendering of public cuts as polygon overlays for authenticated users.
|
||||
|
||||
# app/public/js/cut-drawing.js
|
||||
|
||||
JavaScript module for interactive polygon drawing functionality. Implements click-to-add-points drawing system for creating cut boundaries on the map using Leaflet.js drawing tools.
|
||||
|
||||
# app/public/js/cut-manager.js
|
||||
|
||||
JavaScript module for managing cut operations and display functionality. Handles cut CRUD operations, layer management, and provides unified interface for cut-related features.
|
||||
|
||||
# app/public/js/dashboard.js
|
||||
|
||||
JavaScript for rendering dashboard charts and statistics using Chart.js in the admin panel.
|
||||
|
||||
# app/public/js/data-convert.js
|
||||
|
||||
Frontend JavaScript for the Convert Data admin section. Handles file upload UI, drag-and-drop, real-time progress updates, visual representation of geocoding results on a map, and saving successful results to the database.
|
||||
|
||||
# app/public/js/database-search.js
|
||||
|
||||
JavaScript module for database search functionality. Handles searching through loaded location data on the client side with caching capabilities for improved performance.
|
||||
|
||||
# app/public/js/external-layers.js
|
||||
|
||||
JavaScript module for managing external data layers on the map. Handles loading and display of external datasets like Edmonton parcel addresses with smart loading based on map bounds and zoom levels.
|
||||
|
||||
# app/routes/admin.js
|
||||
|
||||
Express router for admin-only endpoints (start location, walk sheet config).
|
||||
|
||||
17
map/package-lock.json
generated
Normal file
17
map/package-lock.json
generated
Normal file
@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "map",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"dependencies": {
|
||||
"papaparse": "^5.5.3"
|
||||
}
|
||||
},
|
||||
"node_modules/papaparse": {
|
||||
"version": "5.5.3",
|
||||
"resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz",
|
||||
"integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A=="
|
||||
}
|
||||
}
|
||||
}
|
||||
5
map/package.json
Normal file
5
map/package.json
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"papaparse": "^5.5.3"
|
||||
}
|
||||
}
|
||||
@ -1,4 +0,0 @@
|
||||
address,First Name,Last Name,Email,Phone,Notes
|
||||
"123 Main St, Edmonton, AB",John,Doe,john@example.com,780-555-0123,Test import location
|
||||
"456 Oak Ave, Edmonton, AB",Jane,Smith,jane@example.com,780-555-0456,Another test address
|
||||
"789 Pine Rd, Edmonton, AB",Bob,Johnson,bob@example.com,780-555-0789,Third test location
|
||||
|
Loading…
x
Reference in New Issue
Block a user