gendesign/site-finder/reports/parcel_66_41_0204016_10.json
Light1YT 97b19a0b85 Import Site Finder app from analysis/ vibe-coding session
Adds site-finder/ subfolder with:
  - server.py — FastAPI scoring service v2 (35 endpoints, ~85KB)
  - 01_load_sites.py … 12_more_pois.py — data ingest pipeline
  - db_init.py — SQLite schema bootstrap
  - static/ — Leaflet UI (index.html ~3500 lines + sw.js)
  - cache/ — small persistent caches (admin districts, jk polygons,
    geocode warm cache, parcel polygons drop-zone with README)
  - reports/ — sample generated parcel report (HTML+JSON)

Excluded via .gitignore (regeneratable, too big for git):
  - analysis.db (336MB SQLite — rebuild via 01_*..12_*.py)
  - cache/objective_raw/ (1.2GB Объектив raw dumps)
  - cache/overpass_raw.json, cache/osm_buildings_all.geojson
    (regen from Overpass API)

Production deploy: /opt/gendesign/site-finder/ on gendsgn.ru
(container gendesign-site-finder-1, served at /sf/).
2026-05-10 22:42:25 +05:00

748 lines
No EOL
19 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"generated_at": "2026-05-08T00:34:04",
"parcel": {
"site_id": "parcel:66:41:0204016:10",
"kind": "parcel",
"name": "Участок 66:41:0204016:10",
"address": "г. Екатеринбург, кад.№ 66:41:0204016:10 (NSPD coordinate_x=6737346.694, coordinate_y=7735409.767, EPSG:3857)",
"district": null,
"obj_class": null,
"developer": null,
"flat_count": null,
"square_living": null,
"ready_dt": null,
"obj_status": "parcel",
"lat": 56.878913,
"lon": 60.522615,
"obj_id": null,
"geom_geojson": null,
"features": {
"bus_stop_count_1km": 20.0,
"bus_stop_count_500m": 4.0,
"bus_stop_nearest_m": 319.8521044035619,
"clinic_count_1km": 6.0,
"clinic_count_500m": 1.0,
"clinic_nearest_m": 449.74705727658056,
"hospital_count_1km": 0.0,
"hospital_count_500m": 0.0,
"hospital_nearest_m": 1760.9567033538603,
"kindergarten_count_1km": 4.0,
"kindergarten_count_500m": 1.0,
"kindergarten_nearest_m": 379.95653221253724,
"metro_count_1km": 0.0,
"metro_count_500m": 0.0,
"metro_nearest_m": null,
"park_count_1km": 3.0,
"park_count_500m": 0.0,
"park_nearest_m": 565.4776423972781,
"pharmacy_count_1km": 8.0,
"pharmacy_count_500m": 1.0,
"pharmacy_nearest_m": 471.4293930876333,
"playground_count_1km": 22.0,
"playground_count_500m": 12.0,
"playground_nearest_m": 162.85791533155333,
"school_count_1km": 3.0,
"school_count_500m": 0.0,
"school_nearest_m": 792.4938391173765,
"shop_big_count_1km": 10.0,
"shop_big_count_500m": 3.0,
"shop_big_nearest_m": 20.462910702745955,
"shop_med_count_1km": 12.0,
"shop_med_count_500m": 1.0,
"shop_med_nearest_m": 449.68619544132474,
"shop_small_count_1km": 0.0,
"shop_small_count_500m": 0.0,
"shop_small_nearest_m": null,
"sports_count_1km": 16.0,
"sports_count_500m": 7.0,
"sports_nearest_m": 243.3529907625155,
"tram_stop_count_1km": 8.0,
"tram_stop_count_500m": 0.0,
"tram_stop_nearest_m": 598.2477400253116,
"university_count_1km": 1.0,
"university_count_500m": 0.0,
"university_nearest_m": 906.362284697722
},
"scores": {
"economic": 40.20396169545286,
"education": 79.52016528424876,
"health": 88.71285351868461,
"leisure": 98.38326808895609,
"retail": 100.0,
"transit": 69.68085645258955
},
"weighted_total": 72.12696219413812,
"rank_overall": 183,
"rank_district": 1,
"economics": {
"district": "Старая Сортировка",
"district_method": "knn_vote_5",
"district_dist_m": 491.9035185643666,
"n_projects": 6,
"weighted_price_m2_corp_sum": 128.29226026752744,
"median_price_m2_corp_sum": 132.71,
"deals_per_month_corp_sum": 0.4748201438848921,
"months_to_sellout": 15.931335954809471,
"n_lots": 8356,
"n_sold": 4078,
"sold_pct": 48.803255146002876,
"median_price_m2": 114.88988332384746,
"p25_price_m2": 96.10536852426868,
"p75_price_m2": 132.70871691061976,
"avg_area_sold_m2": 48.96138303089735,
"velocity_per_month": 2.663333333333333,
"avg_readiness_pct": 75.83018190521781
},
"nearest_pois": {
"kindergarten": [
{
"name": "Детский сад № 357",
"distance_m": 380.0,
"lat": 56.8755087,
"lon": 60.5220757
},
{
"name": "Детский сад № 132",
"distance_m": 579.1,
"lat": 56.8838508,
"lon": 60.5195843
},
{
"name": "Детский сад № 133",
"distance_m": 846.8,
"lat": 56.8805097,
"lon": 60.508987
},
{
"name": "Детский сад № 131",
"distance_m": 867.4,
"lat": 56.8746007,
"lon": 60.5107185
},
{
"name": "Детский сад № 131 АО \"РЖД\"",
"distance_m": 1116.5,
"lat": 56.8709899,
"lon": 60.5339025
}
],
"school": [
{
"name": "Школа № 122",
"distance_m": 792.5,
"lat": 56.8851571,
"lon": 60.5163261
},
{
"name": "Средняя школа № 172",
"distance_m": 857.4,
"lat": 56.8721029,
"lon": 60.5292316
},
{
"name": "Средняя общеобразовательная школа № 129",
"distance_m": 871.0,
"lat": 56.8799875,
"lon": 60.508415
},
{
"name": "Детская музыкальная школа № 7 им. С. В. Рахманинова",
"distance_m": 1038.8,
"lat": 56.8697152,
"lon": 60.5256114
},
{
"name": "Средняя школа № 83",
"distance_m": 1147.0,
"lat": 56.8701653,
"lon": 60.5326188
}
],
"university": [
{
"name": "Железнодорожный техникум",
"distance_m": 906.4,
"lat": 56.8848017,
"lon": 60.5122997
},
{
"name": "Екатеринбургский техникум «Автоматика»",
"distance_m": 1445.6,
"lat": 56.8720305,
"lon": 60.5427979
}
],
"pharmacy": [
{
"name": "Вита Экспресс",
"distance_m": 471.4,
"lat": 56.8812191,
"lon": 60.5161039
},
{
"name": "Фармленд",
"distance_m": 656.4,
"lat": 56.8808007,
"lon": 60.5123788
},
{
"name": "Фармленд",
"distance_m": 733.6,
"lat": 56.8724683,
"lon": 60.5251955
},
{
"name": "Аптека апрель",
"distance_m": 796.5,
"lat": 56.871807,
"lon": 60.5242641
},
{
"name": "Планета здоровья",
"distance_m": 798.6,
"lat": 56.8717854,
"lon": 60.520997
}
],
"clinic": [
{
"name": "Инвитро",
"distance_m": 449.7,
"lat": 56.8811052,
"lon": 60.5163941
},
{
"name": "Подстанция № 7",
"distance_m": 772.2,
"lat": 56.8731081,
"lon": 60.5295907
},
{
"name": "ЦГБ №3, Поликлиника №2",
"distance_m": 830.1,
"lat": 56.871559,
"lon": 60.5249675
},
{
"name": "Наркологическая клиника Спасение",
"distance_m": 852.3,
"lat": 56.8724152,
"lon": 60.5151737
},
{
"name": "Лаборатория Helix",
"distance_m": 865.6,
"lat": 56.8711449,
"lon": 60.5216856
}
],
"hospital": [
{
"name": "Дорожная больница станции Екатеринбург-Пассажирский",
"distance_m": 1761.0,
"lat": 56.8894988,
"lon": 60.5010552
},
{
"name": "Свердловский областной противотуберкулезный диспансер",
"distance_m": 1832.1,
"lat": 56.8884867,
"lon": 60.4980714
}
],
"shop_big": [
{
"name": "Магнит",
"distance_m": 20.5,
"lat": 56.8788911,
"lon": 60.5229494
},
{
"name": "Пятёрочка",
"distance_m": 242.2,
"lat": 56.8768559,
"lon": 60.5213067
},
{
"name": "—",
"distance_m": 482.9,
"lat": 56.881596,
"lon": 60.5163645
},
{
"name": "Пятёрочка",
"distance_m": 698.2,
"lat": 56.8728594,
"lon": 60.525668
},
{
"name": "АвтоХимия",
"distance_m": 724.9,
"lat": 56.8725274,
"lon": 60.5202109
}
],
"shop_med": [
{
"name": "Кировский",
"distance_m": 449.7,
"lat": 56.8814023,
"lon": 60.5167818
},
{
"name": "Магнит",
"distance_m": 515.3,
"lat": 56.8834352,
"lon": 60.5207634
},
{
"name": "Монетка",
"distance_m": 565.3,
"lat": 56.8738314,
"lon": 60.5228848
},
{
"name": "Молочный",
"distance_m": 623.8,
"lat": 56.8819988,
"lon": 60.5140412
},
{
"name": "Пенный Лис",
"distance_m": 704.3,
"lat": 56.8726139,
"lon": 60.5214089
}
],
"shop_small": [],
"bus_stop": [
{
"name": "Билимбаевская",
"distance_m": 319.9,
"lat": 56.8807605,
"lon": 60.5185799
},
{
"name": "Билимбаевская",
"distance_m": 384.0,
"lat": 56.8807151,
"lon": 60.5172239
},
{
"name": "Билимбаевская",
"distance_m": 426.4,
"lat": 56.8816219,
"lon": 60.5176479
},
{
"name": "Расточная",
"distance_m": 430.6,
"lat": 56.8823567,
"lon": 60.5193744
},
{
"name": "Расточная",
"distance_m": 503.8,
"lat": 56.8833908,
"lon": 60.5213477
}
],
"tram_stop": [
{
"name": "Расточная улица",
"distance_m": 598.2,
"lat": 56.877465,
"lon": 60.5131321
},
{
"name": "Маневровая улица",
"distance_m": 617.7,
"lat": 56.8740237,
"lon": 60.5177905
},
{
"name": "Расточная улица",
"distance_m": 620.2,
"lat": 56.8776237,
"lon": 60.5126846
},
{
"name": "Маневровая улица",
"distance_m": 627.4,
"lat": 56.8737876,
"lon": 60.5182978
},
{
"name": "Кишинёвская улица",
"distance_m": 793.2,
"lat": 56.8789338,
"lon": 60.5095593
}
],
"metro": [],
"park": [
{
"name": "—",
"distance_m": 565.5,
"lat": 56.8822507,
"lon": 60.5155927
},
{
"name": "—",
"distance_m": 867.1,
"lat": 56.8711885,
"lon": 60.5206587
},
{
"name": "—",
"distance_m": 885.7,
"lat": 56.8713878,
"lon": 60.5273909
},
{
"name": "Парк «Семь ключей»",
"distance_m": 1487.0,
"lat": 56.881542,
"lon": 60.4986181
}
],
"playground": [
{
"name": "—",
"distance_m": 162.9,
"lat": 56.8788457,
"lon": 60.5199374
},
{
"name": "—",
"distance_m": 170.0,
"lat": 56.8775972,
"lon": 60.5240409
},
{
"name": "—",
"distance_m": 173.7,
"lat": 56.8796266,
"lon": 60.5200727
},
{
"name": "—",
"distance_m": 216.8,
"lat": 56.8771629,
"lon": 60.5241882
},
{
"name": "—",
"distance_m": 220.4,
"lat": 56.8808941,
"lon": 60.5227257
}
],
"sports": [
{
"name": "—",
"distance_m": 243.4,
"lat": 56.8768551,
"lon": 60.523978
},
{
"name": "—",
"distance_m": 302.1,
"lat": 56.8792764,
"lon": 60.5176882
},
{
"name": "—",
"distance_m": 313.3,
"lat": 56.8780706,
"lon": 60.5176941
},
{
"name": "—",
"distance_m": 339.3,
"lat": 56.8793803,
"lon": 60.5170968
},
{
"name": "—",
"distance_m": 389.8,
"lat": 56.8791157,
"lon": 60.5162107
}
]
}
},
"n_compared_jk": 380,
"weighted_score_distribution": {
"n_jk": 380,
"mean": 63.9,
"median": 70.9,
"p25": 41.6,
"p75": 81.7,
"min": 15.9,
"max": 91.2
},
"component_comparison": {
"economic": {
"parcel": 40.2,
"median_jk": 47.2,
"p75_jk": 59.5
},
"education": {
"parcel": 79.5,
"median_jk": 75.9,
"p75_jk": 94.7
},
"health": {
"parcel": 88.7,
"median_jk": 83.2,
"p75_jk": 98.3
},
"leisure": {
"parcel": 98.4,
"median_jk": 86.1,
"p75_jk": 96.9
},
"retail": {
"parcel": 100.0,
"median_jk": 100.0,
"p75_jk": 100.0
},
"transit": {
"parcel": 69.7,
"median_jk": 70.0,
"p75_jk": 85.0
}
},
"weights_used": {
"education": 0.3,
"health": 0.15,
"retail": 0.2,
"transit": 0.2,
"leisure": 0.15
},
"top10_best_jk_ekb": [
{
"site_id": "jk:70303",
"name": null,
"district": "Железнодорожный",
"developer": "ТЭН",
"obj_class": null,
"flat_count": 0,
"lat": 56.8514,
"lon": 60.6117,
"weighted": 91.20179727537686,
"rank": 1
},
{
"site_id": "jk:66704",
"name": "Квартал «Лайв»",
"district": "Ленинский",
"developer": "Атомстройкомплекс",
"obj_class": null,
"flat_count": 569,
"lat": 56.8036,
"lon": 60.5965,
"weighted": 91.04574249916632,
"rank": 2
},
{
"site_id": "jk:64409",
"name": "Клубный дом инженера Ятеса",
"district": "Железнодорожный",
"developer": "ТЭН",
"obj_class": null,
"flat_count": 0,
"lat": 56.851,
"lon": 60.6108,
"weighted": 90.96238151414164,
"rank": 3
},
{
"site_id": "jk:50617",
"name": "Клубный дом инженера Ятеса",
"district": "Железнодорожный",
"developer": "ТЭН",
"obj_class": null,
"flat_count": 80,
"lat": 56.8506,
"lon": 60.6108,
"weighted": 90.6835128392893,
"rank": 4
},
{
"site_id": "jk:60057",
"name": "Квартал \"На Некрасова\"",
"district": "Железнодорожный",
"developer": "Брусника",
"obj_class": null,
"flat_count": 193,
"lat": 56.8526,
"lon": 60.5886,
"weighted": 90.6443625125751,
"rank": 5
},
{
"site_id": "jk:67389",
"name": "ЖК \"Азина 16\"",
"district": "Железнодорожный",
"developer": "ЛСР",
"obj_class": null,
"flat_count": 326,
"lat": 56.8555,
"lon": 60.613,
"weighted": 90.36056856326462,
"rank": 6
},
{
"site_id": "jk:69469",
"name": "Жилой дом \"ТЕТРО\"",
"district": "Железнодорожный",
"developer": "Девелоперская компания \"Люди\"",
"obj_class": null,
"flat_count": 358,
"lat": 56.8549,
"lon": 60.5824,
"weighted": 90.19036465994816,
"rank": 7
},
{
"site_id": "jk:67548",
"name": "Жилой квартал «Тихий центр» 1 оч. 1 этап",
"district": "Железнодорожный",
"developer": "Синара-Девелопмент",
"obj_class": null,
"flat_count": 231,
"lat": 56.8539,
"lon": 60.595,
"weighted": 90.08874176451533,
"rank": 8
},
{
"site_id": "jk:69263",
"name": "ЖК \"Кайдзен\"",
"district": "Верх-Исетский",
"developer": "Астра",
"obj_class": null,
"flat_count": 196,
"lat": 56.8214,
"lon": 60.5721,
"weighted": 89.98009185666463,
"rank": 9
},
{
"site_id": "jk:53537",
"name": "ЖК \"Азина 16\"",
"district": "Железнодорожный",
"developer": "ЛСР",
"obj_class": null,
"flat_count": 871,
"lat": 56.8567,
"lon": 60.6132,
"weighted": 89.66063320010375,
"rank": 10
}
],
"10_closest_jk_to_parcel": [
{
"distance_m": 492.0,
"site_id": "jk:68027",
"name": "Квартал \"Траектория\"",
"district": "Железнодорожный",
"developer": "Брусника",
"obj_class": null,
"weighted": 66.6,
"rank": 223
},
{
"distance_m": 994.0,
"site_id": "jk:63282",
"name": "Квартал Депо",
"district": "Железнодорожный",
"developer": "Брусника",
"obj_class": null,
"weighted": 69.5,
"rank": 206
},
{
"distance_m": 994.0,
"site_id": "jk:63122",
"name": "Квартал Депо",
"district": "Железнодорожный",
"developer": "Брусника",
"obj_class": null,
"weighted": 73.3,
"rank": 176
},
{
"distance_m": 1036.0,
"site_id": "jk:59643",
"name": "Астон. Движение",
"district": "Железнодорожный",
"developer": "Астон",
"obj_class": null,
"weighted": 64.3,
"rank": 240
},
{
"distance_m": 1211.0,
"site_id": "jk:61215",
"name": "Жилой Комплекс \"Раута\" ",
"district": "Железнодорожный",
"developer": "Эталон",
"obj_class": null,
"weighted": 72.0,
"rank": 186
},
{
"distance_m": 1312.0,
"site_id": "jk:65011",
"name": "Жилой Комплекс \"Раута\" ",
"district": "Железнодорожный",
"developer": "Эталон",
"obj_class": null,
"weighted": 74.4,
"rank": 168
},
{
"distance_m": 3065.0,
"site_id": "jk:66867",
"name": "ЖК Белая Башня",
"district": "Орджоникидзевский",
"developer": "Ривьера Инвест Екатеринбург",
"obj_class": null,
"weighted": 81.2,
"rank": 106
},
{
"distance_m": 3596.0,
"site_id": "jk:65542",
"name": "ЖК \"ПАЙЕР\"",
"district": "Железнодорожный",
"developer": "Самолет",
"obj_class": null,
"weighted": 58.8,
"rank": 267
},
{
"distance_m": 3612.0,
"site_id": "jk:63123",
"name": "ЖК ТЕМП",
"district": "Орджоникидзевский",
"developer": "Практика",
"obj_class": null,
"weighted": 81.4,
"rank": 104
},
{
"distance_m": 4021.0,
"site_id": "jk:60160",
"name": "ЖК \"Парк Победы\"",
"district": "Орджоникидзевский",
"developer": "PRINZIP",
"obj_class": null,
"weighted": 80.3,
"rank": 118
}
]
}