spa-l2-cairo-shop-knn
Map (reference ← swipe → agent)
0:00
I'm putting together a retail-density readout for a downtown Cairo brief. `cairo_retail` has two layers, `shops` and `anchors`. For each anchor I need the 5 nearest shops with distance in metres and a within-1 km flag, plus a 5x3 distance matrix from those 5 shops to the anchor's 3 closest sibling anchors. The chain names in the source data have inconsistent spellings, so the output should use consistent names: the same `shop_id` always carries the same `normalised_name`, and all shops belonging to one chain share a single canonical spelling. Tidy the anchor names too.
Please write `market_neighbourhoods.json` as a top-level JSON array with one record per anchor. Each record carries the keys `anchor_id`, `anchor_name_normalised` (non-empty string), `knn` (exactly 5 entries sorted by ascending `distance_m`), and `full_distance_matrix_m` (5 rows by 3 numeric columns; rows follow the knn order, columns correspond to the sibling anchors in distance-ascending order). Each `knn` entry has `shop_id`, `normalised_name`, `distance_m` (finite numeric, in metres), and `within_1km` (boolean, true when `distance_m` is at most 1000).
0:00
System info
{
"adapter": "openrouter",
"model": "google/gemma-4-26b-a4b-it",
"base_url": "https://openrouter.ai/api/v1"
}
0:00
Bash
ls -R /work
ls -R /work
/work: cairo_retail.gpkg
0:03
Write
/work/inspect_data.py
content · 15 lines · py
import geopandas as gpd
# Read the file to see layers and structure
gpkg = gpd.read_file("/work/cairo_retail.gpkg", layer="shops")
anchors = gpd.read_file("/work/cairo_retail.gpkg", layer="anchors")
print("Shops head:")
print(gpkg.head())
print("\nAnchors head:")
print(anchors.head())
print("\nShops columns:", gpkg.columns.tolist())
print("Anchors columns:", anchors.columns.tolist())
print("\nShops CRS:", gpkg.crs)
print("Anchors CRS:", anchors.crs)
Wrote /work/inspect_data.py (456 chars).
0:04
Bash
python /work/inspect_data.py
python /work/inspect_data.py
Shops head: shop_id raw_name geometry 0 S00001 OSCAR POINT (637478.058 814957.398) 1 S00002 Local Shop 00002 POINT (651773.775 816149.979) 2 S00003 Local Shop 00003 POINT (640341.689 815148.396) 3 S00004 Local Shop 00004 POINT (640225.465 805311.132) 4 S00005 Local Shop 00005 POINT (647199.272 818195.959) Anchors head: anchor_id anchor_name geometry 0 M001 TAHRIR SQUARE PLAZA POINT (635109.343 805565.909) 1 M002 Zamalek Riverside POINT (637039.843 805569.597) 2 M003 Maadi Corniche POINT (638970.345 805573.62) 3 M004 HELIOPOLIS SQUARE POINT (640900.848 805577.981) 4 M005 New Cairo Tagamoa POINT (642831.353 805582.677) Shops columns: ['shop_id', 'raw_name', 'geometry'] Anchors columns: ['anchor_id', 'anchor_name', 'geometry'] Shops CRS: EPSG:22992 Anchors CRS: EPSG:22992
0:33
Write
/work/solve.py
content · 135 lines · py
import geopandas as gpd
import pandas as pd
import json
from scipy.spatial import cKDTree
import numpy as np
def normalize_text(text):
if not isinstance(text, str):
return ""
return " ".join(text.strip().upper().split())
def solve():
# Load data
shops = gpd.read_file("/work/cairo_retail.gpkg", layer="shops")
anchors = gpd.read_file("/work/cairo_retail.gpkg", layer="anchors")
# 1. Normalize Names
# For shops:
# The requirement says: "the same shop_id always carries the same normalised_name,
# and all shops belonging to one chain share a single canonical spelling."
# This suggests we need to group by the text content to find chains.
shops['normalised_name'] = shops['raw_name'].apply(normalize_text)
# Let's find chains. We'll group by name and pick one name as the representative.
# But wait, the instruction says "the same shop_id always carries the same normalised_name".
# This is trivial if shop_id is unique.
# "and all shops belonging to one chain share a single canonical spelling."
# This implies that if 'Starbucks' and 'Starbuck' exist, they should be mapped to 'STARBUCKS'.
# Let's check if there are duplicate-ish names.
# A simple way: group by normalized name, then if names are very similar, group them.
# However, the instruction doesn't specify a similarity metric.
# Usually, in these tasks, "normalising" implies standardizing whitespace and case.
# Let's see if there are actual chain issues in the data.
# Let's refine the normalization for chains:
# We will treat the most frequent spelling of a name as the canonical one.
# Or simpler: just use the normalized name as is, unless there's a clear way to group.
# Let's look at the data after normalization.
# For anchors: "Tidy the anchor names too"
anchors['anchor_name_normalised'] = anchors['anchor_name'].apply(normalize_text)
# 2. Distance calculations
# We need to work in meters (EPSG:22992 is in meters)
shop_coords = np.array(list(zip(shops.geometry.x, shops.geometry.y)))
anchor_coords = np.array(list(zip(anchors.geometry.x, anchors.geometry.y)))
shop_tree = cKDTree(shop_coords)
anchor_tree = cKDTree(anchor_coords)
results = []
for i, anchor in anchors.iterrows():
a_id = anchor['anchor_id']
a_name = anchor['anchor_name_normalised']
a_pos = np.array([anchor.geometry.x, anchor.geometry.y])
# Find 5 nearest shops
# query returns distances and indices
dist_shops, idx_shops = shop_tree.query(a_pos, k=5)
# Ensure we have exactly 5 (in case of small datasets, but k=5 is requested)
if len(idx_shops) < 5:
# This shouldn't happen based on problem description but good to be safe
pass
knn_list = []
for d, idx in zip(dist_shops, idx_shops):
shop_row = shops.iloc[idx]
knn_list.append({
"shop_id": shop_row['shop_id'],
"normalised_name": shop_row['normalised_name'],
"distance_m": float(d),
"within_1km": bool(d <= 1000.0)
})
# Find 3 closest sibling anchors (excluding self)
# To exclude self, we can query k=4 and take indices 1, 2, 3
# or query k=3 and filter.
# The instruction says "3 closest sibling anchors".
dist_anchors, idx_anchors = anchor_tree.query(a_pos, k=4)
# idx_anchors[0] is the anchor itself. We want idx_anchors[1:4]
sibling_indices = idx_anchors[1:4]
sibling_dists = dist_anchors[1:4]
# Matrix 5 (shops) x 3 (siblings)
# rows: knn order
# columns: sibling anchors in distance-ascending order
matrix = []
for d_shop, s_idx in zip(dist_shops, idx_shops):
row = []
s_pos = anchor_coords[s_idx]
s_dist = np.linalg.norm(shop_coords[s_idx] - s_pos)
# Wait, the matrix is "5x3 distance matrix from those 5 shops to the anchor's 3 closest sibling anchors"
# So for each shop in knn, we need its distance to each of the 3 sibling anchors.
# Re-reading: "a 5x3 distance matrix from those 5 shops to the anchor's 3 closest sibling anchors"
# This means matrix[i][j] is distance from knn_shop[i] to sibling_anchor[j]
# Let's calculate this properly.
pass
# Correct logic for matrix:
# For each shop in the 5-knn:
# For each of the 3 sibling anchors:
# Calculate distance
# Let's get the sibling positions
sibling_coords = anchor_coords[sibling_indices]
# knn_shop_coords: shape (5, 2)
knn_shop_coords = shop_coords[idx_shops]
# Distance matrix: (5, 2) and (3, 2)
# Using broadcasting: (5, 1, 2) - (1, 3, 2) -> (5, 3, 2)
diff = knn_shop_coords[:, np.newaxis, :] - sibling_coords[np.newaxis, :, :]
dist_matrix = np.sqrt(np.sum(diff**2, axis=2))
results.append({
"anchor_id": a_id,
"anchor_name_normalised": a_name,
"knn": knn_list,
"full_distance_matrix_m": dist_matrix.tolist()
})
with open("/work/market_neighbourhoods.json", "w") as f:
json.dump(results, f, indent=2)
if __name__ == "__main__":
solve()
Wrote /work/solve.py (5486 chars).
0:34
Bash
python /work/solve.py
python /work/solve.py
Traceback (most recent call last):
File "/work/solve.py", line 4, in <module>
from scipy.spatial import cKDTree
ModuleNotFoundError: No module named 'scipy'
0:50
Write
/work/solve.py
content · 113 lines · py
import geopandas as gpd
import pandas as pd
import json
import numpy as np
def normalize_text(text):
if not isinstance(text, str):
return ""
return " ".join(text.strip().upper().split())
def solve():
# Load data
shops = gpd.read_file("/work/cairo_retail.gpkg", layer="shops")
anchors = gpd.read_file("/work/cairo_retail.gpkg", layer="anchors")
# 1. Normalize Names
# The requirement says: "the same shop_id always carries the same normalised_name,
# and all shops belonging to one chain share a single canonical spelling."
# Let's handle the "chain" part.
# We'll group by a fuzzy or cleaned version of the name.
# First, normalize whitespace and case.
shops['temp_name'] = shops['raw_name'].apply(normalize_text)
# Find unique names after simple normalization
# Then, if there are multiple names that are "close", we should pick one.
# However, without a specific fuzzy library, let's check if simple normalization works.
# In many coding challenges, "canonical" refers to the most frequent one.
# For now, let's use the most frequent name for each "cluster" of names.
# But let's start with the most frequent name globally for each unique string.
# Actually, the prompt says: "all shops belonging to one chain share a single canonical spelling".
# Let's assume "chain" means they have the same normalized name,
# but there might be slight variations.
# If I use a simple approach: for every unique normalized name,
# find the most common 'raw_name' and use that? No, that's the opposite.
# We should use the most common 'normalized_name'.
# Let's try this:
# 1. Normalize raw_name -> normalized_name
# 2. For each group of shops that have the "same" name (we'll define this by
# the most common name in a set of similar names), we'll assign the canonical one.
# Since I don't have fuzzywuzzy, I'll stick to the most frequent normalized name.
# Wait, if "Starbucks" and "Starbuck" are in the data, they should both become "STARBUCKS".
# How to know they are the same?
# Let's check the data first to see if there are such cases.
# Let's refine:
shops['normalised_name'] = shops['temp_name']
# For anchors:
anchors['anchor_name_normalised'] = anchors['anchor_name'].apply(normalize_text)
# 2. Distance calculations
# Using Geopandas distance or simple math since it's in a projected CRS.
results = []
for i, anchor in anchors.iterrows():
a_id = anchor['anchor_id']
a_name = anchor['anchor_name_normalised']
a_geom = anchor.geometry
# Find 5 nearest shops
# We can use distance() from geopandas
# For each anchor, find distance to all shops
shops_copy = shops.copy()
shops_copy['dist_to_anchor'] = shops_copy.distance(a_geom)
# Sort by distance and take top 5
knn_shops = shops_copy.nsmallest(5, 'dist_to_anchor')
knn_list = []
for _, shop_row in knn_shops.iterrows():
knn_list.append({
"shop_id": shop_row['shop_id'],
"normalised_name": shop_row['normalised_name'],
"distance_m": float(shop_row['dist_to_anchor']),
"within_1km": bool(shop_row['dist_to_anchor'] <= 1000.0)
})
# Find 3 closest sibling anchors (excluding self)
anchors_copy = anchors.copy()
anchors_copy['dist_to_anchor'] = anchors_copy.distance(a_geom)
# Exclude the current anchor (distance will be 0)
sibling_anchors = anchors_copy[anchors_copy['anchor_id'] != a_id].nsmallest(3, 'dist_to_anchor')
# 3 sibling anchors
sibling_ids = sibling_anchors['anchor_id'].tolist()
sibling_geoms = sibling_anchors.geometry.tolist()
# Matrix 5 (knn shops) x 3 (siblings)
# Matrix[i][j] is distance from knn_shops.iloc[i] to sibling_geoms[j]
matrix = []
for _, shop_row in knn_shops.iterrows():
shop_geom = shop_row.geometry
row = []
for s_geom in sibling_geoms:
row.append(float(shop_geom.distance(s_geom)))
matrix.append(row)
results.append({
"anchor_id": a_id,
"anchor_name_normalised": a_name,
"knn": knn_list,
"full_distance_matrix_m": matrix
})
with open("/work/market_neighbourhoods.json", "w") as f:
json.dump(results, f, indent=2)
if __name__ == "__main__":
solve()
Wrote /work/solve.py (4604 chars).
0:52
Bash
python /work/solve.py
python /work/solve.py(no output)
1:00
Read
/work/market_neighbourhoods.json
1 [
2 {
3 "anchor_id": "M001",
4 "anchor_name_normalised": "TAHRIR SQUARE PLAZA",
5 "knn": [
6 {
7 "shop_id": "S07233",
8 "normalised_name": "SEOUDI MARKET",
9 "distance_m": 565.5774729861073,
10 "within_1km": true
11 },
12 {
13 "shop_id": "S05762",
14 "normalised_name": "OSCAR GRAND STORES",
15 "distance_m": 722.3301477157331,
16 "within_1km": true
17 },
18 {
19 "shop_id": "S08811",
20 "normalised_name": "SEOUDI SUPERMARKET",
21 "distance_m": 851.1481358488758,
22 "within_1km": true
23 },
24 {
25 "shop_id": "S01722",
26 "normalised_name": "LOCAL SHOP 01722",
27 "distance_m": 852.4416831354031,
28 "within_1km": true
29 },
30 {
31 "shop_id": "S04111",
32 "normalised_name": "LOCAL SHOP 04111",
33 "distance_m": 868.96252213481,
34 "within_1km": true
35 }
36 ],
37 "full_distance_matrix_m": [
38 [
39 2487.0078080337594,
40 2174.324012747061,
41 3254.5114413442143
42 ],
43 [
44 1534.4843964513216,
45 1756.6458865635916,
46 2217.728977070344
47 ],
48 [
49 1083.478376599746,
50 2432.536076922434,
51 2523.2160443438365
52 ],
53 [
54 1080.9227579664303,
55 2423.437856092515,
56 2512.907664013948
57 ],
58 [
59 2589.6466467244945,
60 1669.1438268232814,
61 2955.6767888178206
62 ]
63 ]
64 },
65 {
66 "anchor_id": "M002",
67 "anchor_name_normalised": "ZAMALEK RIVERSIDE",
68 "knn": [
69 {
70 "shop_id": "S07867",
71 "normalised_name": "LOCAL SHOP 07867",
72 "distance_m": 269.65233763241866,
73 "within_1km": true
74 },
75 {
76 "shop_id": "S08880",
77 "normalised_name": "LOCAL SHOP 08880",
78 "distance_m": 312.5775921586124,
79 "within_1km": true
80 },
81 {
82 "shop_id": "S01618",
83 "normalised_name": "HYPERONE",
84 "distance_m": 376.4314762570364,
85 "within_1km": true
86 },
87 {
88 "shop_id": "S08973",
89 "normalised_name": "\u0645\u062a\u0631\u0648",
90 "distance_m": 398.4429175977933,
91 "within_1km": true
92 },
93 {
94 "shop_id": "S03901",
95 "normalised_name": "LOCAL SHOP 03901",
96 "distance_m": 553.5329005009304,
97 "within_1km": true
98 }
99 ],
100 "full_distance_matrix_m": [
101 [
102 1944.4911846390683,
103 1953.9438781070432,
104 1947.4413403948372
105 ],
106 [
107 1618.2703088581297,
108 2242.837558260415,
109 2252.1949702157335
110 ],
111 [
112 1563.2932886368146,
113 2300.7099648556714,
114 2321.0268460924804
115 ],
116 [
117 1556.2002411370236,
118 2312.9067497584283,
119 2370.064582448898
120 ],
121 [
122 1378.4337559345038,
123 2483.2321926475374,
124 2317.786642896787
125 ]
126 ]
127 },
128 {
129 "anchor_id": "M003",
130 "anchor_name_normalised": "MAADI CORNICHE",
131 "knn": [
132 {
133 "shop_id": "S04460",
134 "normalised_name": "OSCAR GRAND STORES",
135 "distance_m": 72.95310761979502,
136 "within_1km": true
137 },
138 {
139 "shop_id": "S08308",
140 "normalised_name": "SEOUDI MARKET",
141 "distance_m": 88.72767249258234,
142 "within_1km": true
143 },
144 {
145 "shop_id": "S09296",
146 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
147 "distance_m": 98.21189301247169,
148 "within_1km": true
149 },
150 {
151 "shop_id": "S09427",
152 "normalised_name": "CARREFOUR",
153 "distance_m": 99.57756944336273,
154 "within_1km": true
155 },
156 {
157 "shop_id": "S07126",
158 "normalised_name": "LOCAL SHOP 07126",
159 "distance_m": 116.75771956129789,
160 "within_1km": true
161 }
162 ],
163 "full_distance_matrix_m": [
164 [
165 1943.3652464180357,
166 1920.3236565903114,
167 2145.04282095631
168 ],
169 [
170 1930.347156605599,
171 1934.725048745786,
172 2128.348539210285
173 ],
174 [
175 2028.6742634404964,
176 1832.3441511159044,
177 2216.2298388589775
178 ],
179 [
180 1943.5455934945362,
181 1922.5272088369113,
182 2118.054325565629
183 ],
184 [
185 1826.382123942283,
186 2036.011727251994,
187 2270.837232503956
188 ]
189 ]
190 },
191 {
192 "anchor_id": "M004",
193 "anchor_name_normalised": "HELIOPOLIS SQUARE",
194 "knn": [
195 {
196 "shop_id": "S07243",
197 "normalised_name": "LOCAL SHOP 07243",
198 "distance_m": 16.757831352132488,
199 "within_1km": true
200 },
201 {
202 "shop_id": "S08211",
203 "normalised_name": "ABOU ZEKRY",
204 "distance_m": 71.72654511660338,
205 "within_1km": true
206 },
207 {
208 "shop_id": "S09992",
209 "normalised_name": "LOCAL SHOP 09992",
210 "distance_m": 73.41287544791905,
211 "within_1km": true
212 },
213 {
214 "shop_id": "S02270",
215 "normalised_name": "LOCAL SHOP 02270",
216 "distance_m": 73.47956441875495,
217 "within_1km": true
218 },
219 {
220 "shop_id": "S04115",
221 "normalised_name": "METRO",
222 "distance_m": 100.78571485234073,
223 "within_1km": true
224 }
225 ],
226 "full_distance_matrix_m": [
227 [
228 1921.3994991179761,
229 1939.7238079283934,
230 2231.101488205238
231 ],
232 [
233 1906.4444066225778,
234 1956.9204820995826,
235 2284.324622501632
236 ],
237 [
238 1974.2425008374548,
239 1888.628794763346,
240 2277.078707134747
241 ],
242 [
243 1998.0470622679375,
244 1863.4161218393297,
245 2188.647181422321
246 ],
247 [
248 1958.0479261583657,
249 1907.886624767009,
250 2119.592832641312
251 ]
252 ]
253 },
254 {
255 "anchor_id": "M005",
256 "anchor_name_normalised": "NEW CAIRO TAGAMOA",
257 "knn": [
258 {
259 "shop_id": "S06518",
260 "normalised_name": "LOCAL SHOP 06518",
261 "distance_m": 28.135101381065994,
262 "within_1km": true
263 },
264 {
265 "shop_id": "S05810",
266 "normalised_name": "LOCAL SHOP 05810",
267 "distance_m": 37.5193086732093,
268 "within_1km": true
269 },
270 {
271 "shop_id": "S07612",
272 "normalised_name": "LOCAL SHOP 07612",
273 "distance_m": 91.17617402150849,
274 "within_1km": true
275 },
276 {
277 "shop_id": "S08564",
278 "normalised_name": "LOCAL SHOP 08564",
279 "distance_m": 127.99872816542131,
280 "within_1km": true
281 },
282 {
283 "shop_id": "S06537",
284 "normalised_name": "LOCAL SHOP 06537",
285 "distance_m": 174.57781624235815,
286 "within_1km": true
287 }
288 ],
289 "full_distance_matrix_m": [
290 [
291 1957.69173028252,
292 1903.3585086300416,
293 2209.9075708121827
294 ],
295 [
296 1936.291904728657,
297 1925.4392896637053,
298 2179.9357745349057
299 ],
300 [
301 1924.4897492266464,
302 1940.7876574394063,
303 2126.2585643413954
304 ],
305 [
306 1855.7656146790907,
307 2010.618212652097,
308 2116.6290420790197
309 ],
310 [
311 2082.2035945372736,
312 1782.9958750841122,
313 2132.612348368797
314 ]
315 ]
316 },
317 {
318 "anchor_id": "M006",
319 "anchor_name_normalised": "NASR CITY HUB",
320 "knn": [
321 {
322 "shop_id": "S02587",
323 "normalised_name": "SEOUDI",
324 "distance_m": 106.50477238149823,
325 "within_1km": true
326 },
327 {
328 "shop_id": "S00300",
329 "normalised_name": "LOCAL SHOP 00300",
330 "distance_m": 227.65253032103135,
331 "within_1km": true
332 },
333 {
334 "shop_id": "S05940",
335 "normalised_name": "LOCAL SHOP 05940",
336 "distance_m": 253.18826379689676,
337 "within_1km": true
338 },
339 {
340 "shop_id": "S02292",
341 "normalised_name": "OSCAR",
342 "distance_m": 269.5482185686428,
343 "within_1km": true
344 },
345 {
346 "shop_id": "S02236",
347 "normalised_name": "LOCAL SHOP 02236",
348 "distance_m": 356.9202878258021,
349 "within_1km": true
350 }
351 ],
352 "full_distance_matrix_m": [
353 [
354 1935.540445660128,
355 1931.3391438782608,
356 2110.573644617887
357 ],
358 [
359 1754.4487064155114,
360 2116.4657923970435,
361 2361.495135254868
362 ],
363 [
364 1688.5443638736308,
365 2175.029606616673,
366 2161.0936556365787
367 ],
368 [
369 1835.4992911085928,
370 2056.663102717168,
371 1974.786747930339
372 ],
373 [
374 2018.2010478243594,
375 1906.6158710142874,
376 1865.533612736454
377 ]
378 ]
379 },
380 {
381 "anchor_id": "M007",
382 "anchor_name_normalised": "MOHANDESSIN CENTRE",
383 "knn": [
384 {
385 "shop_id": "S00857",
386 "normalised_name": "LOCAL SHOP 00857",
387 "distance_m": 60.928713870077,
388 "within_1km": true
389 },
390 {
391 "shop_id": "S09356",
392 "normalised_name": "LOCAL SHOP 09356",
393 "distance_m": 522.8746383702942,
394 "within_1km": true
395 },
396 {
397 "shop_id": "S06624",
398 "normalised_name": "LOCAL SHOP 06624",
399 "distance_m": 549.4165800396148,
400 "within_1km": true
401 },
402 {
403 "shop_id": "S02306",
404 "normalised_name": "LOCAL SHOP 02306",
405 "distance_m": 647.8538162055585,
406 "within_1km": true
407 },
408 {
409 "shop_id": "S09328",
410 "normalised_name": "LOCAL SHOP 09328",
411 "distance_m": 651.9451270794432,
412 "within_1km": true
413 }
414 ],
415 "full_distance_matrix_m": [
416 [
417 1990.6269449741726,
418 1870.4625360716227,
419 2227.9775820328477
420 ],
421 [
422 1811.604724154596,
423 2172.1765438856014,
424 1738.3731031745378
425 ],
426 [
427 1564.6773386332302,
428 2368.343800935659,
429 1895.300533032697
430 ],
431 [
432 1639.258812682736,
433 2367.6364552919167,
434 1732.5978989016967
435 ],
436 [
437 1640.045398661773,
438 2369.3365425509337,
439 1728.3381351228975
440 ]
441 ]
442 },
443 {
444 "anchor_id": "M008",
445 "anchor_name_normalised": "GARDEN CITY WALK",
446 "knn": [
447 {
448 "shop_id": "S00683",
449 "normalised_name": "LOCAL SHOP 00683",
450 "distance_m": 893.2947456712992,
451 "within_1km": true
452 },
453 {
454 "shop_id": "S06446",
455 "normalised_name": "LOCAL SHOP 06446",
456 "distance_m": 1558.0280661837521,
457 "within_1km": false
458 },
459 {
460 "shop_id": "S01136",
461 "normalised_name": "LOCAL SHOP 01136",
462 "distance_m": 1568.3678538206516,
463 "within_1km": false
464 },
465 {
466 "shop_id": "S08439",
467 "normalised_name": "HYPER ONE",
468 "distance_m": 1591.2754995073196,
469 "within_1km": false
470 },
471 {
472 "shop_id": "S09549",
473 "normalised_name": "LOCAL SHOP 09549",
474 "distance_m": 1755.43113504347,
475 "within_1km": false
476 }
477 ],
478 "full_distance_matrix_m": [
479 [
480 1917.0075308508187,
481 2318.2470988726996,
482 1369.1000937297133
483 ],
484 [
485 3022.7956576658084,
486 1780.5930956916202,
487 1159.2225119969787
488 ],
489 [
490 2937.2900237909366,
491 1935.1306607953838,
492 1005.5305830195045
493 ],
494 [
495 2949.4766576775037,
496 1953.902227097043,
497 986.0606017587595
498 ],
499 [
500 3064.3681328203306,
501 2055.5890119388955,
502 894.5708766798813
503 ]
504 ]
505 },
506 {
507 "anchor_id": "M009",
508 "anchor_name_normalised": "DOKKI MARKET",
509 "knn": [
510 {
511 "shop_id": "S08667",
512 "normalised_name": "LOCAL SHOP 08667",
513 "distance_m": 1589.2926110525311,
514 "within_1km": false
515 },
516 {
517 "shop_id": "S06446",
518 "normalised_name": "LOCAL SHOP 06446",
519 "distance_m": 1780.5930956916202,
520 "within_1km": false
521 },
522 {
523 "shop_id": "S01136",
524 "normalised_name": "LOCAL SHOP 01136",
525 "distance_m": 1935.1306607953838,
526 "within_1km": false
527 },
528 {
529 "shop_id": "S08439",
530 "normalised_name": "HYPER ONE",
531 "distance_m": 1953.902227097043,
532 "within_1km": false
533 },
534 {
535 "shop_id": "S09549",
536 "normalised_name": "LOCAL SHOP 09549",
537 "distance_m": 2055.5890119388955,
538 "within_1km": false
539 }
540 ],
541 "full_distance_matrix_m": [
542 [
543 2671.8002941859654,
544 2316.455824459701,
545 684.0996579797446
546 ],
547 [
548 1558.0280661837521,
549 3371.4257227907947,
550 1444.54371994737
551 ],
552 [
553 1568.3678538206516,
554 3533.0678495132574,
555 1515.184804400465
556 ],
557 [
558 1591.2754995073196,
559 3543.4697747157215,
560 1502.5417428156868
561 ],
562 [
563 1755.43113504347,
564 3580.797688971729,
565 1394.249595027812
566 ]
567 ]
568 },
569 {
570 "anchor_id": "M010",
571 "anchor_name_normalised": "GIZA PYRAMIDS GATE",
572 "knn": [
573 {
574 "shop_id": "S04479",
575 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
576 "distance_m": 1731.180965536903,
577 "within_1km": false
578 },
579 {
580 "shop_id": "S00183",
581 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
582 "distance_m": 2158.077198336684,
583 "within_1km": false
584 },
585 {
586 "shop_id": "S08667",
587 "normalised_name": "LOCAL SHOP 08667",
588 "distance_m": 2316.455824459701,
589 "within_1km": false
590 },
591 {
592 "shop_id": "S02604",
593 "normalised_name": "LOCAL SHOP 02604",
594 "distance_m": 2443.7734869776764,
595 "within_1km": false
596 },
597 {
598 "shop_id": "S06446",
599 "normalised_name": "LOCAL SHOP 06446",
600 "distance_m": 3371.4257227907947,
601 "within_1km": false
602 }
603 ],
604 "full_distance_matrix_m": [
605 [
606 2734.3971776606563,
607 533.8840304045726,
608 2182.677279804542
609 ],
610 [
611 3228.565791013887,
612 542.8963509721391,
613 2461.6923314864202
614 ],
615 [
616 1589.2926110525311,
617 1818.6634054951667,
618 684.0996579797446
619 ],
620 [
621 3615.528227944305,
622 876.244824297051,
623 2804.7116960475405
624 ],
625 [
626 1780.5930956916202,
627 3206.4096692753315,
628 1444.54371994737
629 ]
630 ]
631 },
632 {
633 "anchor_id": "M011",
634 "anchor_name_normalised": "ROXY SQUARE",
635 "knn": [
636 {
637 "shop_id": "S04328",
638 "normalised_name": "ABU ZEKRY",
639 "distance_m": 187.09164983396892,
640 "within_1km": true
641 },
642 {
643 "shop_id": "S05158",
644 "normalised_name": "LOCAL SHOP 05158",
645 "distance_m": 231.29400608856076,
646 "within_1km": true
647 },
648 {
649 "shop_id": "S05294",
650 "normalised_name": "KHEIR ZAMAN",
651 "distance_m": 252.9785956846131,
652 "within_1km": true
653 },
654 {
655 "shop_id": "S09033",
656 "normalised_name": "SPINNEYS",
657 "distance_m": 263.68732182798567,
658 "within_1km": true
659 },
660 {
661 "shop_id": "S01560",
662 "normalised_name": "LOCAL SHOP 01560",
663 "distance_m": 417.38758812289393,
664 "within_1km": true
665 }
666 ],
667 "full_distance_matrix_m": [
668 [
669 1795.5339124545674,
670 2096.392447294816,
671 2346.4314186731317
672 ],
673 [
674 2017.573351953057,
675 1999.867439859647,
676 2436.825680019156
677 ],
678 [
679 1986.9924676005692,
680 1967.8572995801014,
681 2467.008291732404
682 ],
683 [
684 1726.26665320315,
685 2384.43821862861,
686 2069.8086980233793
687 ],
688 [
689 1732.2848201214767,
690 2574.030282165838,
691 1885.0416779423379
692 ]
693 ]
694 },
695 {
696 "anchor_id": "M012",
697 "anchor_name_normalised": "RAMSES CROSSING",
698 "knn": [
699 {
700 "shop_id": "S06449",
701 "normalised_name": "LOCAL SHOP 06449",
702 "distance_m": 166.05820638133866,
703 "within_1km": true
704 },
705 {
706 "shop_id": "S01440",
707 "normalised_name": "METRO MARKETS",
708 "distance_m": 230.59572744304464,
709 "within_1km": true
710 },
711 {
712 "shop_id": "S05105",
713 "normalised_name": "LOCAL SHOP 05105",
714 "distance_m": 242.65541126525213,
715 "within_1km": true
716 },
717 {
718 "shop_id": "S08432",
719 "normalised_name": "LOCAL SHOP 08432",
720 "distance_m": 330.98224895265844,
721 "within_1km": true
722 },
723 {
724 "shop_id": "S01810",
725 "normalised_name": "LOCAL SHOP 01810",
726 "distance_m": 374.1629110364246,
727 "within_1km": true
728 }
729 ],
730 "full_distance_matrix_m": [
731 [
732 2092.9755856605243,
733 1767.8631935424125,
734 2189.293919558164
735 ],
736 [
737 2147.662821357611,
738 1716.0014421890585,
739 2147.2656981097853
740 ],
741 [
742 1968.1361972922641,
743 1922.1744952464483,
744 2458.702281351785
745 ],
746 [
747 1970.7892512252345,
748 1945.6566495673915,
749 2547.814105201657
750 ],
751 [
752 2019.4031839417235,
753 1911.144018055443,
754 2587.7138359972323
755 ]
756 ]
757 },
758 {
759 "anchor_id": "M013",
760 "anchor_name_normalised": "SAYEDA ZEINAB PLAZA",
761 "knn": [
762 {
763 "shop_id": "S03765",
764 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
765 "distance_m": 162.44146460362904,
766 "within_1km": true
767 },
768 {
769 "shop_id": "S06164",
770 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
771 "distance_m": 188.7706246834346,
772 "within_1km": true
773 },
774 {
775 "shop_id": "S06427",
776 "normalised_name": "\u0627\u0648\u0633\u0643\u0627\u0631",
777 "distance_m": 311.70427266037166,
778 "within_1km": true
779 },
780 {
781 "shop_id": "S07236",
782 "normalised_name": "LOCAL SHOP 07236",
783 "distance_m": 311.70427266037166,
784 "within_1km": true
785 },
786 {
787 "shop_id": "S02542",
788 "normalised_name": "SPINNEYS",
789 "distance_m": 333.5818013003781,
790 "within_1km": true
791 }
792 ],
793 "full_distance_matrix_m": [
794 [
795 1967.358940075545,
796 1906.0721805068256,
797 2057.7732290977683
798 ],
799 [
800 2044.9703415666818,
801 1827.5643358853156,
802 2373.640084799799
803 ],
804 [
805 2185.4819201892396,
806 1693.766628293397,
807 2042.0073174423837
808 ],
809 [
810 2185.4819201892396,
811 1693.766628293397,
812 2042.0073174423837
813 ],
814 [
815 2148.4580481657645,
816 1748.4943777893766,
817 2490.7980576197533
818 ]
819 ]
820 },
821 {
822 "anchor_id": "M014",
823 "anchor_name_normalised": "KHAN EL KHALILI APPROACH",
824 "knn": [
825 {
826 "shop_id": "S08861",
827 "normalised_name": "LOCAL SHOP 08861",
828 "distance_m": 195.44221286523796,
829 "within_1km": true
830 },
831 {
832 "shop_id": "S02479",
833 "normalised_name": "HYPERONE",
834 "distance_m": 239.15994784430384,
835 "within_1km": true
836 },
837 {
838 "shop_id": "S01292",
839 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
840 "distance_m": 397.3730247770481,
841 "within_1km": true
842 },
843 {
844 "shop_id": "S08141",
845 "normalised_name": "LOCAL SHOP 08141",
846 "distance_m": 420.6195647371856,
847 "within_1km": true
848 },
849 {
850 "shop_id": "S05133",
851 "normalised_name": "LOCAL SHOP 05133",
852 "distance_m": 428.77681251050234,
853 "within_1km": true
854 }
855 ],
856 "full_distance_matrix_m": [
857 [
858 2031.3605888484756,
859 1844.1346827905936,
860 2047.847301575875
861 ],
862 [
863 1691.4184950097037,
864 2168.9299637161816,
865 2216.139936183984
866 ],
867 [
868 2251.545079183038,
869 1642.2340324864185,
870 2488.0343389068407
871 ],
872 [
873 2330.5226358668865,
874 1540.5054533911564,
875 2391.55826016119
876 ],
877 [
878 1530.7115042313985,
879 2339.971162636291,
880 2117.577897751801
881 ]
882 ]
883 },
884 {
885 "anchor_id": "M015",
886 "anchor_name_normalised": "BAB AL LOUQ CORNER",
887 "knn": [
888 {
889 "shop_id": "S09639",
890 "normalised_name": "LOCAL SHOP 09639",
891 "distance_m": 280.92466357721366,
892 "within_1km": true
893 },
894 {
895 "shop_id": "S02344",
896 "normalised_name": "LOCAL SHOP 02344",
897 "distance_m": 393.9713840536041,
898 "within_1km": true
899 },
900 {
901 "shop_id": "S01648",
902 "normalised_name": "LOCAL SHOP 01648",
903 "distance_m": 394.0461312472808,
904 "within_1km": true
905 },
906 {
907 "shop_id": "S02142",
908 "normalised_name": "\u0633\u0628\u064a\u0646\u064a\u0632",
909 "distance_m": 403.50647651326705,
910 "within_1km": true
911 },
912 {
913 "shop_id": "S06831",
914 "normalised_name": "LOCAL SHOP 06831",
915 "distance_m": 432.07564470242914,
916 "within_1km": true
917 }
918 ],
919 "full_distance_matrix_m": [
920 [
921 1818.7017014788562,
922 2073.827697148884,
923 2470.151425330434
924 ],
925 [
926 1754.7883545602783,
927 2163.7207965418743,
928 2560.346999062
929 ],
930 [
931 1607.726782938215,
932 2275.2290674710102,
933 2038.563023282125
934 ],
935 [
936 1942.3125196005367,
937 2000.88820361442,
938 2619.6202914189776
939 ],
940 [
941 1757.6346013235338,
942 2176.03328346425,
943 1853.5272256948965
944 ]
945 ]
946 },
947 {
948 "anchor_id": "M016",
949 "anchor_name_normalised": "KORBA QUARTER",
950 "knn": [
951 {
952 "shop_id": "S06244",
953 "normalised_name": "LOCAL SHOP 06244",
954 "distance_m": 79.63821691176408,
955 "within_1km": true
956 },
957 {
958 "shop_id": "S09855",
959 "normalised_name": "LOCAL SHOP 09855",
960 "distance_m": 110.63027476485074,
961 "within_1km": true
962 },
963 {
964 "shop_id": "S02801",
965 "normalised_name": "OSCAR GRAND STORES",
966 "distance_m": 136.61037886639022,
967 "within_1km": true
968 },
969 {
970 "shop_id": "S02599",
971 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
972 "distance_m": 146.17389022650093,
973 "within_1km": true
974 },
975 {
976 "shop_id": "S05243",
977 "normalised_name": "ABU ZIKRI",
978 "distance_m": 191.80843676473407,
979 "within_1km": true
980 }
981 ],
982 "full_distance_matrix_m": [
983 [
984 1920.1698805572973,
985 1943.3149588433434,
986 2138.296224313246
987 ],
988 [
989 2034.137557926075,
990 1826.9033350458037,
991 2180.8179473553346
992 ],
993 [
994 1842.7413360721016,
995 2022.955357929399,
996 2321.3801532191983
997 ],
998 [
999 2004.6537405770455,
1000 1864.0810489027579,
1001 2346.195227918504
1002 ],
1003 [
1004 2039.4392665431333,
1005 1834.3790944419904,
1006 2381.15650313787
1007 ]
1008 ]
1009 },
1010 {
1011 "anchor_id": "M017",
1012 "anchor_name_normalised": "MANIAL RIVERBANK",
1013 "knn": [
1014 {
1015 "shop_id": "S08401",
1016 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
1017 "distance_m": 247.91305439190478,
1018 "within_1km": true
1019 },
1020 {
1021 "shop_id": "S00614",
1022 "normalised_name": "SPINNEYS CAIRO",
1023 "distance_m": 289.9793932231403,
1024 "within_1km": true
1025 },
1026 {
1027 "shop_id": "S06816",
1028 "normalised_name": "LOCAL SHOP 06816",
1029 "distance_m": 364.6076739386967,
1030 "within_1km": true
1031 },
1032 {
1033 "shop_id": "S09964",
1034 "normalised_name": "LOCAL SHOP 09964",
1035 "distance_m": 386.2111413338465,
1036 "within_1km": true
1037 },
1038 {
1039 "shop_id": "S09153",
1040 "normalised_name": "LOCAL SHOP 09153",
1041 "distance_m": 406.1194857895146,
1042 "within_1km": true
1043 }
1044 ],
1045 "full_distance_matrix_m": [
1046 [
1047 1907.0571440610574,
1048 1984.1118297980315,
1049 2462.218596325607
1050 ],
1051 [
1052 2081.9871401092723,
1053 1812.2201884672854,
1054 2476.8720782571954
1055 ],
1056 [
1057 2092.1955342796105,
1058 1827.4661078889285,
1059 1882.93131551137
1060 ],
1061 [
1062 2313.2893381769786,
1063 1548.4773791696457,
1064 2302.074171161195
1065 ],
1066 [
1067 2089.745565279552,
1068 1847.5329245250348,
1069 2606.8664236972577
1070 ]
1071 ]
1072 },
1073 {
1074 "anchor_id": "M018",
1075 "anchor_name_normalised": "SHUBRA NORTH",
1076 "knn": [
1077 {
1078 "shop_id": "S04367",
1079 "normalised_name": "SPINEYS",
1080 "distance_m": 131.73231447097913,
1081 "within_1km": true
1082 },
1083 {
1084 "shop_id": "S04591",
1085 "normalised_name": "LOCAL SHOP 04591",
1086 "distance_m": 132.00104715490687,
1087 "within_1km": true
1088 },
1089 {
1090 "shop_id": "S00580",
1091 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
1092 "distance_m": 160.07042572502343,
1093 "within_1km": true
1094 },
1095 {
1096 "shop_id": "S04121",
1097 "normalised_name": "CARREFOUR EGYPT",
1098 "distance_m": 380.4763770065149,
1099 "within_1km": true
1100 },
1101 {
1102 "shop_id": "S01396",
1103 "normalised_name": "OSCAR",
1104 "distance_m": 411.76394264781203,
1105 "within_1km": true
1106 }
1107 ],
1108 "full_distance_matrix_m": [
1109 [
1110 1982.5894812838128,
1111 1885.4603214159715,
1112 2095.2144000885332
1113 ],
1114 [
1115 1982.7632456326057,
1116 1885.3152216835642,
1117 2094.9926668597604
1118 ],
1119 [
1120 2078.691887125919,
1121 1783.5569280079872,
1122 2283.6761412901737
1123 ],
1124 [
1125 2216.575840805555,
1126 1681.4658930485878,
1127 1967.8035521340892
1128 ],
1129 [
1130 2284.324338870431,
1131 1603.6328805329863,
1132 2469.109038659215
1133 ]
1134 ]
1135 },
1136 {
1137 "anchor_id": "M019",
1138 "anchor_name_normalised": "AIN SHAMS PLAZA",
1139 "knn": [
1140 {
1141 "shop_id": "S08667",
1142 "normalised_name": "LOCAL SHOP 08667",
1143 "distance_m": 684.0996579797446,
1144 "within_1km": true
1145 },
1146 {
1147 "shop_id": "S07904",
1148 "normalised_name": "OSCAR GRAND STORES",
1149 "distance_m": 1176.893080438831,
1150 "within_1km": false
1151 },
1152 {
1153 "shop_id": "S01200",
1154 "normalised_name": "ABOU ZEKRY",
1155 "distance_m": 1257.3414752733888,
1156 "within_1km": false
1157 },
1158 {
1159 "shop_id": "S07089",
1160 "normalised_name": "LOCAL SHOP 07089",
1161 "distance_m": 1279.0357696977744,
1162 "within_1km": false
1163 },
1164 {
1165 "shop_id": "S04445",
1166 "normalised_name": "SEOUDI SUPERMARKET",
1167 "distance_m": 1382.4511076880806,
1168 "within_1km": false
1169 }
1170 ],
1171 "full_distance_matrix_m": [
1172 [
1173 2253.827368722319,
1174 1818.6634054951667,
1175 1589.2926110525311
1176 ],
1177 [
1178 858.6201100324865,
1179 3079.541539829715,
1180 2777.4969541277324
1181 ],
1182 [
1183 682.6889026845546,
1184 3185.3852701471656,
1185 2466.289650955246
1186 ],
1187 [
1188 700.3709488814691,
1189 3198.7606985978905,
1190 2734.9770391523048
1191 ],
1192 [
1193 550.4296116468323,
1194 3312.139319916,
1195 2573.143405782215
1196 ]
1197 ]
1198 },
1199 {
1200 "anchor_id": "M020",
1201 "anchor_name_normalised": "ABBASIYA JUNCTION",
1202 "knn": [
1203 {
1204 "shop_id": "S04479",
1205 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
1206 "distance_m": 533.8840304045726,
1207 "within_1km": true
1208 },
1209 {
1210 "shop_id": "S00183",
1211 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1212 "distance_m": 542.8963509721391,
1213 "within_1km": true
1214 },
1215 {
1216 "shop_id": "S02604",
1217 "normalised_name": "LOCAL SHOP 02604",
1218 "distance_m": 876.244824297051,
1219 "within_1km": true
1220 },
1221 {
1222 "shop_id": "S08735",
1223 "normalised_name": "SEOUDI SUPERMARKET",
1224 "distance_m": 1519.8205245264585,
1225 "within_1km": false
1226 },
1227 {
1228 "shop_id": "S08901",
1229 "normalised_name": "LOCAL SHOP 08901",
1230 "distance_m": 1550.5761817107218,
1231 "within_1km": false
1232 }
1233 ],
1234 "full_distance_matrix_m": [
1235 [
1236 2182.677279804542,
1237 1731.180965536903,
1238 2721.0146097371116
1239 ],
1240 [
1241 2461.6923314864202,
1242 2158.077198336684,
1243 2400.628552225825
1244 ],
1245 [
1246 2804.7116960475405,
1247 2443.7734869776764,
1248 2322.5898167171567
1249 ],
1250 [
1251 2132.578563708277,
1252 3707.335151803096,
1253 840.3492758458228
1254 ],
1255 [
1256 2179.370476669656,
1257 3743.0012153155785,
1258 793.3010810396031
1259 ]
1260 ]
1261 },
1262 {
1263 "anchor_id": "M021",
1264 "anchor_name_normalised": "BOULAQ EDGE",
1265 "knn": [
1266 {
1267 "shop_id": "S02452",
1268 "normalised_name": "HYPERONE",
1269 "distance_m": 143.1241609116162,
1270 "within_1km": true
1271 },
1272 {
1273 "shop_id": "S04480",
1274 "normalised_name": "KHEIR ZAMAN",
1275 "distance_m": 155.55038038330025,
1276 "within_1km": true
1277 },
1278 {
1279 "shop_id": "S02622",
1280 "normalised_name": "CARREFOUR",
1281 "distance_m": 218.84497670307692,
1282 "within_1km": true
1283 },
1284 {
1285 "shop_id": "S03134",
1286 "normalised_name": "METRO",
1287 "distance_m": 232.59502642875754,
1288 "within_1km": true
1289 },
1290 {
1291 "shop_id": "S01855",
1292 "normalised_name": "ABU ZIKRI",
1293 "distance_m": 277.90772584339544,
1294 "within_1km": true
1295 }
1296 ],
1297 "full_distance_matrix_m": [
1298 [
1299 1794.2753798350234,
1300 2265.7139320806596,
1301 2176.7319614651688
1302 ],
1303 [
1304 1779.4142719821407,
1305 2260.5135191479403,
1306 2183.8322346874083
1307 ],
1308 [
1309 1717.6896580007617,
1310 2278.1079573762568,
1311 2176.387665769166
1312 ],
1313 [
1314 1702.9528607990133,
1315 2277.0171460598835,
1316 2180.3776746662165
1317 ],
1318 [
1319 1817.5570359835367,
1320 2466.625271671516,
1321 1975.0632969454878
1322 ]
1323 ]
1324 },
1325 {
1326 "anchor_id": "M022",
1327 "anchor_name_normalised": "GARBIYA PLAZA",
1328 "knn": [
1329 {
1330 "shop_id": "S00964",
1331 "normalised_name": "HYPERONE",
1332 "distance_m": 289.51834290291646,
1333 "within_1km": true
1334 },
1335 {
1336 "shop_id": "S05290",
1337 "normalised_name": "LOCAL SHOP 05290",
1338 "distance_m": 299.54978355732356,
1339 "within_1km": true
1340 },
1341 {
1342 "shop_id": "S08907",
1343 "normalised_name": "LOCAL SHOP 08907",
1344 "distance_m": 386.38811579473196,
1345 "within_1km": true
1346 },
1347 {
1348 "shop_id": "S06907",
1349 "normalised_name": "HYPERONE",
1350 "distance_m": 413.3161064345021,
1351 "within_1km": true
1352 },
1353 {
1354 "shop_id": "S05230",
1355 "normalised_name": "SEOUDI MARKET",
1356 "distance_m": 436.67983544902154,
1357 "within_1km": true
1358 }
1359 ],
1360 "full_distance_matrix_m": [
1361 [
1362 1713.9523500707226,
1363 2162.8362045645863,
1364 2047.8577026193373
1365 ],
1366 [
1367 1839.9535186244389,
1368 2059.5987872725245,
1369 1941.9851293960164
1370 ],
1371 [
1372 2138.0840816826185,
1373 1781.7646896796691,
1374 2564.842672422845
1375 ],
1376 [
1377 2310.764117477486,
1378 1565.207385342791,
1379 2075.9476133461067
1380 ],
1381 [
1382 1909.2394983294405,
1383 2045.532165242939,
1384 1787.3561767400536
1385 ]
1386 ]
1387 },
1388 {
1389 "anchor_id": "M023",
1390 "anchor_name_normalised": "SAKAKINI APPROACH",
1391 "knn": [
1392 {
1393 "shop_id": "S07861",
1394 "normalised_name": "LOCAL SHOP 07861",
1395 "distance_m": 431.1948144298982,
1396 "within_1km": true
1397 },
1398 {
1399 "shop_id": "S06043",
1400 "normalised_name": "OSCAR GRAND STORES",
1401 "distance_m": 547.5408447385797,
1402 "within_1km": true
1403 },
1404 {
1405 "shop_id": "S09406",
1406 "normalised_name": "CARREFOUR EGYPT",
1407 "distance_m": 548.9206787644811,
1408 "within_1km": true
1409 },
1410 {
1411 "shop_id": "S05303",
1412 "normalised_name": "LOCAL SHOP 05303",
1413 "distance_m": 576.1699040165486,
1414 "within_1km": true
1415 },
1416 {
1417 "shop_id": "S02485",
1418 "normalised_name": "LOCAL SHOP 02485",
1419 "distance_m": 589.7690715357046,
1420 "within_1km": true
1421 }
1422 ],
1423 "full_distance_matrix_m": [
1424 [
1425 1924.0047414103071,
1426 2029.1673528791073,
1427 2645.4212356832304
1428 ],
1429 [
1430 1485.0337037210072,
1431 2416.988906602306,
1432 2540.145012699295
1433 ],
1434 [
1435 2272.404182318125,
1436 1699.0768031589844,
1437 1778.7619662395527
1438 ],
1439 [
1440 1488.7253701891314,
1441 2428.086657724222,
1442 1952.4521714778202
1443 ],
1444 [
1445 1511.7201712527149,
1446 2420.301106868626,
1447 2623.7346747647316
1448 ]
1449 ]
1450 },
1451 {
1452 "anchor_id": "M024",
1453 "anchor_name_normalised": "DAR EL SALAAM",
1454 "knn": [
1455 {
1456 "shop_id": "S08247",
1457 "normalised_name": "LOCAL SHOP 08247",
1458 "distance_m": 303.7715553270038,
1459 "within_1km": true
1460 },
1461 {
1462 "shop_id": "S06329",
1463 "normalised_name": "LOCAL SHOP 06329",
1464 "distance_m": 491.1166276130505,
1465 "within_1km": true
1466 },
1467 {
1468 "shop_id": "S08710",
1469 "normalised_name": "LOCAL SHOP 08710",
1470 "distance_m": 504.70580510056124,
1471 "within_1km": true
1472 },
1473 {
1474 "shop_id": "S09186",
1475 "normalised_name": "KHEIR ZAMAN",
1476 "distance_m": 727.1381609050588,
1477 "within_1km": true
1478 },
1479 {
1480 "shop_id": "S08321",
1481 "normalised_name": "KHEIR ZAMAN",
1482 "distance_m": 888.8616133708905,
1483 "within_1km": true
1484 }
1485 ],
1486 "full_distance_matrix_m": [
1487 [
1488 2132.6731672273595,
1489 1756.1834962667037,
1490 1988.8492435786827
1491 ],
1492 [
1493 2419.232059909494,
1494 1441.3316900456923,
1495 2313.9113699588606
1496 ],
1497 [
1498 1438.7324047816662,
1499 2426.383575569832,
1500 2173.317483910219
1501 ],
1502 [
1503 2118.1353815960015,
1504 2004.797296535227,
1505 1493.6711329592345
1506 ],
1507 [
1508 1136.3107773659556,
1509 2781.5317641590054,
1510 2086.8389809734235
1511 ]
1512 ]
1513 },
1514 {
1515 "anchor_id": "M025",
1516 "anchor_name_normalised": "EL MARG HUB",
1517 "knn": [
1518 {
1519 "shop_id": "S06563",
1520 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1521 "distance_m": 95.12558429869074,
1522 "within_1km": true
1523 },
1524 {
1525 "shop_id": "S07868",
1526 "normalised_name": "OSCAR",
1527 "distance_m": 238.9301245897368,
1528 "within_1km": true
1529 },
1530 {
1531 "shop_id": "S04428",
1532 "normalised_name": "LOCAL SHOP 04428",
1533 "distance_m": 295.7640206059658,
1534 "within_1km": true
1535 },
1536 {
1537 "shop_id": "S09140",
1538 "normalised_name": "LOCAL SHOP 09140",
1539 "distance_m": 477.1403198199402,
1540 "within_1km": true
1541 },
1542 {
1543 "shop_id": "S05093",
1544 "normalised_name": "LOCAL SHOP 05093",
1545 "distance_m": 498.72631896592196,
1546 "within_1km": true
1547 }
1548 ],
1549 "full_distance_matrix_m": [
1550 [
1551 1846.016850950575,
1552 2014.4655163423067,
1553 2262.8065343928874
1554 ],
1555 [
1556 1829.9212117309032,
1557 2052.6088472768997,
1558 2430.69175297327
1559 ],
1560 [
1561 1831.1386184118976,
1562 2066.27280605199,
1563 2490.7815358186076
1564 ],
1565 [
1566 1843.9551188977769,
1567 2121.940256980925,
1568 2676.13693110598
1569 ],
1570 [
1571 2366.763817436219,
1572 1530.961415108951,
1573 1996.4602419151063
1574 ]
1575 ]
1576 },
1577 {
1578 "anchor_id": "M026",
1579 "anchor_name_normalised": "HELWAN CENTRE",
1580 "knn": [
1581 {
1582 "shop_id": "S00688",
1583 "normalised_name": "LOCAL SHOP 00688",
1584 "distance_m": 392.5586511060098,
1585 "within_1km": true
1586 },
1587 {
1588 "shop_id": "S09139",
1589 "normalised_name": "LOCAL SHOP 09139",
1590 "distance_m": 498.6898178044325,
1591 "within_1km": true
1592 },
1593 {
1594 "shop_id": "S07966",
1595 "normalised_name": "LOCAL SHOP 07966",
1596 "distance_m": 632.700793055098,
1597 "within_1km": true
1598 },
1599 {
1600 "shop_id": "S06235",
1601 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1602 "distance_m": 635.9608767777365,
1603 "within_1km": true
1604 },
1605 {
1606 "shop_id": "S06933",
1607 "normalised_name": "SPINNEYS CAIRO",
1608 "distance_m": 695.1426282008323,
1609 "within_1km": true
1610 }
1611 ],
1612 "full_distance_matrix_m": [
1613 [
1614 2280.327646779559,
1615 1598.7435268378388,
1616 2433.075679457458
1617 ],
1618 [
1619 1886.6624754709298,
1620 2094.2822056800082,
1621 1733.3147410448998
1622 ],
1623 [
1624 2535.0629160323774,
1625 1349.7158468246641,
1626 2500.0589961672763
1627 ],
1628 [
1629 2339.3214340955215,
1630 1668.504982946146,
1631 2771.141270018388
1632 ],
1633 [
1634 2593.8485369626424,
1635 1298.4737441305465,
1636 2540.289549729795
1637 ]
1638 ]
1639 },
1640 {
1641 "anchor_id": "M027",
1642 "anchor_name_normalised": "MAASARA CROSSING",
1643 "knn": [
1644 {
1645 "shop_id": "S01296",
1646 "normalised_name": "SEOUDI",
1647 "distance_m": 50.30439580908293,
1648 "within_1km": true
1649 },
1650 {
1651 "shop_id": "S09440",
1652 "normalised_name": "KHEIR ZAMAN",
1653 "distance_m": 193.50361755248164,
1654 "within_1km": true
1655 },
1656 {
1657 "shop_id": "S09344",
1658 "normalised_name": "CARREFOUR",
1659 "distance_m": 292.1455578486927,
1660 "within_1km": true
1661 },
1662 {
1663 "shop_id": "S09777",
1664 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1665 "distance_m": 385.1789866962899,
1666 "within_1km": true
1667 },
1668 {
1669 "shop_id": "S00107",
1670 "normalised_name": "CARREFOUR",
1671 "distance_m": 450.79034804135176,
1672 "within_1km": true
1673 }
1674 ],
1675 "full_distance_matrix_m": [
1676 [
1677 1978.281884009472,
1678 1881.2963211945312,
1679 2230.96275788161
1680 ],
1681 [
1682 1750.8390638988976,
1683 2111.2369591817637,
1684 2154.4192129655657
1685 ],
1686 [
1687 2146.5711751638637,
1688 1735.191999747973,
1689 2021.4033750403437
1690 ],
1691 [
1692 1907.3777204348344,
1693 2026.3769011136835,
1694 2598.149486367052
1695 ],
1696 [
1697 1839.1289499523343,
1698 2114.6073596843985,
1699 2648.965332211819
1700 ]
1701 ]
1702 },
1703 {
1704 "anchor_id": "M028",
1705 "anchor_name_normalised": "TORA EDGE",
1706 "knn": [
1707 {
1708 "shop_id": "S07222",
1709 "normalised_name": "CARREFOUR EGYPT",
1710 "distance_m": 1038.647391249567,
1711 "within_1km": false
1712 },
1713 {
1714 "shop_id": "S08146",
1715 "normalised_name": "LOCAL SHOP 08146",
1716 "distance_m": 1146.4814793156884,
1717 "within_1km": false
1718 },
1719 {
1720 "shop_id": "S00413",
1721 "normalised_name": "LOCAL SHOP 00413",
1722 "distance_m": 1162.898346623925,
1723 "within_1km": false
1724 },
1725 {
1726 "shop_id": "S07665",
1727 "normalised_name": "CARREFOUR",
1728 "distance_m": 1370.9550398089314,
1729 "within_1km": false
1730 },
1731 {
1732 "shop_id": "S08878",
1733 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
1734 "distance_m": 1379.8701064923816,
1735 "within_1km": false
1736 }
1737 ],
1738 "full_distance_matrix_m": [
1739 [
1740 2022.3031209041312,
1741 2348.4092386495886,
1742 3244.430857967576
1743 ],
1744 [
1745 1326.0987485101753,
1746 2884.210758977075,
1747 1678.602283192458
1748 ],
1749 [
1750 1677.6767157311933,
1751 2708.7339019933934,
1752 3274.4270356593684
1753 ],
1754 [
1755 561.6596656088414,
1756 3300.2213341066963,
1757 2565.8451356194964
1758 ],
1759 [
1760 1463.3767653012455,
1761 3018.900591657248,
1762 3383.0311962219066
1763 ]
1764 ]
1765 },
1766 {
1767 "anchor_id": "M029",
1768 "anchor_name_normalised": "MOKATTAM HEIGHTS",
1769 "knn": [
1770 {
1771 "shop_id": "S04699",
1772 "normalised_name": "ABOU ZEKRY",
1773 "distance_m": 926.1133200433566,
1774 "within_1km": true
1775 },
1776 {
1777 "shop_id": "S08181",
1778 "normalised_name": "CARREFOUR EGYPT",
1779 "distance_m": 1338.4185443902384,
1780 "within_1km": false
1781 },
1782 {
1783 "shop_id": "S08735",
1784 "normalised_name": "SEOUDI SUPERMARKET",
1785 "distance_m": 1715.744166223812,
1786 "within_1km": false
1787 },
1788 {
1789 "shop_id": "S08901",
1790 "normalised_name": "LOCAL SHOP 08901",
1791 "distance_m": 1724.5952583670617,
1792 "within_1km": false
1793 },
1794 {
1795 "shop_id": "S05829",
1796 "normalised_name": "SPINEYS",
1797 "distance_m": 1792.8402244185731,
1798 "within_1km": false
1799 }
1800 ],
1801 "full_distance_matrix_m": [
1802 [
1803 1622.4428644808077,
1804 2555.6697813726555,
1805 1526.8257430730068
1806 ],
1807 [
1808 3255.384511654304,
1809 657.9522434613671,
1810 2787.1720972270386
1811 ],
1812 [
1813 3553.833575016254,
1814 840.3492758458228,
1815 2132.578563708277
1816 ],
1817 [
1818 3573.159483530612,
1819 793.3010810396031,
1820 2179.370476669656
1821 ],
1822 [
1823 3658.0340871700205,
1824 704.0165384983723,
1825 2286.9531951465624
1826 ]
1827 ]
1828 },
1829 {
1830 "anchor_id": "M030",
1831 "anchor_name_normalised": "NOZHA PROMENADE",
1832 "knn": [
1833 {
1834 "shop_id": "S08181",
1835 "normalised_name": "CARREFOUR EGYPT",
1836 "distance_m": 657.9522434613671,
1837 "within_1km": true
1838 },
1839 {
1840 "shop_id": "S05829",
1841 "normalised_name": "SPINEYS",
1842 "distance_m": 704.0165384983723,
1843 "within_1km": true
1844 },
1845 {
1846 "shop_id": "S08901",
1847 "normalised_name": "LOCAL SHOP 08901",
1848 "distance_m": 793.3010810396031,
1849 "within_1km": true
1850 },
1851 {
1852 "shop_id": "S08735",
1853 "normalised_name": "SEOUDI SUPERMARKET",
1854 "distance_m": 840.3492758458228,
1855 "within_1km": true
1856 },
1857 {
1858 "shop_id": "S01591",
1859 "normalised_name": "METRO MARKET",
1860 "distance_m": 932.5918427641366,
1861 "within_1km": true
1862 }
1863 ],
1864 "full_distance_matrix_m": [
1865 [
1866 1338.4185443902384,
1867 2531.719439640108,
1868 2070.5277465741988
1869 ],
1870 [
1871 1792.8402244185731,
1872 1584.6061503065903,
1873 2882.9157654971996
1874 ],
1875 [
1876 1724.5952583670617,
1877 1550.5761817107218,
1878 2947.077867103685
1879 ],
1880 [
1881 1715.744166223812,
1882 1519.8205245264585,
1883 2988.882883492248
1884 ],
1885 [
1886 2192.405943934767,
1887 3148.5155747292247,
1888 1287.3180202950216
1889 ]
1890 ]
1891 },
1892 {
1893 "anchor_id": "M031",
1894 "anchor_name_normalised": "SHERATON HELIOPOLIS",
1895 "knn": [
1896 {
1897 "shop_id": "S00527",
1898 "normalised_name": "LOCAL SHOP 00527",
1899 "distance_m": 253.7596125751528,
1900 "within_1km": true
1901 },
1902 {
1903 "shop_id": "S01047",
1904 "normalised_name": "LOCAL SHOP 01047",
1905 "distance_m": 283.246388808315,
1906 "within_1km": true
1907 },
1908 {
1909 "shop_id": "S04959",
1910 "normalised_name": "LOCAL SHOP 04959",
1911 "distance_m": 346.5915949884266,
1912 "within_1km": true
1913 },
1914 {
1915 "shop_id": "S06835",
1916 "normalised_name": "SPINNEYS",
1917 "distance_m": 350.5277927644183,
1918 "within_1km": true
1919 },
1920 {
1921 "shop_id": "S08893",
1922 "normalised_name": "METRO",
1923 "distance_m": 350.5277927644183,
1924 "within_1km": true
1925 }
1926 ],
1927 "full_distance_matrix_m": [
1928 [
1929 1677.4443325360598,
1930 2202.958446098429,
1931 2259.7512981823693
1932 ],
1933 [
1934 1650.181364181898,
1935 2278.639968221351,
1936 2190.6551628335355
1937 ],
1938 [
1939 1923.8325573847915,
1940 2561.9716554921415,
1941 1872.7681601061568
1942 ],
1943 [
1944 2142.3882584422627,
1945 1934.0543636868153,
1946 2517.1190957608624
1947 ],
1948 [
1949 2142.3882584422627,
1950 1934.0543636868153,
1951 2517.1190957608624
1952 ]
1953 ]
1954 },
1955 {
1956 "anchor_id": "M032",
1957 "anchor_name_normalised": "TRIUMPH SQUARE",
1958 "knn": [
1959 {
1960 "shop_id": "S01025",
1961 "normalised_name": "LOCAL SHOP 01025",
1962 "distance_m": 79.83756885715013,
1963 "within_1km": true
1964 },
1965 {
1966 "shop_id": "S02664",
1967 "normalised_name": "LOCAL SHOP 02664",
1968 "distance_m": 157.66656231613084,
1969 "within_1km": true
1970 },
1971 {
1972 "shop_id": "S02254",
1973 "normalised_name": "LOCAL SHOP 02254",
1974 "distance_m": 164.90230028067674,
1975 "within_1km": true
1976 },
1977 {
1978 "shop_id": "S02175",
1979 "normalised_name": "ABOU ZEKRY",
1980 "distance_m": 174.60568615294582,
1981 "within_1km": true
1982 },
1983 {
1984 "shop_id": "S01506",
1985 "normalised_name": "LOCAL SHOP 01506",
1986 "distance_m": 192.93799451313052,
1987 "within_1km": true
1988 }
1989 ],
1990 "full_distance_matrix_m": [
1991 [
1992 1929.059067072471,
1993 1932.916468256681,
1994 2296.874167306396
1995 ],
1996 [
1997 1780.2544880608473,
1998 2079.6921654515395,
1999 2271.2840176007116
2000 ],
<system-reminder>Showed lines 1-2000 of 6302. Re-call Read with offset=2001 to continue, or raise limit.</system-reminder>
1:29
Write
/work/solve.py
content · 135 lines · py
import geopandas as gpd
import pandas as pd
import json
import numpy as np
from collections import Counter
def normalize_text(text):
if not isinstance(text, str):
return ""
return " ".join(text.strip().upper().split())
def solve():
# Load data
shops = gpd.read_file("/work/cairo_retail.gpkg", layer="shops")
anchors = gpd.read_file("/work/cairo_retail.gpkg", layer="anchors")
# 1. Normalize Names & Handle Chains
# "the same shop_id always carries the same normalised_name,
# and all shops belonging to one chain share a single canonical spelling."
# Step A: Basic normalization
shops['temp_name'] = shops['raw_name'].apply(normalize_text)
# Step B: Find canonical names for chains.
# Let's group by temp_name. If multiple temp_names are very similar,
# they belong to the same chain.
# However, without a similarity tool, let's assume the "canonical" name
# is the one that appears most frequently in the raw_name (or its normalized form).
# Actually, let's see what's in there. We can group by name.
# Let's try a simple approach: for each unique normalized name,
# find the most frequent raw name? No, we want the most frequent normalized name.
# Let's count occurrences of each normalized name.
name_counts = shops['temp_name'].value_counts()
# But the instruction "all shops belonging to one chain share a single canonical spelling"
# suggests that if 'OSCAR' and 'OSCAR GRAND STORES' are both present,
# they might be the same chain.
# Without fuzzy matching, let's check if there's a pattern.
# Let's try grouping by the first word if it's a known chain,
# but that's too specific.
# Let's use the most frequent normalized name to represent a "cluster"
# if we had one. Since we don't, we will implement a basic version:
# For each shop, its normalised_name is the most frequent normalized name
# among shops that have a similar normalized name.
# Since I can't use fuzzywuzzy, I'll just use the normalized name as-is
# for now, which handles the case "OSCAR" vs "OSCAR " (whitespace).
shops['normalised_name'] = shops['temp_name']
# Re-check: "all shops belonging to one chain share a single canonical spelling."
# Looking at the output I saw earlier:
# S07233: SEOUDI MARKET
# S08811: SEOUDI SUPERMARKET
# S02587: SEOUDI
# These clearly belong to the same chain "SEOUDI".
# Let's implement a simple chain grouping:
# 1. For each name, take the first word.
# 2. Use the most frequent first word to define the chain.
# This is risky. Let's try something better:
# Group names by their first word, and for each group, use the most frequent normalized name.
def get_first_word(s):
words = s.split()
return words[0] if words else ""
shops['first_word'] = shops['temp_name'].apply(get_first_word)
# For each first_word, find the most common temp_name
canonical_map = {}
for fw, group in shops.groupby('first_word'):
if fw:
most_common_name = group['temp_name'].mode()[0]
canonical_map[fw] = most_common_name
# Apply canonical name
shops['normalised_name'] = shops['temp_name'].apply(lambda x: canonical_map.get(get_first_word(x), x))
# Anchor normalization
anchors['anchor_name_normalised'] = anchors['anchor_name'].apply(normalize_text)
# 2. Distance calculations
results = []
for i, anchor in anchors.iterrows():
a_id = anchor['anchor_id']
a_name = anchor['anchor_name_normalised']
a_geom = anchor.geometry
# Find 5 nearest shops
shops_copy = shops.copy()
shops_copy['dist_to_anchor'] = shops_copy.distance(a_geom)
knn_shops = shops_copy.nsmallest(5, 'dist_to_anchor')
knn_list = []
for _, shop_row in knn_shops.iterrows():
knn_list.append({
"shop_id": shop_row['shop_id'],
"normalised_name": shop_row['normalised_name'],
"distance_m": float(shop_row['dist_to_anchor']),
"within_1km": bool(shop_row['dist_to_anchor'] <= 1000.0)
})
# Find 3 closest sibling anchors
anchors_copy = anchors.copy()
anchors_copy['dist_to_anchor'] = anchors_copy.distance(a_geom)
sibling_anchors = anchors_copy[anchors_copy['anchor_id'] != a_id].nsmallest(3, 'dist_to_anchor')
sibling_geoms = sibling_anchors.geometry.tolist()
# Matrix 5 (shops) x 3 (siblings)
matrix = []
for _, shop_row in knn_shops.iterrows():
shop_geom = shop_row.geometry
row = []
for s_geom in sibling_geoms:
row.append(float(shop_geom.distance(s_geom)))
matrix.append(row)
results.append({
"anchor_id": a_id,
"anchor_name_normalised": a_name,
"knn": knn_list,
"full_distance_matrix_m": matrix
})
with open("/work/market_neighbourhoods.json", "w") as f:
json.dump(results, f, indent=2)
if __name__ == "__main__":
solve()
Wrote /work/solve.py (5241 chars).
1:34
Bash
python /work/solve.py
python /work/solve.py(no output)
1:46
Read
/work/market_neighbourhoods.json
1 [
2 {
3 "anchor_id": "M001",
4 "anchor_name_normalised": "TAHRIR SQUARE PLAZA",
5 "knn": [
6 {
7 "shop_id": "S07233",
8 "normalised_name": "SEOUDI",
9 "distance_m": 565.5774729861073,
10 "within_1km": true
11 },
12 {
13 "shop_id": "S05762",
14 "normalised_name": "OSCAR",
15 "distance_m": 722.3301477157331,
16 "within_1km": true
17 },
18 {
19 "shop_id": "S08811",
20 "normalised_name": "SEOUDI",
21 "distance_m": 851.1481358488758,
22 "within_1km": true
23 },
24 {
25 "shop_id": "S01722",
26 "normalised_name": "LOCAL SHOP 00002",
27 "distance_m": 852.4416831354031,
28 "within_1km": true
29 },
30 {
31 "shop_id": "S04111",
32 "normalised_name": "LOCAL SHOP 00002",
33 "distance_m": 868.96252213481,
34 "within_1km": true
35 }
36 ],
37 "full_distance_matrix_m": [
38 [
39 2487.0078080337594,
40 2174.324012747061,
41 3254.5114413442143
42 ],
43 [
44 1534.4843964513216,
45 1756.6458865635916,
46 2217.728977070344
47 ],
48 [
49 1083.478376599746,
50 2432.536076922434,
51 2523.2160443438365
52 ],
53 [
54 1080.9227579664303,
55 2423.437856092515,
56 2512.907664013948
57 ],
58 [
59 2589.6466467244945,
60 1669.1438268232814,
61 2955.6767888178206
62 ]
63 ]
64 },
65 {
66 "anchor_id": "M002",
67 "anchor_name_normalised": "ZAMALEK RIVERSIDE",
68 "knn": [
69 {
70 "shop_id": "S07867",
71 "normalised_name": "LOCAL SHOP 00002",
72 "distance_m": 269.65233763241866,
73 "within_1km": true
74 },
75 {
76 "shop_id": "S08880",
77 "normalised_name": "LOCAL SHOP 00002",
78 "distance_m": 312.5775921586124,
79 "within_1km": true
80 },
81 {
82 "shop_id": "S01618",
83 "normalised_name": "HYPERONE",
84 "distance_m": 376.4314762570364,
85 "within_1km": true
86 },
87 {
88 "shop_id": "S08973",
89 "normalised_name": "\u0645\u062a\u0631\u0648",
90 "distance_m": 398.4429175977933,
91 "within_1km": true
92 },
93 {
94 "shop_id": "S03901",
95 "normalised_name": "LOCAL SHOP 00002",
96 "distance_m": 553.5329005009304,
97 "within_1km": true
98 }
99 ],
100 "full_distance_matrix_m": [
101 [
102 1944.4911846390683,
103 1953.9438781070432,
104 1947.4413403948372
105 ],
106 [
107 1618.2703088581297,
108 2242.837558260415,
109 2252.1949702157335
110 ],
111 [
112 1563.2932886368146,
113 2300.7099648556714,
114 2321.0268460924804
115 ],
116 [
117 1556.2002411370236,
118 2312.9067497584283,
119 2370.064582448898
120 ],
121 [
122 1378.4337559345038,
123 2483.2321926475374,
124 2317.786642896787
125 ]
126 ]
127 },
128 {
129 "anchor_id": "M003",
130 "anchor_name_normalised": "MAADI CORNICHE",
131 "knn": [
132 {
133 "shop_id": "S04460",
134 "normalised_name": "OSCAR",
135 "distance_m": 72.95310761979502,
136 "within_1km": true
137 },
138 {
139 "shop_id": "S08308",
140 "normalised_name": "SEOUDI",
141 "distance_m": 88.72767249258234,
142 "within_1km": true
143 },
144 {
145 "shop_id": "S09296",
146 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
147 "distance_m": 98.21189301247169,
148 "within_1km": true
149 },
150 {
151 "shop_id": "S09427",
152 "normalised_name": "CARREFOUR",
153 "distance_m": 99.57756944336273,
154 "within_1km": true
155 },
156 {
157 "shop_id": "S07126",
158 "normalised_name": "LOCAL SHOP 00002",
159 "distance_m": 116.75771956129789,
160 "within_1km": true
161 }
162 ],
163 "full_distance_matrix_m": [
164 [
165 1943.3652464180357,
166 1920.3236565903114,
167 2145.04282095631
168 ],
169 [
170 1930.347156605599,
171 1934.725048745786,
172 2128.348539210285
173 ],
174 [
175 2028.6742634404964,
176 1832.3441511159044,
177 2216.2298388589775
178 ],
179 [
180 1943.5455934945362,
181 1922.5272088369113,
182 2118.054325565629
183 ],
184 [
185 1826.382123942283,
186 2036.011727251994,
187 2270.837232503956
188 ]
189 ]
190 },
191 {
192 "anchor_id": "M004",
193 "anchor_name_normalised": "HELIOPOLIS SQUARE",
194 "knn": [
195 {
196 "shop_id": "S07243",
197 "normalised_name": "LOCAL SHOP 00002",
198 "distance_m": 16.757831352132488,
199 "within_1km": true
200 },
201 {
202 "shop_id": "S08211",
203 "normalised_name": "ABOU ZEKRY",
204 "distance_m": 71.72654511660338,
205 "within_1km": true
206 },
207 {
208 "shop_id": "S09992",
209 "normalised_name": "LOCAL SHOP 00002",
210 "distance_m": 73.41287544791905,
211 "within_1km": true
212 },
213 {
214 "shop_id": "S02270",
215 "normalised_name": "LOCAL SHOP 00002",
216 "distance_m": 73.47956441875495,
217 "within_1km": true
218 },
219 {
220 "shop_id": "S04115",
221 "normalised_name": "METRO",
222 "distance_m": 100.78571485234073,
223 "within_1km": true
224 }
225 ],
226 "full_distance_matrix_m": [
227 [
228 1921.3994991179761,
229 1939.7238079283934,
230 2231.101488205238
231 ],
232 [
233 1906.4444066225778,
234 1956.9204820995826,
235 2284.324622501632
236 ],
237 [
238 1974.2425008374548,
239 1888.628794763346,
240 2277.078707134747
241 ],
242 [
243 1998.0470622679375,
244 1863.4161218393297,
245 2188.647181422321
246 ],
247 [
248 1958.0479261583657,
249 1907.886624767009,
250 2119.592832641312
251 ]
252 ]
253 },
254 {
255 "anchor_id": "M005",
256 "anchor_name_normalised": "NEW CAIRO TAGAMOA",
257 "knn": [
258 {
259 "shop_id": "S06518",
260 "normalised_name": "LOCAL SHOP 00002",
261 "distance_m": 28.135101381065994,
262 "within_1km": true
263 },
264 {
265 "shop_id": "S05810",
266 "normalised_name": "LOCAL SHOP 00002",
267 "distance_m": 37.5193086732093,
268 "within_1km": true
269 },
270 {
271 "shop_id": "S07612",
272 "normalised_name": "LOCAL SHOP 00002",
273 "distance_m": 91.17617402150849,
274 "within_1km": true
275 },
276 {
277 "shop_id": "S08564",
278 "normalised_name": "LOCAL SHOP 00002",
279 "distance_m": 127.99872816542131,
280 "within_1km": true
281 },
282 {
283 "shop_id": "S06537",
284 "normalised_name": "LOCAL SHOP 00002",
285 "distance_m": 174.57781624235815,
286 "within_1km": true
287 }
288 ],
289 "full_distance_matrix_m": [
290 [
291 1957.69173028252,
292 1903.3585086300416,
293 2209.9075708121827
294 ],
295 [
296 1936.291904728657,
297 1925.4392896637053,
298 2179.9357745349057
299 ],
300 [
301 1924.4897492266464,
302 1940.7876574394063,
303 2126.2585643413954
304 ],
305 [
306 1855.7656146790907,
307 2010.618212652097,
308 2116.6290420790197
309 ],
310 [
311 2082.2035945372736,
312 1782.9958750841122,
313 2132.612348368797
314 ]
315 ]
316 },
317 {
318 "anchor_id": "M006",
319 "anchor_name_normalised": "NASR CITY HUB",
320 "knn": [
321 {
322 "shop_id": "S02587",
323 "normalised_name": "SEOUDI",
324 "distance_m": 106.50477238149823,
325 "within_1km": true
326 },
327 {
328 "shop_id": "S00300",
329 "normalised_name": "LOCAL SHOP 00002",
330 "distance_m": 227.65253032103135,
331 "within_1km": true
332 },
333 {
334 "shop_id": "S05940",
335 "normalised_name": "LOCAL SHOP 00002",
336 "distance_m": 253.18826379689676,
337 "within_1km": true
338 },
339 {
340 "shop_id": "S02292",
341 "normalised_name": "OSCAR",
342 "distance_m": 269.5482185686428,
343 "within_1km": true
344 },
345 {
346 "shop_id": "S02236",
347 "normalised_name": "LOCAL SHOP 00002",
348 "distance_m": 356.9202878258021,
349 "within_1km": true
350 }
351 ],
352 "full_distance_matrix_m": [
353 [
354 1935.540445660128,
355 1931.3391438782608,
356 2110.573644617887
357 ],
358 [
359 1754.4487064155114,
360 2116.4657923970435,
361 2361.495135254868
362 ],
363 [
364 1688.5443638736308,
365 2175.029606616673,
366 2161.0936556365787
367 ],
368 [
369 1835.4992911085928,
370 2056.663102717168,
371 1974.786747930339
372 ],
373 [
374 2018.2010478243594,
375 1906.6158710142874,
376 1865.533612736454
377 ]
378 ]
379 },
380 {
381 "anchor_id": "M007",
382 "anchor_name_normalised": "MOHANDESSIN CENTRE",
383 "knn": [
384 {
385 "shop_id": "S00857",
386 "normalised_name": "LOCAL SHOP 00002",
387 "distance_m": 60.928713870077,
388 "within_1km": true
389 },
390 {
391 "shop_id": "S09356",
392 "normalised_name": "LOCAL SHOP 00002",
393 "distance_m": 522.8746383702942,
394 "within_1km": true
395 },
396 {
397 "shop_id": "S06624",
398 "normalised_name": "LOCAL SHOP 00002",
399 "distance_m": 549.4165800396148,
400 "within_1km": true
401 },
402 {
403 "shop_id": "S02306",
404 "normalised_name": "LOCAL SHOP 00002",
405 "distance_m": 647.8538162055585,
406 "within_1km": true
407 },
408 {
409 "shop_id": "S09328",
410 "normalised_name": "LOCAL SHOP 00002",
411 "distance_m": 651.9451270794432,
412 "within_1km": true
413 }
414 ],
415 "full_distance_matrix_m": [
416 [
417 1990.6269449741726,
418 1870.4625360716227,
419 2227.9775820328477
420 ],
421 [
422 1811.604724154596,
423 2172.1765438856014,
424 1738.3731031745378
425 ],
426 [
427 1564.6773386332302,
428 2368.343800935659,
429 1895.300533032697
430 ],
431 [
432 1639.258812682736,
433 2367.6364552919167,
434 1732.5978989016967
435 ],
436 [
437 1640.045398661773,
438 2369.3365425509337,
439 1728.3381351228975
440 ]
441 ]
442 },
443 {
444 "anchor_id": "M008",
445 "anchor_name_normalised": "GARDEN CITY WALK",
446 "knn": [
447 {
448 "shop_id": "S00683",
449 "normalised_name": "LOCAL SHOP 00002",
450 "distance_m": 893.2947456712992,
451 "within_1km": true
452 },
453 {
454 "shop_id": "S06446",
455 "normalised_name": "LOCAL SHOP 00002",
456 "distance_m": 1558.0280661837521,
457 "within_1km": false
458 },
459 {
460 "shop_id": "S01136",
461 "normalised_name": "LOCAL SHOP 00002",
462 "distance_m": 1568.3678538206516,
463 "within_1km": false
464 },
465 {
466 "shop_id": "S08439",
467 "normalised_name": "HYPER ONE",
468 "distance_m": 1591.2754995073196,
469 "within_1km": false
470 },
471 {
472 "shop_id": "S09549",
473 "normalised_name": "LOCAL SHOP 00002",
474 "distance_m": 1755.43113504347,
475 "within_1km": false
476 }
477 ],
478 "full_distance_matrix_m": [
479 [
480 1917.0075308508187,
481 2318.2470988726996,
482 1369.1000937297133
483 ],
484 [
485 3022.7956576658084,
486 1780.5930956916202,
487 1159.2225119969787
488 ],
489 [
490 2937.2900237909366,
491 1935.1306607953838,
492 1005.5305830195045
493 ],
494 [
495 2949.4766576775037,
496 1953.902227097043,
497 986.0606017587595
498 ],
499 [
500 3064.3681328203306,
501 2055.5890119388955,
502 894.5708766798813
503 ]
504 ]
505 },
506 {
507 "anchor_id": "M009",
508 "anchor_name_normalised": "DOKKI MARKET",
509 "knn": [
510 {
511 "shop_id": "S08667",
512 "normalised_name": "LOCAL SHOP 00002",
513 "distance_m": 1589.2926110525311,
514 "within_1km": false
515 },
516 {
517 "shop_id": "S06446",
518 "normalised_name": "LOCAL SHOP 00002",
519 "distance_m": 1780.5930956916202,
520 "within_1km": false
521 },
522 {
523 "shop_id": "S01136",
524 "normalised_name": "LOCAL SHOP 00002",
525 "distance_m": 1935.1306607953838,
526 "within_1km": false
527 },
528 {
529 "shop_id": "S08439",
530 "normalised_name": "HYPER ONE",
531 "distance_m": 1953.902227097043,
532 "within_1km": false
533 },
534 {
535 "shop_id": "S09549",
536 "normalised_name": "LOCAL SHOP 00002",
537 "distance_m": 2055.5890119388955,
538 "within_1km": false
539 }
540 ],
541 "full_distance_matrix_m": [
542 [
543 2671.8002941859654,
544 2316.455824459701,
545 684.0996579797446
546 ],
547 [
548 1558.0280661837521,
549 3371.4257227907947,
550 1444.54371994737
551 ],
552 [
553 1568.3678538206516,
554 3533.0678495132574,
555 1515.184804400465
556 ],
557 [
558 1591.2754995073196,
559 3543.4697747157215,
560 1502.5417428156868
561 ],
562 [
563 1755.43113504347,
564 3580.797688971729,
565 1394.249595027812
566 ]
567 ]
568 },
569 {
570 "anchor_id": "M010",
571 "anchor_name_normalised": "GIZA PYRAMIDS GATE",
572 "knn": [
573 {
574 "shop_id": "S04479",
575 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
576 "distance_m": 1731.180965536903,
577 "within_1km": false
578 },
579 {
580 "shop_id": "S00183",
581 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
582 "distance_m": 2158.077198336684,
583 "within_1km": false
584 },
585 {
586 "shop_id": "S08667",
587 "normalised_name": "LOCAL SHOP 00002",
588 "distance_m": 2316.455824459701,
589 "within_1km": false
590 },
591 {
592 "shop_id": "S02604",
593 "normalised_name": "LOCAL SHOP 00002",
594 "distance_m": 2443.7734869776764,
595 "within_1km": false
596 },
597 {
598 "shop_id": "S06446",
599 "normalised_name": "LOCAL SHOP 00002",
600 "distance_m": 3371.4257227907947,
601 "within_1km": false
602 }
603 ],
604 "full_distance_matrix_m": [
605 [
606 2734.3971776606563,
607 533.8840304045726,
608 2182.677279804542
609 ],
610 [
611 3228.565791013887,
612 542.8963509721391,
613 2461.6923314864202
614 ],
615 [
616 1589.2926110525311,
617 1818.6634054951667,
618 684.0996579797446
619 ],
620 [
621 3615.528227944305,
622 876.244824297051,
623 2804.7116960475405
624 ],
625 [
626 1780.5930956916202,
627 3206.4096692753315,
628 1444.54371994737
629 ]
630 ]
631 },
632 {
633 "anchor_id": "M011",
634 "anchor_name_normalised": "ROXY SQUARE",
635 "knn": [
636 {
637 "shop_id": "S04328",
638 "normalised_name": "ABU ZIKRI",
639 "distance_m": 187.09164983396892,
640 "within_1km": true
641 },
642 {
643 "shop_id": "S05158",
644 "normalised_name": "LOCAL SHOP 00002",
645 "distance_m": 231.29400608856076,
646 "within_1km": true
647 },
648 {
649 "shop_id": "S05294",
650 "normalised_name": "KHEIR ZAMAN",
651 "distance_m": 252.9785956846131,
652 "within_1km": true
653 },
654 {
655 "shop_id": "S09033",
656 "normalised_name": "SPINNEYS CAIRO",
657 "distance_m": 263.68732182798567,
658 "within_1km": true
659 },
660 {
661 "shop_id": "S01560",
662 "normalised_name": "LOCAL SHOP 00002",
663 "distance_m": 417.38758812289393,
664 "within_1km": true
665 }
666 ],
667 "full_distance_matrix_m": [
668 [
669 1795.5339124545674,
670 2096.392447294816,
671 2346.4314186731317
672 ],
673 [
674 2017.573351953057,
675 1999.867439859647,
676 2436.825680019156
677 ],
678 [
679 1986.9924676005692,
680 1967.8572995801014,
681 2467.008291732404
682 ],
683 [
684 1726.26665320315,
685 2384.43821862861,
686 2069.8086980233793
687 ],
688 [
689 1732.2848201214767,
690 2574.030282165838,
691 1885.0416779423379
692 ]
693 ]
694 },
695 {
696 "anchor_id": "M012",
697 "anchor_name_normalised": "RAMSES CROSSING",
698 "knn": [
699 {
700 "shop_id": "S06449",
701 "normalised_name": "LOCAL SHOP 00002",
702 "distance_m": 166.05820638133866,
703 "within_1km": true
704 },
705 {
706 "shop_id": "S01440",
707 "normalised_name": "METRO",
708 "distance_m": 230.59572744304464,
709 "within_1km": true
710 },
711 {
712 "shop_id": "S05105",
713 "normalised_name": "LOCAL SHOP 00002",
714 "distance_m": 242.65541126525213,
715 "within_1km": true
716 },
717 {
718 "shop_id": "S08432",
719 "normalised_name": "LOCAL SHOP 00002",
720 "distance_m": 330.98224895265844,
721 "within_1km": true
722 },
723 {
724 "shop_id": "S01810",
725 "normalised_name": "LOCAL SHOP 00002",
726 "distance_m": 374.1629110364246,
727 "within_1km": true
728 }
729 ],
730 "full_distance_matrix_m": [
731 [
732 2092.9755856605243,
733 1767.8631935424125,
734 2189.293919558164
735 ],
736 [
737 2147.662821357611,
738 1716.0014421890585,
739 2147.2656981097853
740 ],
741 [
742 1968.1361972922641,
743 1922.1744952464483,
744 2458.702281351785
745 ],
746 [
747 1970.7892512252345,
748 1945.6566495673915,
749 2547.814105201657
750 ],
751 [
752 2019.4031839417235,
753 1911.144018055443,
754 2587.7138359972323
755 ]
756 ]
757 },
758 {
759 "anchor_id": "M013",
760 "anchor_name_normalised": "SAYEDA ZEINAB PLAZA",
761 "knn": [
762 {
763 "shop_id": "S03765",
764 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
765 "distance_m": 162.44146460362904,
766 "within_1km": true
767 },
768 {
769 "shop_id": "S06164",
770 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
771 "distance_m": 188.7706246834346,
772 "within_1km": true
773 },
774 {
775 "shop_id": "S06427",
776 "normalised_name": "\u0627\u0648\u0633\u0643\u0627\u0631",
777 "distance_m": 311.70427266037166,
778 "within_1km": true
779 },
780 {
781 "shop_id": "S07236",
782 "normalised_name": "LOCAL SHOP 00002",
783 "distance_m": 311.70427266037166,
784 "within_1km": true
785 },
786 {
787 "shop_id": "S02542",
788 "normalised_name": "SPINNEYS CAIRO",
789 "distance_m": 333.5818013003781,
790 "within_1km": true
791 }
792 ],
793 "full_distance_matrix_m": [
794 [
795 1967.358940075545,
796 1906.0721805068256,
797 2057.7732290977683
798 ],
799 [
800 2044.9703415666818,
801 1827.5643358853156,
802 2373.640084799799
803 ],
804 [
805 2185.4819201892396,
806 1693.766628293397,
807 2042.0073174423837
808 ],
809 [
810 2185.4819201892396,
811 1693.766628293397,
812 2042.0073174423837
813 ],
814 [
815 2148.4580481657645,
816 1748.4943777893766,
817 2490.7980576197533
818 ]
819 ]
820 },
821 {
822 "anchor_id": "M014",
823 "anchor_name_normalised": "KHAN EL KHALILI APPROACH",
824 "knn": [
825 {
826 "shop_id": "S08861",
827 "normalised_name": "LOCAL SHOP 00002",
828 "distance_m": 195.44221286523796,
829 "within_1km": true
830 },
831 {
832 "shop_id": "S02479",
833 "normalised_name": "HYPERONE",
834 "distance_m": 239.15994784430384,
835 "within_1km": true
836 },
837 {
838 "shop_id": "S01292",
839 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
840 "distance_m": 397.3730247770481,
841 "within_1km": true
842 },
843 {
844 "shop_id": "S08141",
845 "normalised_name": "LOCAL SHOP 00002",
846 "distance_m": 420.6195647371856,
847 "within_1km": true
848 },
849 {
850 "shop_id": "S05133",
851 "normalised_name": "LOCAL SHOP 00002",
852 "distance_m": 428.77681251050234,
853 "within_1km": true
854 }
855 ],
856 "full_distance_matrix_m": [
857 [
858 2031.3605888484756,
859 1844.1346827905936,
860 2047.847301575875
861 ],
862 [
863 1691.4184950097037,
864 2168.9299637161816,
865 2216.139936183984
866 ],
867 [
868 2251.545079183038,
869 1642.2340324864185,
870 2488.0343389068407
871 ],
872 [
873 2330.5226358668865,
874 1540.5054533911564,
875 2391.55826016119
876 ],
877 [
878 1530.7115042313985,
879 2339.971162636291,
880 2117.577897751801
881 ]
882 ]
883 },
884 {
885 "anchor_id": "M015",
886 "anchor_name_normalised": "BAB AL LOUQ CORNER",
887 "knn": [
888 {
889 "shop_id": "S09639",
890 "normalised_name": "LOCAL SHOP 00002",
891 "distance_m": 280.92466357721366,
892 "within_1km": true
893 },
894 {
895 "shop_id": "S02344",
896 "normalised_name": "LOCAL SHOP 00002",
897 "distance_m": 393.9713840536041,
898 "within_1km": true
899 },
900 {
901 "shop_id": "S01648",
902 "normalised_name": "LOCAL SHOP 00002",
903 "distance_m": 394.0461312472808,
904 "within_1km": true
905 },
906 {
907 "shop_id": "S02142",
908 "normalised_name": "\u0633\u0628\u064a\u0646\u064a\u0632",
909 "distance_m": 403.50647651326705,
910 "within_1km": true
911 },
912 {
913 "shop_id": "S06831",
914 "normalised_name": "LOCAL SHOP 00002",
915 "distance_m": 432.07564470242914,
916 "within_1km": true
917 }
918 ],
919 "full_distance_matrix_m": [
920 [
921 1818.7017014788562,
922 2073.827697148884,
923 2470.151425330434
924 ],
925 [
926 1754.7883545602783,
927 2163.7207965418743,
928 2560.346999062
929 ],
930 [
931 1607.726782938215,
932 2275.2290674710102,
933 2038.563023282125
934 ],
935 [
936 1942.3125196005367,
937 2000.88820361442,
938 2619.6202914189776
939 ],
940 [
941 1757.6346013235338,
942 2176.03328346425,
943 1853.5272256948965
944 ]
945 ]
946 },
947 {
948 "anchor_id": "M016",
949 "anchor_name_normalised": "KORBA QUARTER",
950 "knn": [
951 {
952 "shop_id": "S06244",
953 "normalised_name": "LOCAL SHOP 00002",
954 "distance_m": 79.63821691176408,
955 "within_1km": true
956 },
957 {
958 "shop_id": "S09855",
959 "normalised_name": "LOCAL SHOP 00002",
960 "distance_m": 110.63027476485074,
961 "within_1km": true
962 },
963 {
964 "shop_id": "S02801",
965 "normalised_name": "OSCAR",
966 "distance_m": 136.61037886639022,
967 "within_1km": true
968 },
969 {
970 "shop_id": "S02599",
971 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
972 "distance_m": 146.17389022650093,
973 "within_1km": true
974 },
975 {
976 "shop_id": "S05243",
977 "normalised_name": "ABU ZIKRI",
978 "distance_m": 191.80843676473407,
979 "within_1km": true
980 }
981 ],
982 "full_distance_matrix_m": [
983 [
984 1920.1698805572973,
985 1943.3149588433434,
986 2138.296224313246
987 ],
988 [
989 2034.137557926075,
990 1826.9033350458037,
991 2180.8179473553346
992 ],
993 [
994 1842.7413360721016,
995 2022.955357929399,
996 2321.3801532191983
997 ],
998 [
999 2004.6537405770455,
1000 1864.0810489027579,
1001 2346.195227918504
1002 ],
1003 [
1004 2039.4392665431333,
1005 1834.3790944419904,
1006 2381.15650313787
1007 ]
1008 ]
1009 },
1010 {
1011 "anchor_id": "M017",
1012 "anchor_name_normalised": "MANIAL RIVERBANK",
1013 "knn": [
1014 {
1015 "shop_id": "S08401",
1016 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
1017 "distance_m": 247.91305439190478,
1018 "within_1km": true
1019 },
1020 {
1021 "shop_id": "S00614",
1022 "normalised_name": "SPINNEYS CAIRO",
1023 "distance_m": 289.9793932231403,
1024 "within_1km": true
1025 },
1026 {
1027 "shop_id": "S06816",
1028 "normalised_name": "LOCAL SHOP 00002",
1029 "distance_m": 364.6076739386967,
1030 "within_1km": true
1031 },
1032 {
1033 "shop_id": "S09964",
1034 "normalised_name": "LOCAL SHOP 00002",
1035 "distance_m": 386.2111413338465,
1036 "within_1km": true
1037 },
1038 {
1039 "shop_id": "S09153",
1040 "normalised_name": "LOCAL SHOP 00002",
1041 "distance_m": 406.1194857895146,
1042 "within_1km": true
1043 }
1044 ],
1045 "full_distance_matrix_m": [
1046 [
1047 1907.0571440610574,
1048 1984.1118297980315,
1049 2462.218596325607
1050 ],
1051 [
1052 2081.9871401092723,
1053 1812.2201884672854,
1054 2476.8720782571954
1055 ],
1056 [
1057 2092.1955342796105,
1058 1827.4661078889285,
1059 1882.93131551137
1060 ],
1061 [
1062 2313.2893381769786,
1063 1548.4773791696457,
1064 2302.074171161195
1065 ],
1066 [
1067 2089.745565279552,
1068 1847.5329245250348,
1069 2606.8664236972577
1070 ]
1071 ]
1072 },
1073 {
1074 "anchor_id": "M018",
1075 "anchor_name_normalised": "SHUBRA NORTH",
1076 "knn": [
1077 {
1078 "shop_id": "S04367",
1079 "normalised_name": "SPINEYS",
1080 "distance_m": 131.73231447097913,
1081 "within_1km": true
1082 },
1083 {
1084 "shop_id": "S04591",
1085 "normalised_name": "LOCAL SHOP 00002",
1086 "distance_m": 132.00104715490687,
1087 "within_1km": true
1088 },
1089 {
1090 "shop_id": "S00580",
1091 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
1092 "distance_m": 160.07042572502343,
1093 "within_1km": true
1094 },
1095 {
1096 "shop_id": "S04121",
1097 "normalised_name": "CARREFOUR",
1098 "distance_m": 380.4763770065149,
1099 "within_1km": true
1100 },
1101 {
1102 "shop_id": "S01396",
1103 "normalised_name": "OSCAR",
1104 "distance_m": 411.76394264781203,
1105 "within_1km": true
1106 }
1107 ],
1108 "full_distance_matrix_m": [
1109 [
1110 1982.5894812838128,
1111 1885.4603214159715,
1112 2095.2144000885332
1113 ],
1114 [
1115 1982.7632456326057,
1116 1885.3152216835642,
1117 2094.9926668597604
1118 ],
1119 [
1120 2078.691887125919,
1121 1783.5569280079872,
1122 2283.6761412901737
1123 ],
1124 [
1125 2216.575840805555,
1126 1681.4658930485878,
1127 1967.8035521340892
1128 ],
1129 [
1130 2284.324338870431,
1131 1603.6328805329863,
1132 2469.109038659215
1133 ]
1134 ]
1135 },
1136 {
1137 "anchor_id": "M019",
1138 "anchor_name_normalised": "AIN SHAMS PLAZA",
1139 "knn": [
1140 {
1141 "shop_id": "S08667",
1142 "normalised_name": "LOCAL SHOP 00002",
1143 "distance_m": 684.0996579797446,
1144 "within_1km": true
1145 },
1146 {
1147 "shop_id": "S07904",
1148 "normalised_name": "OSCAR",
1149 "distance_m": 1176.893080438831,
1150 "within_1km": false
1151 },
1152 {
1153 "shop_id": "S01200",
1154 "normalised_name": "ABOU ZEKRY",
1155 "distance_m": 1257.3414752733888,
1156 "within_1km": false
1157 },
1158 {
1159 "shop_id": "S07089",
1160 "normalised_name": "LOCAL SHOP 00002",
1161 "distance_m": 1279.0357696977744,
1162 "within_1km": false
1163 },
1164 {
1165 "shop_id": "S04445",
1166 "normalised_name": "SEOUDI",
1167 "distance_m": 1382.4511076880806,
1168 "within_1km": false
1169 }
1170 ],
1171 "full_distance_matrix_m": [
1172 [
1173 2253.827368722319,
1174 1818.6634054951667,
1175 1589.2926110525311
1176 ],
1177 [
1178 858.6201100324865,
1179 3079.541539829715,
1180 2777.4969541277324
1181 ],
1182 [
1183 682.6889026845546,
1184 3185.3852701471656,
1185 2466.289650955246
1186 ],
1187 [
1188 700.3709488814691,
1189 3198.7606985978905,
1190 2734.9770391523048
1191 ],
1192 [
1193 550.4296116468323,
1194 3312.139319916,
1195 2573.143405782215
1196 ]
1197 ]
1198 },
1199 {
1200 "anchor_id": "M020",
1201 "anchor_name_normalised": "ABBASIYA JUNCTION",
1202 "knn": [
1203 {
1204 "shop_id": "S04479",
1205 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
1206 "distance_m": 533.8840304045726,
1207 "within_1km": true
1208 },
1209 {
1210 "shop_id": "S00183",
1211 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1212 "distance_m": 542.8963509721391,
1213 "within_1km": true
1214 },
1215 {
1216 "shop_id": "S02604",
1217 "normalised_name": "LOCAL SHOP 00002",
1218 "distance_m": 876.244824297051,
1219 "within_1km": true
1220 },
1221 {
1222 "shop_id": "S08735",
1223 "normalised_name": "SEOUDI",
1224 "distance_m": 1519.8205245264585,
1225 "within_1km": false
1226 },
1227 {
1228 "shop_id": "S08901",
1229 "normalised_name": "LOCAL SHOP 00002",
1230 "distance_m": 1550.5761817107218,
1231 "within_1km": false
1232 }
1233 ],
1234 "full_distance_matrix_m": [
1235 [
1236 2182.677279804542,
1237 1731.180965536903,
1238 2721.0146097371116
1239 ],
1240 [
1241 2461.6923314864202,
1242 2158.077198336684,
1243 2400.628552225825
1244 ],
1245 [
1246 2804.7116960475405,
1247 2443.7734869776764,
1248 2322.5898167171567
1249 ],
1250 [
1251 2132.578563708277,
1252 3707.335151803096,
1253 840.3492758458228
1254 ],
1255 [
1256 2179.370476669656,
1257 3743.0012153155785,
1258 793.3010810396031
1259 ]
1260 ]
1261 },
1262 {
1263 "anchor_id": "M021",
1264 "anchor_name_normalised": "BOULAQ EDGE",
1265 "knn": [
1266 {
1267 "shop_id": "S02452",
1268 "normalised_name": "HYPERONE",
1269 "distance_m": 143.1241609116162,
1270 "within_1km": true
1271 },
1272 {
1273 "shop_id": "S04480",
1274 "normalised_name": "KHEIR ZAMAN",
1275 "distance_m": 155.55038038330025,
1276 "within_1km": true
1277 },
1278 {
1279 "shop_id": "S02622",
1280 "normalised_name": "CARREFOUR",
1281 "distance_m": 218.84497670307692,
1282 "within_1km": true
1283 },
1284 {
1285 "shop_id": "S03134",
1286 "normalised_name": "METRO",
1287 "distance_m": 232.59502642875754,
1288 "within_1km": true
1289 },
1290 {
1291 "shop_id": "S01855",
1292 "normalised_name": "ABU ZIKRI",
1293 "distance_m": 277.90772584339544,
1294 "within_1km": true
1295 }
1296 ],
1297 "full_distance_matrix_m": [
1298 [
1299 1794.2753798350234,
1300 2265.7139320806596,
1301 2176.7319614651688
1302 ],
1303 [
1304 1779.4142719821407,
1305 2260.5135191479403,
1306 2183.8322346874083
1307 ],
1308 [
1309 1717.6896580007617,
1310 2278.1079573762568,
1311 2176.387665769166
1312 ],
1313 [
1314 1702.9528607990133,
1315 2277.0171460598835,
1316 2180.3776746662165
1317 ],
1318 [
1319 1817.5570359835367,
1320 2466.625271671516,
1321 1975.0632969454878
1322 ]
1323 ]
1324 },
1325 {
1326 "anchor_id": "M022",
1327 "anchor_name_normalised": "GARBIYA PLAZA",
1328 "knn": [
1329 {
1330 "shop_id": "S00964",
1331 "normalised_name": "HYPERONE",
1332 "distance_m": 289.51834290291646,
1333 "within_1km": true
1334 },
1335 {
1336 "shop_id": "S05290",
1337 "normalised_name": "LOCAL SHOP 00002",
1338 "distance_m": 299.54978355732356,
1339 "within_1km": true
1340 },
1341 {
1342 "shop_id": "S08907",
1343 "normalised_name": "LOCAL SHOP 00002",
1344 "distance_m": 386.38811579473196,
1345 "within_1km": true
1346 },
1347 {
1348 "shop_id": "S06907",
1349 "normalised_name": "HYPERONE",
1350 "distance_m": 413.3161064345021,
1351 "within_1km": true
1352 },
1353 {
1354 "shop_id": "S05230",
1355 "normalised_name": "SEOUDI",
1356 "distance_m": 436.67983544902154,
1357 "within_1km": true
1358 }
1359 ],
1360 "full_distance_matrix_m": [
1361 [
1362 1713.9523500707226,
1363 2162.8362045645863,
1364 2047.8577026193373
1365 ],
1366 [
1367 1839.9535186244389,
1368 2059.5987872725245,
1369 1941.9851293960164
1370 ],
1371 [
1372 2138.0840816826185,
1373 1781.7646896796691,
1374 2564.842672422845
1375 ],
1376 [
1377 2310.764117477486,
1378 1565.207385342791,
1379 2075.9476133461067
1380 ],
1381 [
1382 1909.2394983294405,
1383 2045.532165242939,
1384 1787.3561767400536
1385 ]
1386 ]
1387 },
1388 {
1389 "anchor_id": "M023",
1390 "anchor_name_normalised": "SAKAKINI APPROACH",
1391 "knn": [
1392 {
1393 "shop_id": "S07861",
1394 "normalised_name": "LOCAL SHOP 00002",
1395 "distance_m": 431.1948144298982,
1396 "within_1km": true
1397 },
1398 {
1399 "shop_id": "S06043",
1400 "normalised_name": "OSCAR",
1401 "distance_m": 547.5408447385797,
1402 "within_1km": true
1403 },
1404 {
1405 "shop_id": "S09406",
1406 "normalised_name": "CARREFOUR",
1407 "distance_m": 548.9206787644811,
1408 "within_1km": true
1409 },
1410 {
1411 "shop_id": "S05303",
1412 "normalised_name": "LOCAL SHOP 00002",
1413 "distance_m": 576.1699040165486,
1414 "within_1km": true
1415 },
1416 {
1417 "shop_id": "S02485",
1418 "normalised_name": "LOCAL SHOP 00002",
1419 "distance_m": 589.7690715357046,
1420 "within_1km": true
1421 }
1422 ],
1423 "full_distance_matrix_m": [
1424 [
1425 1924.0047414103071,
1426 2029.1673528791073,
1427 2645.4212356832304
1428 ],
1429 [
1430 1485.0337037210072,
1431 2416.988906602306,
1432 2540.145012699295
1433 ],
1434 [
1435 2272.404182318125,
1436 1699.0768031589844,
1437 1778.7619662395527
1438 ],
1439 [
1440 1488.7253701891314,
1441 2428.086657724222,
1442 1952.4521714778202
1443 ],
1444 [
1445 1511.7201712527149,
1446 2420.301106868626,
1447 2623.7346747647316
1448 ]
1449 ]
1450 },
1451 {
1452 "anchor_id": "M024",
1453 "anchor_name_normalised": "DAR EL SALAAM",
1454 "knn": [
1455 {
1456 "shop_id": "S08247",
1457 "normalised_name": "LOCAL SHOP 00002",
1458 "distance_m": 303.7715553270038,
1459 "within_1km": true
1460 },
1461 {
1462 "shop_id": "S06329",
1463 "normalised_name": "LOCAL SHOP 00002",
1464 "distance_m": 491.1166276130505,
1465 "within_1km": true
1466 },
1467 {
1468 "shop_id": "S08710",
1469 "normalised_name": "LOCAL SHOP 00002",
1470 "distance_m": 504.70580510056124,
1471 "within_1km": true
1472 },
1473 {
1474 "shop_id": "S09186",
1475 "normalised_name": "KHEIR ZAMAN",
1476 "distance_m": 727.1381609050588,
1477 "within_1km": true
1478 },
1479 {
1480 "shop_id": "S08321",
1481 "normalised_name": "KHEIR ZAMAN",
1482 "distance_m": 888.8616133708905,
1483 "within_1km": true
1484 }
1485 ],
1486 "full_distance_matrix_m": [
1487 [
1488 2132.6731672273595,
1489 1756.1834962667037,
1490 1988.8492435786827
1491 ],
1492 [
1493 2419.232059909494,
1494 1441.3316900456923,
1495 2313.9113699588606
1496 ],
1497 [
1498 1438.7324047816662,
1499 2426.383575569832,
1500 2173.317483910219
1501 ],
1502 [
1503 2118.1353815960015,
1504 2004.797296535227,
1505 1493.6711329592345
1506 ],
1507 [
1508 1136.3107773659556,
1509 2781.5317641590054,
1510 2086.8389809734235
1511 ]
1512 ]
1513 },
1514 {
1515 "anchor_id": "M025",
1516 "anchor_name_normalised": "EL MARG HUB",
1517 "knn": [
1518 {
1519 "shop_id": "S06563",
1520 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1521 "distance_m": 95.12558429869074,
1522 "within_1km": true
1523 },
1524 {
1525 "shop_id": "S07868",
1526 "normalised_name": "OSCAR",
1527 "distance_m": 238.9301245897368,
1528 "within_1km": true
1529 },
1530 {
1531 "shop_id": "S04428",
1532 "normalised_name": "LOCAL SHOP 00002",
1533 "distance_m": 295.7640206059658,
1534 "within_1km": true
1535 },
1536 {
1537 "shop_id": "S09140",
1538 "normalised_name": "LOCAL SHOP 00002",
1539 "distance_m": 477.1403198199402,
1540 "within_1km": true
1541 },
1542 {
1543 "shop_id": "S05093",
1544 "normalised_name": "LOCAL SHOP 00002",
1545 "distance_m": 498.72631896592196,
1546 "within_1km": true
1547 }
1548 ],
1549 "full_distance_matrix_m": [
1550 [
1551 1846.016850950575,
1552 2014.4655163423067,
1553 2262.8065343928874
1554 ],
1555 [
1556 1829.9212117309032,
1557 2052.6088472768997,
1558 2430.69175297327
1559 ],
1560 [
1561 1831.1386184118976,
1562 2066.27280605199,
1563 2490.7815358186076
1564 ],
1565 [
1566 1843.9551188977769,
1567 2121.940256980925,
1568 2676.13693110598
1569 ],
1570 [
1571 2366.763817436219,
1572 1530.961415108951,
1573 1996.4602419151063
1574 ]
1575 ]
1576 },
1577 {
1578 "anchor_id": "M026",
1579 "anchor_name_normalised": "HELWAN CENTRE",
1580 "knn": [
1581 {
1582 "shop_id": "S00688",
1583 "normalised_name": "LOCAL SHOP 00002",
1584 "distance_m": 392.5586511060098,
1585 "within_1km": true
1586 },
1587 {
1588 "shop_id": "S09139",
1589 "normalised_name": "LOCAL SHOP 00002",
1590 "distance_m": 498.6898178044325,
1591 "within_1km": true
1592 },
1593 {
1594 "shop_id": "S07966",
1595 "normalised_name": "LOCAL SHOP 00002",
1596 "distance_m": 632.700793055098,
1597 "within_1km": true
1598 },
1599 {
1600 "shop_id": "S06235",
1601 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1602 "distance_m": 635.9608767777365,
1603 "within_1km": true
1604 },
1605 {
1606 "shop_id": "S06933",
1607 "normalised_name": "SPINNEYS CAIRO",
1608 "distance_m": 695.1426282008323,
1609 "within_1km": true
1610 }
1611 ],
1612 "full_distance_matrix_m": [
1613 [
1614 2280.327646779559,
1615 1598.7435268378388,
1616 2433.075679457458
1617 ],
1618 [
1619 1886.6624754709298,
1620 2094.2822056800082,
1621 1733.3147410448998
1622 ],
1623 [
1624 2535.0629160323774,
1625 1349.7158468246641,
1626 2500.0589961672763
1627 ],
1628 [
1629 2339.3214340955215,
1630 1668.504982946146,
1631 2771.141270018388
1632 ],
1633 [
1634 2593.8485369626424,
1635 1298.4737441305465,
1636 2540.289549729795
1637 ]
1638 ]
1639 },
1640 {
1641 "anchor_id": "M027",
1642 "anchor_name_normalised": "MAASARA CROSSING",
1643 "knn": [
1644 {
1645 "shop_id": "S01296",
1646 "normalised_name": "SEOUDI",
1647 "distance_m": 50.30439580908293,
1648 "within_1km": true
1649 },
1650 {
1651 "shop_id": "S09440",
1652 "normalised_name": "KHEIR ZAMAN",
1653 "distance_m": 193.50361755248164,
1654 "within_1km": true
1655 },
1656 {
1657 "shop_id": "S09344",
1658 "normalised_name": "CARREFOUR",
1659 "distance_m": 292.1455578486927,
1660 "within_1km": true
1661 },
1662 {
1663 "shop_id": "S09777",
1664 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1665 "distance_m": 385.1789866962899,
1666 "within_1km": true
1667 },
1668 {
1669 "shop_id": "S00107",
1670 "normalised_name": "CARREFOUR",
1671 "distance_m": 450.79034804135176,
1672 "within_1km": true
1673 }
1674 ],
1675 "full_distance_matrix_m": [
1676 [
1677 1978.281884009472,
1678 1881.2963211945312,
1679 2230.96275788161
1680 ],
1681 [
1682 1750.8390638988976,
1683 2111.2369591817637,
1684 2154.4192129655657
1685 ],
1686 [
1687 2146.5711751638637,
1688 1735.191999747973,
1689 2021.4033750403437
1690 ],
1691 [
1692 1907.3777204348344,
1693 2026.3769011136835,
1694 2598.149486367052
1695 ],
1696 [
1697 1839.1289499523343,
1698 2114.6073596843985,
1699 2648.965332211819
1700 ]
1701 ]
1702 },
1703 {
1704 "anchor_id": "M028",
1705 "anchor_name_normalised": "TORA EDGE",
1706 "knn": [
1707 {
1708 "shop_id": "S07222",
1709 "normalised_name": "CARREFOUR",
1710 "distance_m": 1038.647391249567,
1711 "within_1km": false
1712 },
1713 {
1714 "shop_id": "S08146",
1715 "normalised_name": "LOCAL SHOP 00002",
1716 "distance_m": 1146.4814793156884,
1717 "within_1km": false
1718 },
1719 {
1720 "shop_id": "S00413",
1721 "normalised_name": "LOCAL SHOP 00002",
1722 "distance_m": 1162.898346623925,
1723 "within_1km": false
1724 },
1725 {
1726 "shop_id": "S07665",
1727 "normalised_name": "CARREFOUR",
1728 "distance_m": 1370.9550398089314,
1729 "within_1km": false
1730 },
1731 {
1732 "shop_id": "S08878",
1733 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
1734 "distance_m": 1379.8701064923816,
1735 "within_1km": false
1736 }
1737 ],
1738 "full_distance_matrix_m": [
1739 [
1740 2022.3031209041312,
1741 2348.4092386495886,
1742 3244.430857967576
1743 ],
1744 [
1745 1326.0987485101753,
1746 2884.210758977075,
1747 1678.602283192458
1748 ],
1749 [
1750 1677.6767157311933,
1751 2708.7339019933934,
1752 3274.4270356593684
1753 ],
1754 [
1755 561.6596656088414,
1756 3300.2213341066963,
1757 2565.8451356194964
1758 ],
1759 [
1760 1463.3767653012455,
1761 3018.900591657248,
1762 3383.0311962219066
1763 ]
1764 ]
1765 },
1766 {
1767 "anchor_id": "M029",
1768 "anchor_name_normalised": "MOKATTAM HEIGHTS",
1769 "knn": [
1770 {
1771 "shop_id": "S04699",
1772 "normalised_name": "ABOU ZEKRY",
1773 "distance_m": 926.1133200433566,
1774 "within_1km": true
1775 },
1776 {
1777 "shop_id": "S08181",
1778 "normalised_name": "CARREFOUR",
1779 "distance_m": 1338.4185443902384,
1780 "within_1km": false
1781 },
1782 {
1783 "shop_id": "S08735",
1784 "normalised_name": "SEOUDI",
1785 "distance_m": 1715.744166223812,
1786 "within_1km": false
1787 },
1788 {
1789 "shop_id": "S08901",
1790 "normalised_name": "LOCAL SHOP 00002",
1791 "distance_m": 1724.5952583670617,
1792 "within_1km": false
1793 },
1794 {
1795 "shop_id": "S05829",
1796 "normalised_name": "SPINEYS",
1797 "distance_m": 1792.8402244185731,
1798 "within_1km": false
1799 }
1800 ],
1801 "full_distance_matrix_m": [
1802 [
1803 1622.4428644808077,
1804 2555.6697813726555,
1805 1526.8257430730068
1806 ],
1807 [
1808 3255.384511654304,
1809 657.9522434613671,
1810 2787.1720972270386
1811 ],
1812 [
1813 3553.833575016254,
1814 840.3492758458228,
1815 2132.578563708277
1816 ],
1817 [
1818 3573.159483530612,
1819 793.3010810396031,
1820 2179.370476669656
1821 ],
1822 [
1823 3658.0340871700205,
1824 704.0165384983723,
1825 2286.9531951465624
1826 ]
1827 ]
1828 },
1829 {
1830 "anchor_id": "M030",
1831 "anchor_name_normalised": "NOZHA PROMENADE",
1832 "knn": [
1833 {
1834 "shop_id": "S08181",
1835 "normalised_name": "CARREFOUR",
1836 "distance_m": 657.9522434613671,
1837 "within_1km": true
1838 },
1839 {
1840 "shop_id": "S05829",
1841 "normalised_name": "SPINEYS",
1842 "distance_m": 704.0165384983723,
1843 "within_1km": true
1844 },
1845 {
1846 "shop_id": "S08901",
1847 "normalised_name": "LOCAL SHOP 00002",
1848 "distance_m": 793.3010810396031,
1849 "within_1km": true
1850 },
1851 {
1852 "shop_id": "S08735",
1853 "normalised_name": "SEOUDI",
1854 "distance_m": 840.3492758458228,
1855 "within_1km": true
1856 },
1857 {
1858 "shop_id": "S01591",
1859 "normalised_name": "METRO",
1860 "distance_m": 932.5918427641366,
1861 "within_1km": true
1862 }
1863 ],
1864 "full_distance_matrix_m": [
1865 [
1866 1338.4185443902384,
1867 2531.719439640108,
1868 2070.5277465741988
1869 ],
1870 [
1871 1792.8402244185731,
1872 1584.6061503065903,
1873 2882.9157654971996
1874 ],
1875 [
1876 1724.5952583670617,
1877 1550.5761817107218,
1878 2947.077867103685
1879 ],
1880 [
1881 1715.744166223812,
1882 1519.8205245264585,
1883 2988.882883492248
1884 ],
1885 [
1886 2192.405943934767,
1887 3148.5155747292247,
1888 1287.3180202950216
1889 ]
1890 ]
1891 },
1892 {
1893 "anchor_id": "M031",
1894 "anchor_name_normalised": "SHERATON HELIOPOLIS",
1895 "knn": [
1896 {
1897 "shop_id": "S00527",
1898 "normalised_name": "LOCAL SHOP 00002",
1899 "distance_m": 253.7596125751528,
1900 "within_1km": true
1901 },
1902 {
1903 "shop_id": "S01047",
1904 "normalised_name": "LOCAL SHOP 00002",
1905 "distance_m": 283.246388808315,
1906 "within_1km": true
1907 },
1908 {
1909 "shop_id": "S04959",
1910 "normalised_name": "LOCAL SHOP 00002",
1911 "distance_m": 346.5915949884266,
1912 "within_1km": true
1913 },
1914 {
1915 "shop_id": "S06835",
1916 "normalised_name": "SPINNEYS CAIRO",
1917 "distance_m": 350.5277927644183,
1918 "within_1km": true
1919 },
1920 {
1921 "shop_id": "S08893",
1922 "normalised_name": "METRO",
1923 "distance_m": 350.5277927644183,
1924 "within_1km": true
1925 }
1926 ],
1927 "full_distance_matrix_m": [
1928 [
1929 1677.4443325360598,
1930 2202.958446098429,
1931 2259.7512981823693
1932 ],
1933 [
1934 1650.181364181898,
1935 2278.639968221351,
1936 2190.6551628335355
1937 ],
1938 [
1939 1923.8325573847915,
1940 2561.9716554921415,
1941 1872.7681601061568
1942 ],
1943 [
1944 2142.3882584422627,
1945 1934.0543636868153,
1946 2517.1190957608624
1947 ],
1948 [
1949 2142.3882584422627,
1950 1934.0543636868153,
1951 2517.1190957608624
1952 ]
1953 ]
1954 },
1955 {
1956 "anchor_id": "M032",
1957 "anchor_name_normalised": "TRIUMPH SQUARE",
1958 "knn": [
1959 {
1960 "shop_id": "S01025",
1961 "normalised_name": "LOCAL SHOP 00002",
1962 "distance_m": 79.83756885715013,
1963 "within_1km": true
1964 },
1965 {
1966 "shop_id": "S02664",
1967 "normalised_name": "LOCAL SHOP 00002",
1968 "distance_m": 157.66656231613084,
1969 "within_1km": true
1970 },
1971 {
1972 "shop_id": "S02254",
1973 "normalised_name": "LOCAL SHOP 00002",
1974 "distance_m": 164.90230028067674,
1975 "within_1km": true
1976 },
1977 {
1978 "shop_id": "S02175",
1979 "normalised_name": "ABOU ZEKRY",
1980 "distance_m": 174.60568615294582,
1981 "within_1km": true
1982 },
1983 {
1984 "shop_id": "S01506",
1985 "normalised_name": "LOCAL SHOP 00002",
1986 "distance_m": 192.93799451313052,
1987 "within_1km": true
1988 }
1989 ],
1990 "full_distance_matrix_m": [
1991 [
1992 1929.059067072471,
1993 1932.916468256681,
1994 2296.874167306396
1995 ],
1996 [
1997 1780.2544880608473,
1998 2079.6921654515395,
1999 2271.2840176007116
2000 ],
<system-reminder>Showed lines 1-2000 of 6302. Re-call Read with offset=2001 to continue, or raise limit.</system-reminder>
2:25
Write
/work/solve.py
content · 102 lines · py
import geopandas as gpd
import pandas as pd
import json
import numpy as np
from collections import Counter
def normalize_text(text):
if not isinstance(text, str):
return ""
return " ".join(text.strip().upper().split())
def get_first_word(s):
words = s.split()
return words[0] if words else ""
def solve():
# Load data
shops = gpd.read_file("/work/cairo_retail.gpkg", layer="shops")
anchors = gpd.read_file("/work/cairo_retail.gpkg", layer="anchors")
# 1. Normalize Names & Handle Chains
shops['temp_name'] = shops['raw_name'].apply(normalize_text)
# Group by first word to identify chains
shops['first_word'] = shops['temp_name'].apply(get_first_word)
canonical_map = {}
for fw, group in shops.groupby('first_word'):
if fw:
# The most frequent normalized name in this first-word group is the canonical one
counts = group['temp_name'].value_counts()
if not counts.empty:
canonical_map[fw] = counts.index[0]
# Apply canonical name to shops
shops['normalised_name'] = shops['temp_name'].apply(lambda x: canonical_map.get(get_first_word(x), x))
# Normalize anchor names
anchors['anchor_name_normalised'] = anchors['anchor_name'].apply(normalize_text)
# 2. Distance calculations
results = []
# Pre-calculate anchor coordinates for speed
anchor_coords = np.array(list(zip(anchors.geometry.x, anchors.geometry.y)))
shop_coords = np.array(list(zip(shops.geometry.x, shops.geometry.y)))
shop_ids = shops['shop_id'].values
shop_norm_names = shops['normalised_name'].values
for i, anchor in anchors.iterrows():
a_id = anchor['anchor_id']
a_name = anchor['anchor_name_normalised']
a_pos = anchor_coords[i]
# Find 5 nearest shops
# Distances from anchor to all shops
dists_to_shops = np.linalg.norm(shop_coords - a_pos, axis=1)
knn_indices = np.argsort(dists_to_shops)[:5]
knn_list = []
for idx in knn_indices:
d = dists_to_shops[idx]
knn_list.append({
"shop_id": str(shop_ids[idx]),
"normalised_name": str(shop_norm_names[idx]),
"distance_m": float(d),
"within_1km": bool(d <= 1000.0)
})
# Find 3 closest sibling anchors (excluding self)
# Distances from anchor to all anchors
dists_to_anchors = np.linalg.norm(anchor_coords - a_pos, axis=1)
# Sort indices by distance, then pick indices where index != i
sorted_anchor_indices = np.argsort(dists_to_anchors)
sibling_indices = [idx for idx in sorted_anchor_indices if idx != i][:3]
# Matrix 5 (knn shops) x 3 (siblings)
# Rows: knn order, Columns: sibling order (distance-ascending)
matrix = []
knn_pos = shop_coords[knn_indices]
sibling_pos = anchor_coords[sibling_indices]
# Calculate distances using broadcasting
# (5, 1, 2) - (1, 3, 2) -> (5, 3, 2)
diffs = knn_pos[:, np.newaxis, :] - sibling_pos[np.newaxis, :, :]
dist_matrix = np.sqrt(np.sum(diffs**2, axis=2))
matrix = dist_matrix.tolist()
results.append({
"anchor_id": str(a_id),
"anchor_name_normalised": str(a_name),
"knn": knn_list,
"full_distance_matrix_m": matrix
})
with open("/work/market_neighbourhoods.json", "w") as f:
json.dump(results, f, indent=2)
if __name__ == "__main__":
solve()
Wrote /work/solve.py (3615 chars).
2:38
Bash
python /work/solve.py
python /work/solve.py(no output)
3:05
Read
/work/market_neighbourhoods.json
1 [
2 {
3 "anchor_id": "M001",
4 "anchor_name_normalised": "TAHRIR SQUARE PLAZA",
5 "knn": [
6 {
7 "shop_id": "S07233",
8 "normalised_name": "SEOUDI",
9 "distance_m": 565.5774729861073,
10 "within_1km": true
11 },
12 {
13 "shop_id": "S05762",
14 "normalised_name": "OSCAR",
15 "distance_m": 722.3301477157331,
16 "within_1km": true
17 },
18 {
19 "shop_id": "S08811",
20 "normalised_name": "SEOUDI",
21 "distance_m": 851.1481358488758,
22 "within_1km": true
23 },
24 {
25 "shop_id": "S01722",
26 "normalised_name": "LOCAL SHOP 00002",
27 "distance_m": 852.4416831354031,
28 "within_1km": true
29 },
30 {
31 "shop_id": "S04111",
32 "normalised_name": "LOCAL SHOP 00002",
33 "distance_m": 868.96252213481,
34 "within_1km": true
35 }
36 ],
37 "full_distance_matrix_m": [
38 [
39 2487.0078080337594,
40 2174.324012747061,
41 3254.5114413442143
42 ],
43 [
44 1534.4843964513216,
45 1756.6458865635916,
46 2217.728977070344
47 ],
48 [
49 1083.478376599746,
50 2432.536076922434,
51 2523.2160443438365
52 ],
53 [
54 1080.9227579664303,
55 2423.437856092515,
56 2512.907664013948
57 ],
58 [
59 2589.6466467244945,
60 1669.1438268232814,
61 2955.6767888178206
62 ]
63 ]
64 },
65 {
66 "anchor_id": "M002",
67 "anchor_name_normalised": "ZAMALEK RIVERSIDE",
68 "knn": [
69 {
70 "shop_id": "S07867",
71 "normalised_name": "LOCAL SHOP 00002",
72 "distance_m": 269.65233763241866,
73 "within_1km": true
74 },
75 {
76 "shop_id": "S08880",
77 "normalised_name": "LOCAL SHOP 00002",
78 "distance_m": 312.5775921586124,
79 "within_1km": true
80 },
81 {
82 "shop_id": "S01618",
83 "normalised_name": "HYPERONE",
84 "distance_m": 376.4314762570364,
85 "within_1km": true
86 },
87 {
88 "shop_id": "S08973",
89 "normalised_name": "\u0645\u062a\u0631\u0648",
90 "distance_m": 398.4429175977933,
91 "within_1km": true
92 },
93 {
94 "shop_id": "S03901",
95 "normalised_name": "LOCAL SHOP 00002",
96 "distance_m": 553.5329005009304,
97 "within_1km": true
98 }
99 ],
100 "full_distance_matrix_m": [
101 [
102 1944.4911846390683,
103 1953.9438781070432,
104 1947.4413403948372
105 ],
106 [
107 1618.2703088581297,
108 2242.837558260415,
109 2252.1949702157335
110 ],
111 [
112 1563.2932886368146,
113 2300.7099648556714,
114 2321.0268460924804
115 ],
116 [
117 1556.2002411370236,
118 2312.9067497584283,
119 2370.064582448898
120 ],
121 [
122 1378.4337559345038,
123 2483.2321926475374,
124 2317.786642896787
125 ]
126 ]
127 },
128 {
129 "anchor_id": "M003",
130 "anchor_name_normalised": "MAADI CORNICHE",
131 "knn": [
132 {
133 "shop_id": "S04460",
134 "normalised_name": "OSCAR",
135 "distance_m": 72.95310761979502,
136 "within_1km": true
137 },
138 {
139 "shop_id": "S08308",
140 "normalised_name": "SEOUDI",
141 "distance_m": 88.72767249258234,
142 "within_1km": true
143 },
144 {
145 "shop_id": "S09296",
146 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
147 "distance_m": 98.21189301247169,
148 "within_1km": true
149 },
150 {
151 "shop_id": "S09427",
152 "normalised_name": "CARREFOUR",
153 "distance_m": 99.57756944336273,
154 "within_1km": true
155 },
156 {
157 "shop_id": "S07126",
158 "normalised_name": "LOCAL SHOP 00002",
159 "distance_m": 116.75771956129789,
160 "within_1km": true
161 }
162 ],
163 "full_distance_matrix_m": [
164 [
165 1943.3652464180357,
166 1920.3236565903114,
167 2145.04282095631
168 ],
169 [
170 1930.347156605599,
171 1934.725048745786,
172 2128.348539210285
173 ],
174 [
175 2028.6742634404964,
176 1832.3441511159044,
177 2216.2298388589775
178 ],
179 [
180 1943.5455934945362,
181 1922.5272088369113,
182 2118.054325565629
183 ],
184 [
185 1826.382123942283,
186 2036.011727251994,
187 2270.837232503956
188 ]
189 ]
190 },
191 {
192 "anchor_id": "M004",
193 "anchor_name_normalised": "HELIOPOLIS SQUARE",
194 "knn": [
195 {
196 "shop_id": "S07243",
197 "normalised_name": "LOCAL SHOP 00002",
198 "distance_m": 16.757831352132488,
199 "within_1km": true
200 },
201 {
202 "shop_id": "S08211",
203 "normalised_name": "ABOU ZEKRY",
204 "distance_m": 71.72654511660338,
205 "within_1km": true
206 },
207 {
208 "shop_id": "S09992",
209 "normalised_name": "LOCAL SHOP 00002",
210 "distance_m": 73.41287544791905,
211 "within_1km": true
212 },
213 {
214 "shop_id": "S02270",
215 "normalised_name": "LOCAL SHOP 00002",
216 "distance_m": 73.47956441875495,
217 "within_1km": true
218 },
219 {
220 "shop_id": "S04115",
221 "normalised_name": "METRO",
222 "distance_m": 100.78571485234073,
223 "within_1km": true
224 }
225 ],
226 "full_distance_matrix_m": [
227 [
228 1921.3994991179761,
229 1939.7238079283934,
230 2231.101488205238
231 ],
232 [
233 1906.4444066225778,
234 1956.9204820995826,
235 2284.324622501632
236 ],
237 [
238 1974.2425008374548,
239 1888.628794763346,
240 2277.078707134747
241 ],
242 [
243 1998.0470622679375,
244 1863.4161218393297,
245 2188.647181422321
246 ],
247 [
248 1958.0479261583657,
249 1907.886624767009,
250 2119.592832641312
251 ]
252 ]
253 },
254 {
255 "anchor_id": "M005",
256 "anchor_name_normalised": "NEW CAIRO TAGAMOA",
257 "knn": [
258 {
259 "shop_id": "S06518",
260 "normalised_name": "LOCAL SHOP 00002",
261 "distance_m": 28.135101381065994,
262 "within_1km": true
263 },
264 {
265 "shop_id": "S05810",
266 "normalised_name": "LOCAL SHOP 00002",
267 "distance_m": 37.5193086732093,
268 "within_1km": true
269 },
270 {
271 "shop_id": "S07612",
272 "normalised_name": "LOCAL SHOP 00002",
273 "distance_m": 91.17617402150849,
274 "within_1km": true
275 },
276 {
277 "shop_id": "S08564",
278 "normalised_name": "LOCAL SHOP 00002",
279 "distance_m": 127.99872816542131,
280 "within_1km": true
281 },
282 {
283 "shop_id": "S06537",
284 "normalised_name": "LOCAL SHOP 00002",
285 "distance_m": 174.57781624235815,
286 "within_1km": true
287 }
288 ],
289 "full_distance_matrix_m": [
290 [
291 1957.69173028252,
292 1903.3585086300416,
293 2209.9075708121827
294 ],
295 [
296 1936.291904728657,
297 1925.4392896637053,
298 2179.9357745349057
299 ],
300 [
301 1924.4897492266464,
302 1940.7876574394063,
303 2126.2585643413954
304 ],
305 [
306 1855.7656146790907,
307 2010.618212652097,
308 2116.6290420790197
309 ],
310 [
311 2082.2035945372736,
312 1782.9958750841122,
313 2132.612348368797
314 ]
315 ]
316 },
317 {
318 "anchor_id": "M006",
319 "anchor_name_normalised": "NASR CITY HUB",
320 "knn": [
321 {
322 "shop_id": "S02587",
323 "normalised_name": "SEOUDI",
324 "distance_m": 106.50477238149823,
325 "within_1km": true
326 },
327 {
328 "shop_id": "S00300",
329 "normalised_name": "LOCAL SHOP 00002",
330 "distance_m": 227.65253032103135,
331 "within_1km": true
332 },
333 {
334 "shop_id": "S05940",
335 "normalised_name": "LOCAL SHOP 00002",
336 "distance_m": 253.18826379689676,
337 "within_1km": true
338 },
339 {
340 "shop_id": "S02292",
341 "normalised_name": "OSCAR",
342 "distance_m": 269.5482185686428,
343 "within_1km": true
344 },
345 {
346 "shop_id": "S02236",
347 "normalised_name": "LOCAL SHOP 00002",
348 "distance_m": 356.9202878258021,
349 "within_1km": true
350 }
351 ],
352 "full_distance_matrix_m": [
353 [
354 1935.540445660128,
355 1931.3391438782608,
356 2110.573644617887
357 ],
358 [
359 1754.4487064155114,
360 2116.4657923970435,
361 2361.495135254868
362 ],
363 [
364 1688.5443638736308,
365 2175.029606616673,
366 2161.0936556365787
367 ],
368 [
369 1835.4992911085928,
370 2056.663102717168,
371 1974.786747930339
372 ],
373 [
374 2018.2010478243594,
375 1906.6158710142874,
376 1865.533612736454
377 ]
378 ]
379 },
380 {
381 "anchor_id": "M007",
382 "anchor_name_normalised": "MOHANDESSIN CENTRE",
383 "knn": [
384 {
385 "shop_id": "S00857",
386 "normalised_name": "LOCAL SHOP 00002",
387 "distance_m": 60.928713870077,
388 "within_1km": true
389 },
390 {
391 "shop_id": "S09356",
392 "normalised_name": "LOCAL SHOP 00002",
393 "distance_m": 522.8746383702942,
394 "within_1km": true
395 },
396 {
397 "shop_id": "S06624",
398 "normalised_name": "LOCAL SHOP 00002",
399 "distance_m": 549.4165800396148,
400 "within_1km": true
401 },
402 {
403 "shop_id": "S02306",
404 "normalised_name": "LOCAL SHOP 00002",
405 "distance_m": 647.8538162055585,
406 "within_1km": true
407 },
408 {
409 "shop_id": "S09328",
410 "normalised_name": "LOCAL SHOP 00002",
411 "distance_m": 651.9451270794432,
412 "within_1km": true
413 }
414 ],
415 "full_distance_matrix_m": [
416 [
417 1990.6269449741726,
418 1870.4625360716227,
419 2227.9775820328477
420 ],
421 [
422 1811.604724154596,
423 2172.1765438856014,
424 1738.3731031745378
425 ],
426 [
427 1564.6773386332302,
428 2368.343800935659,
429 1895.300533032697
430 ],
431 [
432 1639.258812682736,
433 2367.6364552919167,
434 1732.5978989016967
435 ],
436 [
437 1640.045398661773,
438 2369.3365425509337,
439 1728.3381351228975
440 ]
441 ]
442 },
443 {
444 "anchor_id": "M008",
445 "anchor_name_normalised": "GARDEN CITY WALK",
446 "knn": [
447 {
448 "shop_id": "S00683",
449 "normalised_name": "LOCAL SHOP 00002",
450 "distance_m": 893.2947456712992,
451 "within_1km": true
452 },
453 {
454 "shop_id": "S06446",
455 "normalised_name": "LOCAL SHOP 00002",
456 "distance_m": 1558.0280661837521,
457 "within_1km": false
458 },
459 {
460 "shop_id": "S01136",
461 "normalised_name": "LOCAL SHOP 00002",
462 "distance_m": 1568.3678538206516,
463 "within_1km": false
464 },
465 {
466 "shop_id": "S08439",
467 "normalised_name": "HYPER ONE",
468 "distance_m": 1591.2754995073196,
469 "within_1km": false
470 },
471 {
472 "shop_id": "S09549",
473 "normalised_name": "LOCAL SHOP 00002",
474 "distance_m": 1755.43113504347,
475 "within_1km": false
476 }
477 ],
478 "full_distance_matrix_m": [
479 [
480 1917.0075308508187,
481 2318.2470988726996,
482 1369.1000937297133
483 ],
484 [
485 3022.7956576658084,
486 1780.5930956916202,
487 1159.2225119969787
488 ],
489 [
490 2937.2900237909366,
491 1935.1306607953838,
492 1005.5305830195045
493 ],
494 [
495 2949.4766576775037,
496 1953.902227097043,
497 986.0606017587595
498 ],
499 [
500 3064.3681328203306,
501 2055.5890119388955,
502 894.5708766798813
503 ]
504 ]
505 },
506 {
507 "anchor_id": "M009",
508 "anchor_name_normalised": "DOKKI MARKET",
509 "knn": [
510 {
511 "shop_id": "S08667",
512 "normalised_name": "LOCAL SHOP 00002",
513 "distance_m": 1589.2926110525311,
514 "within_1km": false
515 },
516 {
517 "shop_id": "S06446",
518 "normalised_name": "LOCAL SHOP 00002",
519 "distance_m": 1780.5930956916202,
520 "within_1km": false
521 },
522 {
523 "shop_id": "S01136",
524 "normalised_name": "LOCAL SHOP 00002",
525 "distance_m": 1935.1306607953838,
526 "within_1km": false
527 },
528 {
529 "shop_id": "S08439",
530 "normalised_name": "HYPER ONE",
531 "distance_m": 1953.902227097043,
532 "within_1km": false
533 },
534 {
535 "shop_id": "S09549",
536 "normalised_name": "LOCAL SHOP 00002",
537 "distance_m": 2055.5890119388955,
538 "within_1km": false
539 }
540 ],
541 "full_distance_matrix_m": [
542 [
543 2671.8002941859654,
544 2316.455824459701,
545 684.0996579797446
546 ],
547 [
548 1558.0280661837521,
549 3371.4257227907947,
550 1444.54371994737
551 ],
552 [
553 1568.3678538206516,
554 3533.0678495132574,
555 1515.184804400465
556 ],
557 [
558 1591.2754995073196,
559 3543.4697747157215,
560 1502.5417428156868
561 ],
562 [
563 1755.43113504347,
564 3580.797688971729,
565 1394.249595027812
566 ]
567 ]
568 },
569 {
570 "anchor_id": "M010",
571 "anchor_name_normalised": "GIZA PYRAMIDS GATE",
572 "knn": [
573 {
574 "shop_id": "S04479",
575 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
576 "distance_m": 1731.180965536903,
577 "within_1km": false
578 },
579 {
580 "shop_id": "S00183",
581 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
582 "distance_m": 2158.077198336684,
583 "within_1km": false
584 },
585 {
586 "shop_id": "S08667",
587 "normalised_name": "LOCAL SHOP 00002",
588 "distance_m": 2316.455824459701,
589 "within_1km": false
590 },
591 {
592 "shop_id": "S02604",
593 "normalised_name": "LOCAL SHOP 00002",
594 "distance_m": 2443.7734869776764,
595 "within_1km": false
596 },
597 {
598 "shop_id": "S06446",
599 "normalised_name": "LOCAL SHOP 00002",
600 "distance_m": 3371.4257227907947,
601 "within_1km": false
602 }
603 ],
604 "full_distance_matrix_m": [
605 [
606 2734.3971776606563,
607 533.8840304045726,
608 2182.677279804542
609 ],
610 [
611 3228.565791013887,
612 542.8963509721391,
613 2461.6923314864202
614 ],
615 [
616 1589.2926110525311,
617 1818.6634054951667,
618 684.0996579797446
619 ],
620 [
621 3615.528227944305,
622 876.244824297051,
623 2804.7116960475405
624 ],
625 [
626 1780.5930956916202,
627 3206.4096692753315,
628 1444.54371994737
629 ]
630 ]
631 },
632 {
633 "anchor_id": "M011",
634 "anchor_name_normalised": "ROXY SQUARE",
635 "knn": [
636 {
637 "shop_id": "S04328",
638 "normalised_name": "ABU ZIKRI",
639 "distance_m": 187.09164983396892,
640 "within_1km": true
641 },
642 {
643 "shop_id": "S05158",
644 "normalised_name": "LOCAL SHOP 00002",
645 "distance_m": 231.29400608856076,
646 "within_1km": true
647 },
648 {
649 "shop_id": "S05294",
650 "normalised_name": "KHEIR ZAMAN",
651 "distance_m": 252.9785956846131,
652 "within_1km": true
653 },
654 {
655 "shop_id": "S09033",
656 "normalised_name": "SPINNEYS CAIRO",
657 "distance_m": 263.68732182798567,
658 "within_1km": true
659 },
660 {
661 "shop_id": "S01560",
662 "normalised_name": "LOCAL SHOP 00002",
663 "distance_m": 417.38758812289393,
664 "within_1km": true
665 }
666 ],
667 "full_distance_matrix_m": [
668 [
669 1795.5339124545674,
670 2096.392447294816,
671 2346.4314186731317
672 ],
673 [
674 2017.573351953057,
675 1999.867439859647,
676 2436.825680019156
677 ],
678 [
679 1986.9924676005692,
680 1967.8572995801014,
681 2467.008291732404
682 ],
683 [
684 1726.26665320315,
685 2384.43821862861,
686 2069.8086980233793
687 ],
688 [
689 1732.2848201214767,
690 2574.030282165838,
691 1885.0416779423379
692 ]
693 ]
694 },
695 {
696 "anchor_id": "M012",
697 "anchor_name_normalised": "RAMSES CROSSING",
698 "knn": [
699 {
700 "shop_id": "S06449",
701 "normalised_name": "LOCAL SHOP 00002",
702 "distance_m": 166.05820638133866,
703 "within_1km": true
704 },
705 {
706 "shop_id": "S01440",
707 "normalised_name": "METRO",
708 "distance_m": 230.59572744304464,
709 "within_1km": true
710 },
711 {
712 "shop_id": "S05105",
713 "normalised_name": "LOCAL SHOP 00002",
714 "distance_m": 242.65541126525213,
715 "within_1km": true
716 },
717 {
718 "shop_id": "S08432",
719 "normalised_name": "LOCAL SHOP 00002",
720 "distance_m": 330.98224895265844,
721 "within_1km": true
722 },
723 {
724 "shop_id": "S01810",
725 "normalised_name": "LOCAL SHOP 00002",
726 "distance_m": 374.1629110364246,
727 "within_1km": true
728 }
729 ],
730 "full_distance_matrix_m": [
731 [
732 2092.9755856605243,
733 1767.8631935424125,
734 2189.293919558164
735 ],
736 [
737 2147.662821357611,
738 1716.0014421890585,
739 2147.2656981097853
740 ],
741 [
742 1968.1361972922641,
743 1922.1744952464483,
744 2458.702281351785
745 ],
746 [
747 1970.7892512252345,
748 1945.6566495673915,
749 2547.814105201657
750 ],
751 [
752 2019.4031839417235,
753 1911.144018055443,
754 2587.7138359972323
755 ]
756 ]
757 },
758 {
759 "anchor_id": "M013",
760 "anchor_name_normalised": "SAYEDA ZEINAB PLAZA",
761 "knn": [
762 {
763 "shop_id": "S03765",
764 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
765 "distance_m": 162.44146460362904,
766 "within_1km": true
767 },
768 {
769 "shop_id": "S06164",
770 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
771 "distance_m": 188.7706246834346,
772 "within_1km": true
773 },
774 {
775 "shop_id": "S06427",
776 "normalised_name": "\u0627\u0648\u0633\u0643\u0627\u0631",
777 "distance_m": 311.70427266037166,
778 "within_1km": true
779 },
780 {
781 "shop_id": "S07236",
782 "normalised_name": "LOCAL SHOP 00002",
783 "distance_m": 311.70427266037166,
784 "within_1km": true
785 },
786 {
787 "shop_id": "S02542",
788 "normalised_name": "SPINNEYS CAIRO",
789 "distance_m": 333.5818013003781,
790 "within_1km": true
791 }
792 ],
793 "full_distance_matrix_m": [
794 [
795 1967.358940075545,
796 1906.0721805068256,
797 2057.7732290977683
798 ],
799 [
800 2044.9703415666818,
801 1827.5643358853156,
802 2373.640084799799
803 ],
804 [
805 2185.4819201892396,
806 1693.766628293397,
807 2042.0073174423837
808 ],
809 [
810 2185.4819201892396,
811 1693.766628293397,
812 2042.0073174423837
813 ],
814 [
815 2148.4580481657645,
816 1748.4943777893766,
817 2490.7980576197533
818 ]
819 ]
820 },
821 {
822 "anchor_id": "M014",
823 "anchor_name_normalised": "KHAN EL KHALILI APPROACH",
824 "knn": [
825 {
826 "shop_id": "S08861",
827 "normalised_name": "LOCAL SHOP 00002",
828 "distance_m": 195.44221286523796,
829 "within_1km": true
830 },
831 {
832 "shop_id": "S02479",
833 "normalised_name": "HYPERONE",
834 "distance_m": 239.15994784430384,
835 "within_1km": true
836 },
837 {
838 "shop_id": "S01292",
839 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
840 "distance_m": 397.3730247770481,
841 "within_1km": true
842 },
843 {
844 "shop_id": "S08141",
845 "normalised_name": "LOCAL SHOP 00002",
846 "distance_m": 420.6195647371856,
847 "within_1km": true
848 },
849 {
850 "shop_id": "S05133",
851 "normalised_name": "LOCAL SHOP 00002",
852 "distance_m": 428.77681251050234,
853 "within_1km": true
854 }
855 ],
856 "full_distance_matrix_m": [
857 [
858 2031.3605888484756,
859 1844.1346827905936,
860 2047.847301575875
861 ],
862 [
863 1691.4184950097037,
864 2168.9299637161816,
865 2216.139936183984
866 ],
867 [
868 2251.545079183038,
869 1642.2340324864185,
870 2488.0343389068407
871 ],
872 [
873 2330.5226358668865,
874 1540.5054533911564,
875 2391.55826016119
876 ],
877 [
878 1530.7115042313985,
879 2339.971162636291,
880 2117.577897751801
881 ]
882 ]
883 },
884 {
885 "anchor_id": "M015",
886 "anchor_name_normalised": "BAB AL LOUQ CORNER",
887 "knn": [
888 {
889 "shop_id": "S09639",
890 "normalised_name": "LOCAL SHOP 00002",
891 "distance_m": 280.92466357721366,
892 "within_1km": true
893 },
894 {
895 "shop_id": "S02344",
896 "normalised_name": "LOCAL SHOP 00002",
897 "distance_m": 393.9713840536041,
898 "within_1km": true
899 },
900 {
901 "shop_id": "S01648",
902 "normalised_name": "LOCAL SHOP 00002",
903 "distance_m": 394.0461312472808,
904 "within_1km": true
905 },
906 {
907 "shop_id": "S02142",
908 "normalised_name": "\u0633\u0628\u064a\u0646\u064a\u0632",
909 "distance_m": 403.50647651326705,
910 "within_1km": true
911 },
912 {
913 "shop_id": "S06831",
914 "normalised_name": "LOCAL SHOP 00002",
915 "distance_m": 432.07564470242914,
916 "within_1km": true
917 }
918 ],
919 "full_distance_matrix_m": [
920 [
921 1818.7017014788562,
922 2073.827697148884,
923 2470.151425330434
924 ],
925 [
926 1754.7883545602783,
927 2163.7207965418743,
928 2560.346999062
929 ],
930 [
931 1607.726782938215,
932 2275.2290674710102,
933 2038.563023282125
934 ],
935 [
936 1942.3125196005367,
937 2000.88820361442,
938 2619.6202914189776
939 ],
940 [
941 1757.6346013235338,
942 2176.03328346425,
943 1853.5272256948965
944 ]
945 ]
946 },
947 {
948 "anchor_id": "M016",
949 "anchor_name_normalised": "KORBA QUARTER",
950 "knn": [
951 {
952 "shop_id": "S06244",
953 "normalised_name": "LOCAL SHOP 00002",
954 "distance_m": 79.63821691176408,
955 "within_1km": true
956 },
957 {
958 "shop_id": "S09855",
959 "normalised_name": "LOCAL SHOP 00002",
960 "distance_m": 110.63027476485074,
961 "within_1km": true
962 },
963 {
964 "shop_id": "S02801",
965 "normalised_name": "OSCAR",
966 "distance_m": 136.61037886639022,
967 "within_1km": true
968 },
969 {
970 "shop_id": "S02599",
971 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
972 "distance_m": 146.17389022650093,
973 "within_1km": true
974 },
975 {
976 "shop_id": "S05243",
977 "normalised_name": "ABU ZIKRI",
978 "distance_m": 191.80843676473407,
979 "within_1km": true
980 }
981 ],
982 "full_distance_matrix_m": [
983 [
984 1920.1698805572973,
985 1943.3149588433434,
986 2138.296224313246
987 ],
988 [
989 2034.137557926075,
990 1826.9033350458037,
991 2180.8179473553346
992 ],
993 [
994 1842.7413360721016,
995 2022.955357929399,
996 2321.3801532191983
997 ],
998 [
999 2004.6537405770455,
1000 1864.0810489027579,
1001 2346.195227918504
1002 ],
1003 [
1004 2039.4392665431333,
1005 1834.3790944419904,
1006 2381.15650313787
1007 ]
1008 ]
1009 },
1010 {
1011 "anchor_id": "M017",
1012 "anchor_name_normalised": "MANIAL RIVERBANK",
1013 "knn": [
1014 {
1015 "shop_id": "S08401",
1016 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
1017 "distance_m": 247.91305439190478,
1018 "within_1km": true
1019 },
1020 {
1021 "shop_id": "S00614",
1022 "normalised_name": "SPINNEYS CAIRO",
1023 "distance_m": 289.9793932231403,
1024 "within_1km": true
1025 },
1026 {
1027 "shop_id": "S06816",
1028 "normalised_name": "LOCAL SHOP 00002",
1029 "distance_m": 364.6076739386967,
1030 "within_1km": true
1031 },
1032 {
1033 "shop_id": "S09964",
1034 "normalised_name": "LOCAL SHOP 00002",
1035 "distance_m": 386.2111413338465,
1036 "within_1km": true
1037 },
1038 {
1039 "shop_id": "S09153",
1040 "normalised_name": "LOCAL SHOP 00002",
1041 "distance_m": 406.1194857895146,
1042 "within_1km": true
1043 }
1044 ],
1045 "full_distance_matrix_m": [
1046 [
1047 1907.0571440610574,
1048 1984.1118297980315,
1049 2462.218596325607
1050 ],
1051 [
1052 2081.9871401092723,
1053 1812.2201884672854,
1054 2476.8720782571954
1055 ],
1056 [
1057 2092.1955342796105,
1058 1827.4661078889285,
1059 1882.93131551137
1060 ],
1061 [
1062 2313.2893381769786,
1063 1548.4773791696457,
1064 2302.074171161195
1065 ],
1066 [
1067 2089.745565279552,
1068 1847.5329245250348,
1069 2606.8664236972577
1070 ]
1071 ]
1072 },
1073 {
1074 "anchor_id": "M018",
1075 "anchor_name_normalised": "SHUBRA NORTH",
1076 "knn": [
1077 {
1078 "shop_id": "S04367",
1079 "normalised_name": "SPINEYS",
1080 "distance_m": 131.73231447097913,
1081 "within_1km": true
1082 },
1083 {
1084 "shop_id": "S04591",
1085 "normalised_name": "LOCAL SHOP 00002",
1086 "distance_m": 132.00104715490687,
1087 "within_1km": true
1088 },
1089 {
1090 "shop_id": "S00580",
1091 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
1092 "distance_m": 160.07042572502343,
1093 "within_1km": true
1094 },
1095 {
1096 "shop_id": "S04121",
1097 "normalised_name": "CARREFOUR",
1098 "distance_m": 380.4763770065149,
1099 "within_1km": true
1100 },
1101 {
1102 "shop_id": "S01396",
1103 "normalised_name": "OSCAR",
1104 "distance_m": 411.76394264781203,
1105 "within_1km": true
1106 }
1107 ],
1108 "full_distance_matrix_m": [
1109 [
1110 1982.5894812838128,
1111 1885.4603214159715,
1112 2095.2144000885332
1113 ],
1114 [
1115 1982.7632456326057,
1116 1885.3152216835642,
1117 2094.9926668597604
1118 ],
1119 [
1120 2078.691887125919,
1121 1783.5569280079872,
1122 2283.6761412901737
1123 ],
1124 [
1125 2216.575840805555,
1126 1681.4658930485878,
1127 1967.8035521340892
1128 ],
1129 [
1130 2284.324338870431,
1131 1603.6328805329863,
1132 2469.109038659215
1133 ]
1134 ]
1135 },
1136 {
1137 "anchor_id": "M019",
1138 "anchor_name_normalised": "AIN SHAMS PLAZA",
1139 "knn": [
1140 {
1141 "shop_id": "S08667",
1142 "normalised_name": "LOCAL SHOP 00002",
1143 "distance_m": 684.0996579797446,
1144 "within_1km": true
1145 },
1146 {
1147 "shop_id": "S07904",
1148 "normalised_name": "OSCAR",
1149 "distance_m": 1176.893080438831,
1150 "within_1km": false
1151 },
1152 {
1153 "shop_id": "S01200",
1154 "normalised_name": "ABOU ZEKRY",
1155 "distance_m": 1257.3414752733888,
1156 "within_1km": false
1157 },
1158 {
1159 "shop_id": "S07089",
1160 "normalised_name": "LOCAL SHOP 00002",
1161 "distance_m": 1279.0357696977744,
1162 "within_1km": false
1163 },
1164 {
1165 "shop_id": "S04445",
1166 "normalised_name": "SEOUDI",
1167 "distance_m": 1382.4511076880806,
1168 "within_1km": false
1169 }
1170 ],
1171 "full_distance_matrix_m": [
1172 [
1173 2253.827368722319,
1174 1818.6634054951667,
1175 1589.2926110525311
1176 ],
1177 [
1178 858.6201100324865,
1179 3079.541539829715,
1180 2777.4969541277324
1181 ],
1182 [
1183 682.6889026845546,
1184 3185.3852701471656,
1185 2466.289650955246
1186 ],
1187 [
1188 700.3709488814691,
1189 3198.7606985978905,
1190 2734.9770391523048
1191 ],
1192 [
1193 550.4296116468323,
1194 3312.139319916,
1195 2573.143405782215
1196 ]
1197 ]
1198 },
1199 {
1200 "anchor_id": "M020",
1201 "anchor_name_normalised": "ABBASIYA JUNCTION",
1202 "knn": [
1203 {
1204 "shop_id": "S04479",
1205 "normalised_name": "\u0647\u0627\u064a\u0628\u0631 \u0648\u0627\u0646",
1206 "distance_m": 533.8840304045726,
1207 "within_1km": true
1208 },
1209 {
1210 "shop_id": "S00183",
1211 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1212 "distance_m": 542.8963509721391,
1213 "within_1km": true
1214 },
1215 {
1216 "shop_id": "S02604",
1217 "normalised_name": "LOCAL SHOP 00002",
1218 "distance_m": 876.244824297051,
1219 "within_1km": true
1220 },
1221 {
1222 "shop_id": "S08735",
1223 "normalised_name": "SEOUDI",
1224 "distance_m": 1519.8205245264585,
1225 "within_1km": false
1226 },
1227 {
1228 "shop_id": "S08901",
1229 "normalised_name": "LOCAL SHOP 00002",
1230 "distance_m": 1550.5761817107218,
1231 "within_1km": false
1232 }
1233 ],
1234 "full_distance_matrix_m": [
1235 [
1236 2182.677279804542,
1237 1731.180965536903,
1238 2721.0146097371116
1239 ],
1240 [
1241 2461.6923314864202,
1242 2158.077198336684,
1243 2400.628552225825
1244 ],
1245 [
1246 2804.7116960475405,
1247 2443.7734869776764,
1248 2322.5898167171567
1249 ],
1250 [
1251 2132.578563708277,
1252 3707.335151803096,
1253 840.3492758458228
1254 ],
1255 [
1256 2179.370476669656,
1257 3743.0012153155785,
1258 793.3010810396031
1259 ]
1260 ]
1261 },
1262 {
1263 "anchor_id": "M021",
1264 "anchor_name_normalised": "BOULAQ EDGE",
1265 "knn": [
1266 {
1267 "shop_id": "S02452",
1268 "normalised_name": "HYPERONE",
1269 "distance_m": 143.1241609116162,
1270 "within_1km": true
1271 },
1272 {
1273 "shop_id": "S04480",
1274 "normalised_name": "KHEIR ZAMAN",
1275 "distance_m": 155.55038038330025,
1276 "within_1km": true
1277 },
1278 {
1279 "shop_id": "S02622",
1280 "normalised_name": "CARREFOUR",
1281 "distance_m": 218.84497670307692,
1282 "within_1km": true
1283 },
1284 {
1285 "shop_id": "S03134",
1286 "normalised_name": "METRO",
1287 "distance_m": 232.59502642875754,
1288 "within_1km": true
1289 },
1290 {
1291 "shop_id": "S01855",
1292 "normalised_name": "ABU ZIKRI",
1293 "distance_m": 277.90772584339544,
1294 "within_1km": true
1295 }
1296 ],
1297 "full_distance_matrix_m": [
1298 [
1299 1794.2753798350234,
1300 2265.7139320806596,
1301 2176.7319614651688
1302 ],
1303 [
1304 1779.4142719821407,
1305 2260.5135191479403,
1306 2183.8322346874083
1307 ],
1308 [
1309 1717.6896580007617,
1310 2278.1079573762568,
1311 2176.387665769166
1312 ],
1313 [
1314 1702.9528607990133,
1315 2277.0171460598835,
1316 2180.3776746662165
1317 ],
1318 [
1319 1817.5570359835367,
1320 2466.625271671516,
1321 1975.0632969454878
1322 ]
1323 ]
1324 },
1325 {
1326 "anchor_id": "M022",
1327 "anchor_name_normalised": "GARBIYA PLAZA",
1328 "knn": [
1329 {
1330 "shop_id": "S00964",
1331 "normalised_name": "HYPERONE",
1332 "distance_m": 289.51834290291646,
1333 "within_1km": true
1334 },
1335 {
1336 "shop_id": "S05290",
1337 "normalised_name": "LOCAL SHOP 00002",
1338 "distance_m": 299.54978355732356,
1339 "within_1km": true
1340 },
1341 {
1342 "shop_id": "S08907",
1343 "normalised_name": "LOCAL SHOP 00002",
1344 "distance_m": 386.38811579473196,
1345 "within_1km": true
1346 },
1347 {
1348 "shop_id": "S06907",
1349 "normalised_name": "HYPERONE",
1350 "distance_m": 413.3161064345021,
1351 "within_1km": true
1352 },
1353 {
1354 "shop_id": "S05230",
1355 "normalised_name": "SEOUDI",
1356 "distance_m": 436.67983544902154,
1357 "within_1km": true
1358 }
1359 ],
1360 "full_distance_matrix_m": [
1361 [
1362 1713.9523500707226,
1363 2162.8362045645863,
1364 2047.8577026193373
1365 ],
1366 [
1367 1839.9535186244389,
1368 2059.5987872725245,
1369 1941.9851293960164
1370 ],
1371 [
1372 2138.0840816826185,
1373 1781.7646896796691,
1374 2564.842672422845
1375 ],
1376 [
1377 2310.764117477486,
1378 1565.207385342791,
1379 2075.9476133461067
1380 ],
1381 [
1382 1909.2394983294405,
1383 2045.532165242939,
1384 1787.3561767400536
1385 ]
1386 ]
1387 },
1388 {
1389 "anchor_id": "M023",
1390 "anchor_name_normalised": "SAKAKINI APPROACH",
1391 "knn": [
1392 {
1393 "shop_id": "S07861",
1394 "normalised_name": "LOCAL SHOP 00002",
1395 "distance_m": 431.1948144298982,
1396 "within_1km": true
1397 },
1398 {
1399 "shop_id": "S06043",
1400 "normalised_name": "OSCAR",
1401 "distance_m": 547.5408447385797,
1402 "within_1km": true
1403 },
1404 {
1405 "shop_id": "S09406",
1406 "normalised_name": "CARREFOUR",
1407 "distance_m": 548.9206787644811,
1408 "within_1km": true
1409 },
1410 {
1411 "shop_id": "S05303",
1412 "normalised_name": "LOCAL SHOP 00002",
1413 "distance_m": 576.1699040165486,
1414 "within_1km": true
1415 },
1416 {
1417 "shop_id": "S02485",
1418 "normalised_name": "LOCAL SHOP 00002",
1419 "distance_m": 589.7690715357046,
1420 "within_1km": true
1421 }
1422 ],
1423 "full_distance_matrix_m": [
1424 [
1425 1924.0047414103071,
1426 2029.1673528791073,
1427 2645.4212356832304
1428 ],
1429 [
1430 1485.0337037210072,
1431 2416.988906602306,
1432 2540.145012699295
1433 ],
1434 [
1435 2272.404182318125,
1436 1699.0768031589844,
1437 1778.7619662395527
1438 ],
1439 [
1440 1488.7253701891314,
1441 2428.086657724222,
1442 1952.4521714778202
1443 ],
1444 [
1445 1511.7201712527149,
1446 2420.301106868626,
1447 2623.7346747647316
1448 ]
1449 ]
1450 },
1451 {
1452 "anchor_id": "M024",
1453 "anchor_name_normalised": "DAR EL SALAAM",
1454 "knn": [
1455 {
1456 "shop_id": "S08247",
1457 "normalised_name": "LOCAL SHOP 00002",
1458 "distance_m": 303.7715553270038,
1459 "within_1km": true
1460 },
1461 {
1462 "shop_id": "S06329",
1463 "normalised_name": "LOCAL SHOP 00002",
1464 "distance_m": 491.1166276130505,
1465 "within_1km": true
1466 },
1467 {
1468 "shop_id": "S08710",
1469 "normalised_name": "LOCAL SHOP 00002",
1470 "distance_m": 504.70580510056124,
1471 "within_1km": true
1472 },
1473 {
1474 "shop_id": "S09186",
1475 "normalised_name": "KHEIR ZAMAN",
1476 "distance_m": 727.1381609050588,
1477 "within_1km": true
1478 },
1479 {
1480 "shop_id": "S08321",
1481 "normalised_name": "KHEIR ZAMAN",
1482 "distance_m": 888.8616133708905,
1483 "within_1km": true
1484 }
1485 ],
1486 "full_distance_matrix_m": [
1487 [
1488 2132.6731672273595,
1489 1756.1834962667037,
1490 1988.8492435786827
1491 ],
1492 [
1493 2419.232059909494,
1494 1441.3316900456923,
1495 2313.9113699588606
1496 ],
1497 [
1498 1438.7324047816662,
1499 2426.383575569832,
1500 2173.317483910219
1501 ],
1502 [
1503 2118.1353815960015,
1504 2004.797296535227,
1505 1493.6711329592345
1506 ],
1507 [
1508 1136.3107773659556,
1509 2781.5317641590054,
1510 2086.8389809734235
1511 ]
1512 ]
1513 },
1514 {
1515 "anchor_id": "M025",
1516 "anchor_name_normalised": "EL MARG HUB",
1517 "knn": [
1518 {
1519 "shop_id": "S06563",
1520 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1521 "distance_m": 95.12558429869074,
1522 "within_1km": true
1523 },
1524 {
1525 "shop_id": "S07868",
1526 "normalised_name": "OSCAR",
1527 "distance_m": 238.9301245897368,
1528 "within_1km": true
1529 },
1530 {
1531 "shop_id": "S04428",
1532 "normalised_name": "LOCAL SHOP 00002",
1533 "distance_m": 295.7640206059658,
1534 "within_1km": true
1535 },
1536 {
1537 "shop_id": "S09140",
1538 "normalised_name": "LOCAL SHOP 00002",
1539 "distance_m": 477.1403198199402,
1540 "within_1km": true
1541 },
1542 {
1543 "shop_id": "S05093",
1544 "normalised_name": "LOCAL SHOP 00002",
1545 "distance_m": 498.72631896592196,
1546 "within_1km": true
1547 }
1548 ],
1549 "full_distance_matrix_m": [
1550 [
1551 1846.016850950575,
1552 2014.4655163423067,
1553 2262.8065343928874
1554 ],
1555 [
1556 1829.9212117309032,
1557 2052.6088472768997,
1558 2430.69175297327
1559 ],
1560 [
1561 1831.1386184118976,
1562 2066.27280605199,
1563 2490.7815358186076
1564 ],
1565 [
1566 1843.9551188977769,
1567 2121.940256980925,
1568 2676.13693110598
1569 ],
1570 [
1571 2366.763817436219,
1572 1530.961415108951,
1573 1996.4602419151063
1574 ]
1575 ]
1576 },
1577 {
1578 "anchor_id": "M026",
1579 "anchor_name_normalised": "HELWAN CENTRE",
1580 "knn": [
1581 {
1582 "shop_id": "S00688",
1583 "normalised_name": "LOCAL SHOP 00002",
1584 "distance_m": 392.5586511060098,
1585 "within_1km": true
1586 },
1587 {
1588 "shop_id": "S09139",
1589 "normalised_name": "LOCAL SHOP 00002",
1590 "distance_m": 498.6898178044325,
1591 "within_1km": true
1592 },
1593 {
1594 "shop_id": "S07966",
1595 "normalised_name": "LOCAL SHOP 00002",
1596 "distance_m": 632.700793055098,
1597 "within_1km": true
1598 },
1599 {
1600 "shop_id": "S06235",
1601 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1602 "distance_m": 635.9608767777365,
1603 "within_1km": true
1604 },
1605 {
1606 "shop_id": "S06933",
1607 "normalised_name": "SPINNEYS CAIRO",
1608 "distance_m": 695.1426282008323,
1609 "within_1km": true
1610 }
1611 ],
1612 "full_distance_matrix_m": [
1613 [
1614 2280.327646779559,
1615 1598.7435268378388,
1616 2433.075679457458
1617 ],
1618 [
1619 1886.6624754709298,
1620 2094.2822056800082,
1621 1733.3147410448998
1622 ],
1623 [
1624 2535.0629160323774,
1625 1349.7158468246641,
1626 2500.0589961672763
1627 ],
1628 [
1629 2339.3214340955215,
1630 1668.504982946146,
1631 2771.141270018388
1632 ],
1633 [
1634 2593.8485369626424,
1635 1298.4737441305465,
1636 2540.289549729795
1637 ]
1638 ]
1639 },
1640 {
1641 "anchor_id": "M027",
1642 "anchor_name_normalised": "MAASARA CROSSING",
1643 "knn": [
1644 {
1645 "shop_id": "S01296",
1646 "normalised_name": "SEOUDI",
1647 "distance_m": 50.30439580908293,
1648 "within_1km": true
1649 },
1650 {
1651 "shop_id": "S09440",
1652 "normalised_name": "KHEIR ZAMAN",
1653 "distance_m": 193.50361755248164,
1654 "within_1km": true
1655 },
1656 {
1657 "shop_id": "S09344",
1658 "normalised_name": "CARREFOUR",
1659 "distance_m": 292.1455578486927,
1660 "within_1km": true
1661 },
1662 {
1663 "shop_id": "S09777",
1664 "normalised_name": "\u0643\u0627\u0631\u0641\u0648\u0631",
1665 "distance_m": 385.1789866962899,
1666 "within_1km": true
1667 },
1668 {
1669 "shop_id": "S00107",
1670 "normalised_name": "CARREFOUR",
1671 "distance_m": 450.79034804135176,
1672 "within_1km": true
1673 }
1674 ],
1675 "full_distance_matrix_m": [
1676 [
1677 1978.281884009472,
1678 1881.2963211945312,
1679 2230.96275788161
1680 ],
1681 [
1682 1750.8390638988976,
1683 2111.2369591817637,
1684 2154.4192129655657
1685 ],
1686 [
1687 2146.5711751638637,
1688 1735.191999747973,
1689 2021.4033750403437
1690 ],
1691 [
1692 1907.3777204348344,
1693 2026.3769011136835,
1694 2598.149486367052
1695 ],
1696 [
1697 1839.1289499523343,
1698 2114.6073596843985,
1699 2648.965332211819
1700 ]
1701 ]
1702 },
1703 {
1704 "anchor_id": "M028",
1705 "anchor_name_normalised": "TORA EDGE",
1706 "knn": [
1707 {
1708 "shop_id": "S07222",
1709 "normalised_name": "CARREFOUR",
1710 "distance_m": 1038.647391249567,
1711 "within_1km": false
1712 },
1713 {
1714 "shop_id": "S08146",
1715 "normalised_name": "LOCAL SHOP 00002",
1716 "distance_m": 1146.4814793156884,
1717 "within_1km": false
1718 },
1719 {
1720 "shop_id": "S00413",
1721 "normalised_name": "LOCAL SHOP 00002",
1722 "distance_m": 1162.898346623925,
1723 "within_1km": false
1724 },
1725 {
1726 "shop_id": "S07665",
1727 "normalised_name": "CARREFOUR",
1728 "distance_m": 1370.9550398089314,
1729 "within_1km": false
1730 },
1731 {
1732 "shop_id": "S08878",
1733 "normalised_name": "\u0623\u0628\u0648 \u0632\u0643\u0631\u064a",
1734 "distance_m": 1379.8701064923816,
1735 "within_1km": false
1736 }
1737 ],
1738 "full_distance_matrix_m": [
1739 [
1740 2022.3031209041312,
1741 2348.4092386495886,
1742 3244.430857967576
1743 ],
1744 [
1745 1326.0987485101753,
1746 2884.210758977075,
1747 1678.602283192458
1748 ],
1749 [
1750 1677.6767157311933,
1751 2708.7339019933934,
1752 3274.4270356593684
1753 ],
1754 [
1755 561.6596656088414,
1756 3300.2213341066963,
1757 2565.8451356194964
1758 ],
1759 [
1760 1463.3767653012455,
1761 3018.900591657248,
1762 3383.0311962219066
1763 ]
1764 ]
1765 },
1766 {
1767 "anchor_id": "M029",
1768 "anchor_name_normalised": "MOKATTAM HEIGHTS",
1769 "knn": [
1770 {
1771 "shop_id": "S04699",
1772 "normalised_name": "ABOU ZEKRY",
1773 "distance_m": 926.1133200433566,
1774 "within_1km": true
1775 },
1776 {
1777 "shop_id": "S08181",
1778 "normalised_name": "CARREFOUR",
1779 "distance_m": 1338.4185443902384,
1780 "within_1km": false
1781 },
1782 {
1783 "shop_id": "S08735",
1784 "normalised_name": "SEOUDI",
1785 "distance_m": 1715.744166223812,
1786 "within_1km": false
1787 },
1788 {
1789 "shop_id": "S08901",
1790 "normalised_name": "LOCAL SHOP 00002",
1791 "distance_m": 1724.5952583670617,
1792 "within_1km": false
1793 },
1794 {
1795 "shop_id": "S05829",
1796 "normalised_name": "SPINEYS",
1797 "distance_m": 1792.8402244185731,
1798 "within_1km": false
1799 }
1800 ],
1801 "full_distance_matrix_m": [
1802 [
1803 1622.4428644808077,
1804 2555.6697813726555,
1805 1526.8257430730068
1806 ],
1807 [
1808 3255.384511654304,
1809 657.9522434613671,
1810 2787.1720972270386
1811 ],
1812 [
1813 3553.833575016254,
1814 840.3492758458228,
1815 2132.578563708277
1816 ],
1817 [
1818 3573.159483530612,
1819 793.3010810396031,
1820 2179.370476669656
1821 ],
1822 [
1823 3658.0340871700205,
1824 704.0165384983723,
1825 2286.9531951465624
1826 ]
1827 ]
1828 },
1829 {
1830 "anchor_id": "M030",
1831 "anchor_name_normalised": "NOZHA PROMENADE",
1832 "knn": [
1833 {
1834 "shop_id": "S08181",
1835 "normalised_name": "CARREFOUR",
1836 "distance_m": 657.9522434613671,
1837 "within_1km": true
1838 },
1839 {
1840 "shop_id": "S05829",
1841 "normalised_name": "SPINEYS",
1842 "distance_m": 704.0165384983723,
1843 "within_1km": true
1844 },
1845 {
1846 "shop_id": "S08901",
1847 "normalised_name": "LOCAL SHOP 00002",
1848 "distance_m": 793.3010810396031,
1849 "within_1km": true
1850 },
1851 {
1852 "shop_id": "S08735",
1853 "normalised_name": "SEOUDI",
1854 "distance_m": 840.3492758458228,
1855 "within_1km": true
1856 },
1857 {
1858 "shop_id": "S01591",
1859 "normalised_name": "METRO",
1860 "distance_m": 932.5918427641366,
1861 "within_1km": true
1862 }
1863 ],
1864 "full_distance_matrix_m": [
1865 [
1866 1338.4185443902384,
1867 2531.719439640108,
1868 2070.5277465741988
1869 ],
1870 [
1871 1792.8402244185731,
1872 1584.6061503065903,
1873 2882.9157654971996
1874 ],
1875 [
1876 1724.5952583670617,
1877 1550.5761817107218,
1878 2947.077867103685
1879 ],
1880 [
1881 1715.744166223812,
1882 1519.8205245264585,
1883 2988.882883492248
1884 ],
1885 [
1886 2192.405943934767,
1887 3148.5155747292247,
1888 1287.3180202950216
1889 ]
1890 ]
1891 },
1892 {
1893 "anchor_id": "M031",
1894 "anchor_name_normalised": "SHERATON HELIOPOLIS",
1895 "knn": [
1896 {
1897 "shop_id": "S00527",
1898 "normalised_name": "LOCAL SHOP 00002",
1899 "distance_m": 253.7596125751528,
1900 "within_1km": true
1901 },
1902 {
1903 "shop_id": "S01047",
1904 "normalised_name": "LOCAL SHOP 00002",
1905 "distance_m": 283.246388808315,
1906 "within_1km": true
1907 },
1908 {
1909 "shop_id": "S04959",
1910 "normalised_name": "LOCAL SHOP 00002",
1911 "distance_m": 346.5915949884266,
1912 "within_1km": true
1913 },
1914 {
1915 "shop_id": "S08893",
1916 "normalised_name": "METRO",
1917 "distance_m": 350.5277927644183,
1918 "within_1km": true
1919 },
1920 {
1921 "shop_id": "S06835",
1922 "normalised_name": "SPINNEYS CAIRO",
1923 "distance_m": 350.5277927644183,
1924 "within_1km": true
1925 }
1926 ],
1927 "full_distance_matrix_m": [
1928 [
1929 1677.4443325360598,
1930 2202.958446098429,
1931 2259.7512981823693
1932 ],
1933 [
1934 1650.181364181898,
1935 2278.639968221351,
1936 2190.6551628335355
1937 ],
1938 [
1939 1923.8325573847915,
1940 2561.9716554921415,
1941 1872.7681601061568
1942 ],
1943 [
1944 2142.3882584422627,
1945 1934.0543636868153,
1946 2517.1190957608624
1947 ],
1948 [
1949 2142.3882584422627,
1950 1934.0543636868153,
1951 2517.1190957608624
1952 ]
1953 ]
1954 },
1955 {
1956 "anchor_id": "M032",
1957 "anchor_name_normalised": "TRIUMPH SQUARE",
1958 "knn": [
1959 {
1960 "shop_id": "S01025",
1961 "normalised_name": "LOCAL SHOP 00002",
1962 "distance_m": 79.83756885715013,
1963 "within_1km": true
1964 },
1965 {
1966 "shop_id": "S02664",
1967 "normalised_name": "LOCAL SHOP 00002",
1968 "distance_m": 157.66656231613084,
1969 "within_1km": true
1970 },
1971 {
1972 "shop_id": "S02254",
1973 "normalised_name": "LOCAL SHOP 00002",
1974 "distance_m": 164.90230028067674,
1975 "within_1km": true
1976 },
1977 {
1978 "shop_id": "S02175",
1979 "normalised_name": "ABOU ZEKRY",
1980 "distance_m": 174.60568615294582,
1981 "within_1km": true
1982 },
1983 {
1984 "shop_id": "S01506",
1985 "normalised_name": "LOCAL SHOP 00002",
1986 "distance_m": 192.93799451313052,
1987 "within_1km": true
1988 }
1989 ],
1990 "full_distance_matrix_m": [
1991 [
1992 1929.059067072471,
1993 1932.916468256681,
1994 2296.874167306396
1995 ],
1996 [
1997 1780.2544880608473,
1998 2079.6921654515395,
1999 2271.2840176007116
2000 ],
<system-reminder>Showed lines 1-2000 of 6302. Re-call Read with offset=2001 to continue, or raise limit.</system-reminder>
3:52