fio-l2-cairo-mixedgeom-split
Map (reference ← swipe → agent)
0:00
Heritage analyst here. I've put together `heritage_sites.geojson` from my own field work, and every site in it is several features sharing a `site_id`. I need to load the data into our desktop tool, which only ingests typed GPKG layers, no mixed-geometry files, and every feature has to be single-part. Can you give me back `heritage.gpkg` with three layers named `points`, `lines`, and `polygons`, keeping the `site_id` on every feature so I don't lose the cross-layer link? Use Egypt's national grid.
0:00
System info
{
"adapter": "openrouter",
"model": "deepseek/deepseek-v4-flash",
"base_url": "https://openrouter.ai/api/v1"
}
0:03
Let me start by reading the `heritage_sites.geojson` file to understand its structure and geometry types.
0:03
Read
/work/heritage_sites.geojson
1 {
2 "type": "FeatureCollection",
3 "name": "cairo_heritage_sites",
4 "crs": {
5 "type": "name",
6 "properties": {
7 "name": "urn:ogc:def:crs:OGC:1.3:CRS84"
8 }
9 },
10 "features": [
11 {
12 "type": "Feature",
13 "geometry": {
14 "type": "Polygon",
15 "coordinates": [
16 [
17 [
18 31.256,
19 30.0316
20 ],
21 [
22 31.2572,
23 30.0316
24 ],
25 [
26 31.2572,
27 30.0328
28 ],
29 [
30 31.256,
31 30.0328
32 ],
33 [
34 31.256,
35 30.0316
36 ]
37 ]
38 ]
39 },
40 "properties": {
41 "site_id": "EG-CAI-001",
42 "feature_kind": "enclosure",
43 "name_en": "Sultan Hassan Mosque-Madrasa",
44 "name_ar": "مسجد ومدرسة السلطان حسن"
45 }
46 },
47 {
48 "type": "Feature",
49 "geometry": {
50 "type": "LineString",
51 "coordinates": [
52 [
53 31.2556,
54 30.0321
55 ],
56 [
57 31.2566,
58 30.0322
59 ],
60 [
61 31.2576,
62 30.0323
63 ]
64 ]
65 },
66 "properties": {
67 "site_id": "EG-CAI-001",
68 "feature_kind": "axial_line_1",
69 "name_en": "Sultan Hassan Mosque-Madrasa",
70 "name_ar": "مسجد ومدرسة السلطان حسن"
71 }
72 },
73 {
74 "type": "Feature",
75 "geometry": {
76 "type": "LineString",
77 "coordinates": [
78 [
79 31.2567,
80 30.0312
81 ],
82 [
83 31.2566,
84 30.0322
85 ],
86 [
87 31.2565,
88 30.0332
89 ]
90 ]
91 },
92 "properties": {
93 "site_id": "EG-CAI-001",
94 "feature_kind": "axial_line_2",
95 "name_en": "Sultan Hassan Mosque-Madrasa",
96 "name_ar": "مسجد ومدرسة السلطان حسن"
97 }
98 },
99 {
100 "type": "Feature",
101 "geometry": {
102 "type": "Point",
103 "coordinates": [
104 31.2566,
105 30.0326
106 ]
107 },
108 "properties": {
109 "site_id": "EG-CAI-001",
110 "feature_kind": "marker_gateway",
111 "name_en": "Sultan Hassan Mosque-Madrasa",
112 "name_ar": "مسجد ومدرسة السلطان حسن"
113 }
114 },
115 {
116 "type": "Feature",
117 "geometry": {
118 "type": "Point",
119 "coordinates": [
120 31.257,
121 30.0322
122 ]
123 },
124 "properties": {
125 "site_id": "EG-CAI-001",
126 "feature_kind": "marker_mihrab",
127 "name_en": "Sultan Hassan Mosque-Madrasa",
128 "name_ar": "مسجد ومدرسة السلطان حسن"
129 }
130 },
131 {
132 "type": "Feature",
133 "geometry": {
134 "type": "Point",
135 "coordinates": [
136 31.2566,
137 30.0318
138 ]
139 },
140 "properties": {
141 "site_id": "EG-CAI-001",
142 "feature_kind": "marker_minaret",
143 "name_en": "Sultan Hassan Mosque-Madrasa",
144 "name_ar": "مسجد ومدرسة السلطان حسن"
145 }
146 },
147 {
148 "type": "Feature",
149 "geometry": {
150 "type": "MultiPolygon",
151 "coordinates": [
152 [
153 [
154 [
155 31.257,
156 30.0324
157 ],
158 [
159 31.2582,
160 30.0324
161 ],
162 [
163 31.2582,
164 30.0336
165 ],
166 [
167 31.257,
168 30.0336
169 ],
170 [
171 31.257,
172 30.0324
173 ]
174 ]
175 ],
176 [
177 [
178 [
179 31.25865,
180 30.03349
181 ],
182 [
183 31.25935,
184 30.03349
185 ],
186 [
187 31.25935,
188 30.03419
189 ],
190 [
191 31.25865,
192 30.03419
193 ],
194 [
195 31.25865,
196 30.03349
197 ]
198 ]
199 ]
200 ]
201 },
202 "properties": {
203 "site_id": "EG-CAI-002",
204 "feature_kind": "enclosure",
205 "name_en": "Al-Rifai Mosque",
206 "name_ar": "مسجد الرفاعي"
207 }
208 },
209 {
210 "type": "Feature",
211 "geometry": {
212 "type": "LineString",
213 "coordinates": [
214 [
215 31.2566,
216 30.0329
217 ],
218 [
219 31.2576,
220 30.033
221 ],
222 [
223 31.2586,
224 30.0331
225 ]
226 ]
227 },
228 "properties": {
229 "site_id": "EG-CAI-002",
230 "feature_kind": "axial_line_1",
231 "name_en": "Al-Rifai Mosque",
232 "name_ar": "مسجد الرفاعي"
233 }
234 },
235 {
236 "type": "Feature",
237 "geometry": {
238 "type": "Point",
239 "coordinates": [
240 31.2576,
241 30.0334
242 ]
243 },
244 "properties": {
245 "site_id": "EG-CAI-002",
246 "feature_kind": "marker_gateway",
247 "name_en": "Al-Rifai Mosque",
248 "name_ar": "مسجد الرفاعي"
249 }
250 },
251 {
252 "type": "Feature",
253 "geometry": {
254 "type": "Point",
255 "coordinates": [
256 31.258,
257 30.033
258 ]
259 },
260 "properties": {
261 "site_id": "EG-CAI-002",
262 "feature_kind": "marker_mihrab",
263 "name_en": "Al-Rifai Mosque",
264 "name_ar": "مسجد الرفاعي"
265 }
266 },
267 {
268 "type": "Feature",
269 "geometry": {
270 "type": "MultiPolygon",
271 "coordinates": [
272 [
273 [
274 [
275 31.2491,
276 30.0281
277 ],
278 [
279 31.2503,
280 30.0281
281 ],
282 [
283 31.2503,
284 30.0293
285 ],
286 [
287 31.2491,
288 30.0293
289 ],
290 [
291 31.2491,
292 30.0281
293 ]
294 ]
295 ],
296 [
297 [
298 [
299 31.25075,
300 30.02919
301 ],
302 [
303 31.25145,
304 30.02919
305 ],
306 [
307 31.25145,
308 30.02989
309 ],
310 [
311 31.25075,
312 30.02989
313 ],
314 [
315 31.25075,
316 30.02919
317 ]
318 ]
319 ]
320 ]
321 },
322 "properties": {
323 "site_id": "EG-CAI-003",
324 "feature_kind": "enclosure",
325 "name_en": "Ibn Tulun Mosque",
326 "name_ar": "مسجد ابن طولون"
327 }
328 },
329 {
330 "type": "Feature",
331 "geometry": {
332 "type": "LineString",
333 "coordinates": [
334 [
335 31.2487,
336 30.0286
337 ],
338 [
339 31.2497,
340 30.0287
341 ],
342 [
343 31.2507,
344 30.0288
345 ]
346 ]
347 },
348 "properties": {
349 "site_id": "EG-CAI-003",
350 "feature_kind": "axial_line_1",
351 "name_en": "Ibn Tulun Mosque",
352 "name_ar": "مسجد ابن طولون"
353 }
354 },
355 {
356 "type": "Feature",
357 "geometry": {
358 "type": "LineString",
359 "coordinates": [
360 [
361 31.2498,
362 30.0277
363 ],
364 [
365 31.2497,
366 30.0287
367 ],
368 [
369 31.2496,
370 30.0297
371 ]
372 ]
373 },
374 "properties": {
375 "site_id": "EG-CAI-003",
376 "feature_kind": "axial_line_2",
377 "name_en": "Ibn Tulun Mosque",
378 "name_ar": "مسجد ابن طولون"
379 }
380 },
381 {
382 "type": "Feature",
383 "geometry": {
384 "type": "Point",
385 "coordinates": [
386 31.2497,
387 30.0291
388 ]
389 },
390 "properties": {
391 "site_id": "EG-CAI-003",
392 "feature_kind": "marker_gateway",
393 "name_en": "Ibn Tulun Mosque",
394 "name_ar": "مسجد ابن طولون"
395 }
396 },
397 {
398 "type": "Feature",
399 "geometry": {
400 "type": "Point",
401 "coordinates": [
402 31.2501,
403 30.0287
404 ]
405 },
406 "properties": {
407 "site_id": "EG-CAI-003",
408 "feature_kind": "marker_mihrab",
409 "name_en": "Ibn Tulun Mosque",
410 "name_ar": "مسجد ابن طولون"
411 }
412 },
413 {
414 "type": "Feature",
415 "geometry": {
416 "type": "Point",
417 "coordinates": [
418 31.2497,
419 30.0283
420 ]
421 },
422 "properties": {
423 "site_id": "EG-CAI-003",
424 "feature_kind": "marker_minaret",
425 "name_en": "Ibn Tulun Mosque",
426 "name_ar": "مسجد ابن طولون"
427 }
428 },
429 {
430 "type": "Feature",
431 "geometry": {
432 "type": "Polygon",
433 "coordinates": [
434 [
435 [
436 31.2618,
437 30.0453
438 ],
439 [
440 31.263,
441 30.0453
442 ],
443 [
444 31.263,
445 30.0465
446 ],
447 [
448 31.2618,
449 30.0465
450 ],
451 [
452 31.2618,
453 30.0453
454 ]
455 ]
456 ]
457 },
458 "properties": {
459 "site_id": "EG-CAI-004",
460 "feature_kind": "enclosure",
461 "name_en": "Al-Azhar Mosque",
462 "name_ar": "الجامع الأزهر"
463 }
464 },
465 {
466 "type": "Feature",
467 "geometry": {
468 "type": "LineString",
469 "coordinates": [
470 [
471 31.2614,
472 30.0458
473 ],
474 [
475 31.2624,
476 30.0459
477 ],
478 [
479 31.2634,
480 30.046
481 ]
482 ]
483 },
484 "properties": {
485 "site_id": "EG-CAI-004",
486 "feature_kind": "axial_line_1",
487 "name_en": "Al-Azhar Mosque",
488 "name_ar": "الجامع الأزهر"
489 }
490 },
491 {
492 "type": "Feature",
493 "geometry": {
494 "type": "LineString",
495 "coordinates": [
496 [
497 31.2625,
498 30.0449
499 ],
500 [
501 31.2624,
502 30.0459
503 ],
504 [
505 31.2623,
506 30.0469
507 ]
508 ]
509 },
510 "properties": {
511 "site_id": "EG-CAI-004",
512 "feature_kind": "axial_line_2",
513 "name_en": "Al-Azhar Mosque",
514 "name_ar": "الجامع الأزهر"
515 }
516 },
517 {
518 "type": "Feature",
519 "geometry": {
520 "type": "Point",
521 "coordinates": [
522 31.2624,
523 30.0463
524 ]
525 },
526 "properties": {
527 "site_id": "EG-CAI-004",
528 "feature_kind": "marker_gateway",
529 "name_en": "Al-Azhar Mosque",
530 "name_ar": "الجامع الأزهر"
531 }
532 },
533 {
534 "type": "Feature",
535 "geometry": {
536 "type": "Point",
537 "coordinates": [
538 31.2628,
539 30.0459
540 ]
541 },
542 "properties": {
543 "site_id": "EG-CAI-004",
544 "feature_kind": "marker_mihrab",
545 "name_en": "Al-Azhar Mosque",
546 "name_ar": "الجامع الأزهر"
547 }
548 },
549 {
550 "type": "Feature",
551 "geometry": {
552 "type": "Point",
553 "coordinates": [
554 31.2624,
555 30.0455
556 ]
557 },
558 "properties": {
559 "site_id": "EG-CAI-004",
560 "feature_kind": "marker_minaret",
561 "name_en": "Al-Azhar Mosque",
562 "name_ar": "الجامع الأزهر"
563 }
564 },
565 {
566 "type": "Feature",
567 "geometry": {
568 "type": "Polygon",
569 "coordinates": [
570 [
571 [
572 31.262,
573 30.0473
574 ],
575 [
576 31.2632,
577 30.0473
578 ],
579 [
580 31.2632,
581 30.0485
582 ],
583 [
584 31.262,
585 30.0485
586 ],
587 [
588 31.262,
589 30.0473
590 ]
591 ]
592 ]
593 },
594 "properties": {
595 "site_id": "EG-CAI-005",
596 "feature_kind": "enclosure",
597 "name_en": "Al-Hussein Mosque",
598 "name_ar": "مسجد الحسين"
599 }
600 },
601 {
602 "type": "Feature",
603 "geometry": {
604 "type": "LineString",
605 "coordinates": [
606 [
607 31.2616,
608 30.0478
609 ],
610 [
611 31.2626,
612 30.0479
613 ],
614 [
615 31.2636,
616 30.048
617 ]
618 ]
619 },
620 "properties": {
621 "site_id": "EG-CAI-005",
622 "feature_kind": "axial_line_1",
623 "name_en": "Al-Hussein Mosque",
624 "name_ar": "مسجد الحسين"
625 }
626 },
627 {
628 "type": "Feature",
629 "geometry": {
630 "type": "Point",
631 "coordinates": [
632 31.2626,
633 30.0483
634 ]
635 },
636 "properties": {
637 "site_id": "EG-CAI-005",
638 "feature_kind": "marker_gateway",
639 "name_en": "Al-Hussein Mosque",
640 "name_ar": "مسجد الحسين"
641 }
642 },
643 {
644 "type": "Feature",
645 "geometry": {
646 "type": "Point",
647 "coordinates": [
648 31.263,
649 30.0479
650 ]
651 },
652 "properties": {
653 "site_id": "EG-CAI-005",
654 "feature_kind": "marker_mihrab",
655 "name_en": "Al-Hussein Mosque",
656 "name_ar": "مسجد الحسين"
657 }
658 },
659 {
660 "type": "Feature",
661 "geometry": {
662 "type": "MultiPolygon",
663 "coordinates": [
664 [
665 [
666 [
667 31.2614,
668 30.0524
669 ],
670 [
671 31.2626,
672 30.0524
673 ],
674 [
675 31.2626,
676 30.0536
677 ],
678 [
679 31.2614,
680 30.0536
681 ],
682 [
683 31.2614,
684 30.0524
685 ]
686 ]
687 ],
688 [
689 [
690 [
691 31.26305,
692 30.05349
693 ],
694 [
695 31.26375,
696 30.05349
697 ],
698 [
699 31.26375,
700 30.05419
701 ],
702 [
703 31.26305,
704 30.05419
705 ],
706 [
707 31.26305,
708 30.05349
709 ]
710 ]
711 ]
712 ]
713 },
714 "properties": {
715 "site_id": "EG-CAI-006",
716 "feature_kind": "enclosure",
717 "name_en": "Bayt Al-Suhaymi",
718 "name_ar": "بيت السحيمي"
719 }
720 },
721 {
722 "type": "Feature",
723 "geometry": {
724 "type": "LineString",
725 "coordinates": [
726 [
727 31.261,
728 30.0529
729 ],
730 [
731 31.262,
732 30.053
733 ],
734 [
735 31.263,
736 30.0531
737 ]
738 ]
739 },
740 "properties": {
741 "site_id": "EG-CAI-006",
742 "feature_kind": "axial_line_1",
743 "name_en": "Bayt Al-Suhaymi",
744 "name_ar": "بيت السحيمي"
745 }
746 },
747 {
748 "type": "Feature",
749 "geometry": {
750 "type": "Point",
751 "coordinates": [
752 31.262,
753 30.0534
754 ]
755 },
756 "properties": {
757 "site_id": "EG-CAI-006",
758 "feature_kind": "marker_gateway",
759 "name_en": "Bayt Al-Suhaymi",
760 "name_ar": "بيت السحيمي"
761 }
762 },
763 {
764 "type": "Feature",
765 "geometry": {
766 "type": "Point",
767 "coordinates": [
768 31.2624,
769 30.053
770 ]
771 },
772 "properties": {
773 "site_id": "EG-CAI-006",
774 "feature_kind": "marker_mihrab",
775 "name_en": "Bayt Al-Suhaymi",
776 "name_ar": "بيت السحيمي"
777 }
778 },
779 {
780 "type": "Feature",
781 "geometry": {
782 "type": "Point",
783 "coordinates": [
784 31.262,
785 30.0526
786 ]
787 },
788 "properties": {
789 "site_id": "EG-CAI-006",
790 "feature_kind": "marker_minaret",
791 "name_en": "Bayt Al-Suhaymi",
792 "name_ar": "بيت السحيمي"
793 }
794 },
795 {
796 "type": "Feature",
797 "geometry": {
798 "type": "Polygon",
799 "coordinates": [
800 [
801 [
802 31.2574,
803 30.0426
804 ],
805 [
806 31.2586,
807 30.0426
808 ],
809 [
810 31.2586,
811 30.0438
812 ],
813 [
814 31.2574,
815 30.0438
816 ],
817 [
818 31.2574,
819 30.0426
820 ]
821 ]
822 ]
823 },
824 "properties": {
825 "site_id": "EG-CAI-007",
826 "feature_kind": "enclosure",
827 "name_en": "Bab Zuwayla",
828 "name_ar": "باب زويلة"
829 }
830 },
831 {
832 "type": "Feature",
833 "geometry": {
834 "type": "LineString",
835 "coordinates": [
836 [
837 31.257,
838 30.0431
839 ],
840 [
841 31.258,
842 30.0432
843 ],
844 [
845 31.259,
846 30.0433
847 ]
848 ]
849 },
850 "properties": {
851 "site_id": "EG-CAI-007",
852 "feature_kind": "axial_line_1",
853 "name_en": "Bab Zuwayla",
854 "name_ar": "باب زويلة"
855 }
856 },
857 {
858 "type": "Feature",
859 "geometry": {
860 "type": "LineString",
861 "coordinates": [
862 [
863 31.2581,
864 30.0422
865 ],
866 [
867 31.258,
868 30.0432
869 ],
870 [
871 31.2579,
872 30.0442
873 ]
874 ]
875 },
876 "properties": {
877 "site_id": "EG-CAI-007",
878 "feature_kind": "axial_line_2",
879 "name_en": "Bab Zuwayla",
880 "name_ar": "باب زويلة"
881 }
882 },
883 {
884 "type": "Feature",
885 "geometry": {
886 "type": "Point",
887 "coordinates": [
888 31.258,
889 30.0436
890 ]
891 },
892 "properties": {
893 "site_id": "EG-CAI-007",
894 "feature_kind": "marker_gateway",
895 "name_en": "Bab Zuwayla",
896 "name_ar": "باب زويلة"
897 }
898 },
899 {
900 "type": "Feature",
901 "geometry": {
902 "type": "Point",
903 "coordinates": [
904 31.2584,
905 30.0432
906 ]
907 },
908 "properties": {
909 "site_id": "EG-CAI-007",
910 "feature_kind": "marker_mihrab",
911 "name_en": "Bab Zuwayla",
912 "name_ar": "باب زويلة"
913 }
914 },
915 {
916 "type": "Feature",
917 "geometry": {
918 "type": "MultiPolygon",
919 "coordinates": [
920 [
921 [
922 [
923 31.2609,
924 30.0467
925 ],
926 [
927 31.2621,
928 30.0467
929 ],
930 [
931 31.2621,
932 30.0479
933 ],
934 [
935 31.2609,
936 30.0479
937 ],
938 [
939 31.2609,
940 30.0467
941 ]
942 ]
943 ],
944 [
945 [
946 [
947 31.26255,
948 30.04779
949 ],
950 [
951 31.26325,
952 30.04779
953 ],
954 [
955 31.26325,
956 30.04849
957 ],
958 [
959 31.26255,
960 30.04849
961 ],
962 [
963 31.26255,
964 30.04779
965 ]
966 ]
967 ]
968 ]
969 },
970 "properties": {
971 "site_id": "EG-CAI-008",
972 "feature_kind": "enclosure",
973 "name_en": "Khan el-Khalili",
974 "name_ar": "خان الخليلي"
975 }
976 },
977 {
978 "type": "Feature",
979 "geometry": {
980 "type": "LineString",
981 "coordinates": [
982 [
983 31.2605,
984 30.0472
985 ],
986 [
987 31.2615,
988 30.0473
989 ],
990 [
991 31.2625,
992 30.0474
993 ]
994 ]
995 },
996 "properties": {
997 "site_id": "EG-CAI-008",
998 "feature_kind": "axial_line_1",
999 "name_en": "Khan el-Khalili",
1000 "name_ar": "خان الخليلي"
1001 }
1002 },
1003 {
1004 "type": "Feature",
1005 "geometry": {
1006 "type": "LineString",
1007 "coordinates": [
1008 [
1009 31.2616,
1010 30.0463
1011 ],
1012 [
1013 31.2615,
1014 30.0473
1015 ],
1016 [
1017 31.2614,
1018 30.0483
1019 ]
1020 ]
1021 },
1022 "properties": {
1023 "site_id": "EG-CAI-008",
1024 "feature_kind": "axial_line_2",
1025 "name_en": "Khan el-Khalili",
1026 "name_ar": "خان الخليلي"
1027 }
1028 },
1029 {
1030 "type": "Feature",
1031 "geometry": {
1032 "type": "Point",
1033 "coordinates": [
1034 31.2615,
1035 30.0477
1036 ]
1037 },
1038 "properties": {
1039 "site_id": "EG-CAI-008",
1040 "feature_kind": "marker_gateway",
1041 "name_en": "Khan el-Khalili",
1042 "name_ar": "خان الخليلي"
1043 }
1044 },
1045 {
1046 "type": "Feature",
1047 "geometry": {
1048 "type": "Point",
1049 "coordinates": [
1050 31.2619,
1051 30.0473
1052 ]
1053 },
1054 "properties": {
1055 "site_id": "EG-CAI-008",
1056 "feature_kind": "marker_mihrab",
1057 "name_en": "Khan el-Khalili",
1058 "name_ar": "خان الخليلي"
1059 }
1060 },
1061 {
1062 "type": "Feature",
1063 "geometry": {
1064 "type": "Point",
1065 "coordinates": [
1066 31.2615,
1067 30.0469
1068 ]
1069 },
1070 "properties": {
1071 "site_id": "EG-CAI-008",
1072 "feature_kind": "marker_minaret",
1073 "name_en": "Khan el-Khalili",
1074 "name_ar": "خان الخليلي"
1075 }
1076 },
1077 {
1078 "type": "Feature",
1079 "geometry": {
1080 "type": "Polygon",
1081 "coordinates": [
1082 [
1083 [
1084 31.2599,
1085 30.0504
1086 ],
1087 [
1088 31.2611,
1089 30.0504
1090 ],
1091 [
1092 31.2611,
1093 30.0516
1094 ],
1095 [
1096 31.2599,
1097 30.0516
1098 ],
1099 [
1100 31.2599,
1101 30.0504
1102 ]
1103 ]
1104 ]
1105 },
1106 "properties": {
1107 "site_id": "EG-CAI-009",
1108 "feature_kind": "enclosure",
1109 "name_en": "Sabil-Kuttab of Katkhuda",
1110 "name_ar": "سبيل وكتاب عبد الرحمن كتخدا"
1111 }
1112 },
1113 {
1114 "type": "Feature",
1115 "geometry": {
1116 "type": "LineString",
1117 "coordinates": [
1118 [
1119 31.2595,
1120 30.0509
1121 ],
1122 [
1123 31.2605,
1124 30.051
1125 ],
1126 [
1127 31.2615,
1128 30.0511
1129 ]
1130 ]
1131 },
1132 "properties": {
1133 "site_id": "EG-CAI-009",
1134 "feature_kind": "axial_line_1",
1135 "name_en": "Sabil-Kuttab of Katkhuda",
1136 "name_ar": "سبيل وكتاب عبد الرحمن كتخدا"
1137 }
1138 },
1139 {
1140 "type": "Feature",
1141 "geometry": {
1142 "type": "Point",
1143 "coordinates": [
1144 31.2605,
1145 30.0514
1146 ]
1147 },
1148 "properties": {
1149 "site_id": "EG-CAI-009",
1150 "feature_kind": "marker_gateway",
1151 "name_en": "Sabil-Kuttab of Katkhuda",
1152 "name_ar": "سبيل وكتاب عبد الرحمن كتخدا"
1153 }
1154 },
1155 {
1156 "type": "Feature",
1157 "geometry": {
1158 "type": "Point",
1159 "coordinates": [
1160 31.2609,
1161 30.051
1162 ]
1163 },
1164 "properties": {
1165 "site_id": "EG-CAI-009",
1166 "feature_kind": "marker_mihrab",
1167 "name_en": "Sabil-Kuttab of Katkhuda",
1168 "name_ar": "سبيل وكتاب عبد الرحمن كتخدا"
1169 }
1170 },
1171 {
1172 "type": "Feature",
1173 "geometry": {
1174 "type": "MultiPolygon",
1175 "coordinates": [
1176 [
1177 [
1178 [
1179 31.2624,
1180 30.0549
1181 ],
1182 [
1183 31.2636,
1184 30.0549
1185 ],
1186 [
1187 31.2636,
1188 30.0561
1189 ],
1190 [
1191 31.2624,
1192 30.0561
1193 ],
1194 [
1195 31.2624,
1196 30.0549
1197 ]
1198 ]
1199 ],
1200 [
1201 [
1202 [
1203 31.26405,
1204 30.05599
1205 ],
1206 [
1207 31.26475,
1208 30.05599
1209 ],
1210 [
1211 31.26475,
1212 30.05669
1213 ],
1214 [
1215 31.26405,
1216 30.05669
1217 ],
1218 [
1219 31.26405,
1220 30.05599
1221 ]
1222 ]
1223 ]
1224 ]
1225 },
1226 "properties": {
1227 "site_id": "EG-CAI-010",
1228 "feature_kind": "enclosure",
1229 "name_en": "Mosque of Al-Hakim",
1230 "name_ar": "مسجد الحاكم بأمر الله"
1231 }
1232 },
1233 {
1234 "type": "Feature",
1235 "geometry": {
1236 "type": "LineString",
1237 "coordinates": [
1238 [
1239 31.262,
1240 30.0554
1241 ],
1242 [
1243 31.263,
1244 30.0555
1245 ],
1246 [
1247 31.264,
1248 30.0556
1249 ]
1250 ]
1251 },
1252 "properties": {
1253 "site_id": "EG-CAI-010",
1254 "feature_kind": "axial_line_1",
1255 "name_en": "Mosque of Al-Hakim",
1256 "name_ar": "مسجد الحاكم بأمر الله"
1257 }
1258 },
1259 {
1260 "type": "Feature",
1261 "geometry": {
1262 "type": "Point",
1263 "coordinates": [
1264 31.263,
1265 30.0559
1266 ]
1267 },
1268 "properties": {
1269 "site_id": "EG-CAI-010",
1270 "feature_kind": "marker_gateway",
1271 "name_en": "Mosque of Al-Hakim",
1272 "name_ar": "مسجد الحاكم بأمر الله"
1273 }
1274 },
1275 {
1276 "type": "Feature",
1277 "geometry": {
1278 "type": "Point",
1279 "coordinates": [
1280 31.2634,
1281 30.0555
1282 ]
1283 },
1284 "properties": {
1285 "site_id": "EG-CAI-010",
1286 "feature_kind": "marker_mihrab",
1287 "name_en": "Mosque of Al-Hakim",
1288 "name_ar": "مسجد الحاكم بأمر الله"
1289 }
1290 }
1291 ]
1292 }
0:26
Let me analyze the data: 1. I have a GeoJSON file with mixed geometry types: Point, LineString, Polygon, MultiPolygon 2. I need to create a GPKG with three layers: `points`, `lines`, `polygons` 3. Each feature should be single-part (so MultiPolygon → Polygon) 4. Every feature needs to retain `site_id` 5. Use Egypt's national grid (EPSG:32635 - UTM zone 35N, or possibly EPSG:22992 - Egypt Red Belt / EPSG:22993? Let me think... Egypt's national grid is usually EPSG:32635 (UTM zone 35N) which covers most of Egypt. Actually, there's also the "Egyptian National Grid" which is EPSG:22992 (Egypt Red Belt). Let me check. Actually, "Egypt's national grid" most commonly refers to the "Egyptian Transverse Mercator" - EPSG:32635 (WGS 84 / UTM zone 35N) which covers Cairo. But there's also the older "Egypt Red Belt" (EPSG:22992). Let me use EPSG:32635 as it's the most standard modern one for Cairo area. Actually, I'll use EPSG:32635 - WGS 84 / UTM zone 35N which is appropriate for Cairo. Let me write a Python script to: 1. Read the GeoJSON 2. Separate features by geometry type (Point, LineString, Polygon) 3. Explode MultiPolygon into individual Polygon features (and if there were MultiLineStrings, explode them too) 4. Reproject to EPSG:32635 5. Write each layer to the GPKG Let me write the script. Actually, let me check what CRS Egypt's national grid is. The most common ones: - EPSG:32635 - WGS 84 / UTM zone 35N (covers Cairo at ~30°N, 31°E) - EPSG:32636 - WGS 84 / UTM zone 36N - Old Egyptian system: EPSG:22992 (Egypt Red Belt) Since Cairo is around longitude 31°E, which is in UTM zone 35N (30°E to 36°E), EPSG:32635 is the right UTM zone. Let me use that. Let me write the Python script.
0:26
0:26
Write
/work/solve.py
content · 134 lines · py
import geopandas as gpd
from shapely.geometry import (
Point, MultiPoint,
LineString, MultiLineString,
Polygon, MultiPolygon
)
# --- 1. Read source GeoJSON ---
src = "/work/heritage_sites.geojson"
gdf = gpd.read_file(src)
# --- 2. Define helpers ---
def explode_multi(geom):
"""Yield single-part geometries from any geometry."""
if geom is None:
return
if geom.geom_type == "GeometryCollection":
for g in geom.geoms:
yield from explode_multi(g)
elif geom.geom_type in ("MultiPoint",):
if geom.is_empty:
return
for g in geom.geoms:
yield g
elif geom.geom_type in ("MultiLineString",):
if geom.is_empty:
return
for g in geom.geoms:
yield g
elif geom.geom_type in ("MultiPolygon",):
if geom.is_empty:
return
for g in geom.geoms:
yield g
else:
# Point, LineString, Polygon — already single-part
yield geom
def geometry_category(geom):
"""Return 'point', 'line', or 'polygon' based on the single-part type."""
t = geom.geom_type
if t in ("Point", "MultiPoint"):
return "point"
if t in ("LineString", "MultiLineString"):
return "line"
if t in ("Polygon", "MultiPolygon"):
return "polygon"
return None
# --- 3. Separate features by geometry category ---
rows_point = []
rows_line = []
rows_poly = []
for _, feat in gdf.iterrows():
geom = feat.geometry
if geom is None:
continue
cat = geometry_category(geom)
props = feat.drop("geometry").to_dict()
# Explode multi-geoms into individual single-part features
for part in explode_multi(geom):
if cat == "point":
rows_point.append({"geometry": part, **props})
elif cat == "line":
rows_line.append({"geometry": part, **props})
elif cat == "polygon":
rows_poly.append({"geometry": part, **props})
# --- 4. Build GeoDataFrames, reproject to Egypt's national grid (UTM zone 35N) ---
target_crs = "EPSG:32635" # WGS 84 / UTM zone 35N — covers Cairo
def make_gdf(rows, cat_name):
if not rows:
return None
g = gpd.GeoDataFrame(rows, geometry="geometry", crs="EPSG:4326")
g = g.to_crs(target_crs)
# Keep only the requested columns: site_id + all other original attributes
return g
gdf_points = make_gdf(rows_point, "points")
gdf_lines = make_gdf(rows_line, "lines")
gdf_polys = make_gdf(rows_poly, "polygons")
# --- 5. Write to GPKG ---
out_path = "/work/heritage.gpkg"
# Write each layer separately (overwrite if exists)
if gdf_points is not None:
gdf_points.to_file(out_path, layer="points", driver="GPKG")
else:
# Create empty layer
gpd.GeoDataFrame(
{"site_id": []}, geometry=[], crs=target_crs
).to_file(out_path, layer="points", driver="GPKG")
if gdf_lines is not None:
gdf_lines.to_file(out_path, layer="lines", driver="GPKG")
else:
gpd.GeoDataFrame(
{"site_id": []}, geometry=[], crs=target_crs
).to_file(out_path, layer="lines", driver="GPKG")
if gdf_polys is not None:
gdf_polys.to_file(out_path, layer="polygons", driver="GPKG")
else:
gpd.GeoDataFrame(
{"site_id": []}, geometry=[], crs=target_crs
).to_file(out_path, layer="polygons", driver="GPKG")
# --- 6. Verify ---
print("=== POINTS ===")
print(f" Count: {len(gdf_points)}")
print(f" CRS: {gdf_points.crs}")
print(f" Columns: {list(gdf_points.columns)}")
print(f" Geom types: {gdf_points.geometry.geom_type.unique()}")
print(gdf_points[["site_id", "feature_kind"]].head())
print("\n=== LINES ===")
print(f" Count: {len(gdf_lines)}")
print(f" CRS: {gdf_lines.crs}")
print(f" Columns: {list(gdf_lines.columns)}")
print(f" Geom types: {gdf_lines.geometry.geom_type.unique()}")
print(gdf_lines[["site_id", "feature_kind"]].head())
print("\n=== POLYGONS ===")
print(f" Count: {len(gdf_polys)}")
print(f" CRS: {gdf_polys.crs}")
print(f" Columns: {list(gdf_polys.columns)}")
print(f" Geom types: {gdf_polys.geometry.geom_type.unique()}")
print(gdf_polys[["site_id", "feature_kind"]].head())
print("\nDone — output:", out_path)
Wrote /work/solve.py (4189 chars).
0:40
Let me run this script.
0:40
Bash
cd /work && python solve.py
=== POINTS ===
Count: 25
CRS: EPSG:32635
Columns: ['geometry', 'site_id', 'feature_kind', 'name_en', 'name_ar']
Geom types: <ArrowStringArray>
['Point']
Length: 1, dtype: str
site_id feature_kind
0 EG-CAI-001 marker_gateway
1 EG-CAI-001 marker_mihrab
2 EG-CAI-001 marker_minaret
3 EG-CAI-002 marker_gateway
4 EG-CAI-002 marker_mihrab
=== LINES ===
Count: 15
CRS: EPSG:32635
Columns: ['geometry', 'site_id', 'feature_kind', 'name_en', 'name_ar']
Geom types: <ArrowStringArray>
['LineString']
Length: 1, dtype: str
site_id feature_kind
0 EG-CAI-001 axial_line_1
1 EG-CAI-001 axial_line_2
2 EG-CAI-002 axial_line_1
3 EG-CAI-003 axial_line_1
4 EG-CAI-003 axial_line_2
=== POLYGONS ===
Count: 15
CRS: EPSG:32635
Columns: ['geometry', 'site_id', 'feature_kind', 'name_en', 'name_ar']
Geom types: <ArrowStringArray>
['Polygon']
Length: 1, dtype: str
site_id feature_kind
0 EG-CAI-001 enclosure
1 EG-CAI-002 enclosure
2 EG-CAI-002 enclosure
3 EG-CAI-003 enclosure
4 EG-CAI-003 enclosure
Done — output: /work/heritage.gpkg
1:14
1:14
Bash
cd /work && python -c "
cd /work && python -c "
import geopandas as gpd
# List all layers
layers = gpd.list_layers('heritage.gpkg')
print('Layers:', layers)
print()
for l in layers['name']:
gdf = gpd.read_file('heritage.gpkg', layer=l)
print(f'Layer \"{l}\": {len(gdf)} features, geom_types={gdf.geometry.geom_type.unique()}, site_ids={gdf.site_id.unique()}')
"
Layers: name geometry_type 0 points Point 1 lines LineString 2 polygons Polygon Layer "points": 25 features, geom_types=<ArrowStringArray> ['Point'] Length: 1, dtype: str, site_ids=<ArrowStringArray> ['EG-CAI-001', 'EG-CAI-002', 'EG-CAI-003', 'EG-CAI-004', 'EG-CAI-005', 'EG-CAI-006', 'EG-CAI-007', 'EG-CAI-008', 'EG-CAI-009', 'EG-CAI-010'] Length: 10, dtype: str Layer "lines": 15 features, geom_types=<ArrowStringArray> ['LineString'] Length: 1, dtype: str, site_ids=<ArrowStringArray> ['EG-CAI-001', 'EG-CAI-002', 'EG-CAI-003', 'EG-CAI-004', 'EG-CAI-005', 'EG-CAI-006', 'EG-CAI-007', 'EG-CAI-008', 'EG-CAI-009', 'EG-CAI-010'] Length: 10, dtype: str Layer "polygons": 15 features, geom_types=<ArrowStringArray> ['Polygon'] Length: 1, dtype: str, site_ids=<ArrowStringArray> ['EG-CAI-001', 'EG-CAI-002', 'EG-CAI-003', 'EG-CAI-004', 'EG-CAI-005', 'EG-CAI-006', 'EG-CAI-007', 'EG-CAI-008', 'EG-CAI-009', 'EG-CAI-010'] Length: 10, dtype: str
1:27
Everything looks good. Let me summarize the results for the user.
1:27