جدیدترین نقشه حرارتی بازار مسکن تهران نشان میدهد که میانگین قیمت پیشنهادی فروشندگان آپارتمان در مناطق ۲۲گانه پایتخت، در هفته منتهی به جمعه دوم مردادماه ۱۴۰۵، به ۲۰۹ میلیون تومان بهازای هر مترمربع رسیده است؛ رقمی که نسبت به نیمه تیرماه حدود نیم درصد افزایش یافته است.
به گزارش راه پرداخت به نقل از دنیای اقتصاد، نقشه حرارتی بازار مسکن شهر تهران براساس سطح میانگین قیمت پیشنهادی واحدهای مسکونی در هر یک از مناطق ۲۲گانه پایتخت بهروزرسانی شده است.
#tehran-map-media-lite {
–tmg-bg: #0b1014;
–tmg-text: #fff;
–tmg-muted: rgba(255,255,255,.72);
–tmg-tooltip-bg: rgba(8,12,15,.94);
font-family: Vazirmatn, IRANSansX, Tahoma, Arial, sans-serif;
}
#tehran-map-media-lite, #tehran-map-media-lite * { box-sizing: border-box; }
#tehran-map-media-lite .tmg-shell {
position: relative;
width: min(100%, 1505px);
aspect-ratio: 1505 / 1045;
background: var(–tmg-bg);
overflow: hidden;
isolation: isolate;
touch-action: manipulation;
margin-inline: auto;
}
#tehran-map-media-lite .tmg-base,
#tehran-map-media-lite .tmg-map-dimmer,
#tehran-map-media-lite .tmg-highlight-piece,
#tehran-map-media-lite .tmg-lift-piece {
background-repeat: no-repeat;
background-position: center;
background-size: 100% 100%;
}
#tehran-map-media-lite .tmg-base {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
user-select: none;
-webkit-user-drag: none;
pointer-events: none;
}
#tehran-map-media-lite .tmg-map-dimmer {
position: absolute;
inset: 0;
z-index: 1;
opacity: 0;
pointer-events: none;
filter: grayscale(1) brightness(.76) contrast(1.03);
clip-path: polygon(24% 20%, 36% 7%, 56% 4.2%, 77.5% 10.6%, 92.8% 26.8%, 98% 45.5%, 97.6% 59%, 91.2% 79.6%, 80.3% 93%, 57% 99%, 38% 91%, 26.5% 79%, 18.8% 58.5%, 18.2% 43.5%, 21.5% 29.5%);
transition: opacity .35s ease;
}
#tehran-map-media-lite.is-filtered .tmg-map-dimmer { opacity: 1; }
#tehran-map-media-lite .tmg-highlight-layer,
#tehran-map-media-lite .tmg-lift-layer,
#tehran-map-media-lite .tmg-legend-layer,
#tehran-map-media-lite .tmg-interaction {
position: absolute;
inset: 0;
}
#tehran-map-media-lite .tmg-highlight-layer,
#tehran-map-media-lite .tmg-lift-layer { pointer-events: none; }
#tehran-map-media-lite .tmg-highlight-layer { z-index: 2; }
#tehran-map-media-lite .tmg-lift-layer { z-index: 3; }
#tehran-map-media-lite .tmg-highlight-piece,
#tehran-map-media-lite .tmg-lift-piece {
position: absolute;
inset: 0;
opacity: 0;
will-change: transform, filter, opacity;
}
#tehran-map-media-lite .tmg-highlight-piece {
transition: opacity .34s ease, filter .34s ease;
filter: saturate(1.06) brightness(1.05);
}
#tehran-map-media-lite .tmg-highlight-piece.active {
opacity: 1;
filter: saturate(1.12) brightness(1.08) drop-shadow(0 6px 12px rgba(0,0,0,.14));
}
#tehran-map-media-lite .tmg-lift-piece {
transition: opacity .24s ease, transform .68s cubic-bezier(.22,.82,.24,1), filter .68s ease;
transform: translateY(0);
filter: drop-shadow(0 0 0 rgba(0,0,0,0));
}
#tehran-map-media-lite .tmg-lift-piece.active {
opacity: 1;
transform: translateY(-7px);
filter: saturate(1.04) brightness(1.03) drop-shadow(0 9px 16px rgba(0,0,0,.22)) drop-shadow(0 2px 4px rgba(255,255,255,.08));
}
#tehran-map-media-lite .tmg-legend-layer { z-index: 4; pointer-events: none; }
#tehran-map-media-lite .tmg-legend-btn {
position: absolute;
left: 3.2%;
width: 21.8%;
height: 4.9%;
border: 0;
border-radius: 10px;
background: transparent;
cursor: pointer;
pointer-events: auto;
transition: background .25s ease, box-shadow .25s ease;
}
#tehran-map-media-lite .tmg-legend-btn:hover { background: rgba(255,255,255,.035); }
#tehran-map-media-lite .tmg-legend-btn.is-active {
background: rgba(255,255,255,.06);
box-shadow: inset 0 0 0 1px rgba(255,255,255,.16), 0 6px 14px rgba(0,0,0,.16);
}
#tehran-map-media-lite .tmg-legend-btn:focus-visible {
outline: 2px solid rgba(255,255,255,.5);
outline-offset: 2px;
}
#tehran-map-media-lite .tmg-legend-btn::after {
content: ”;
position: absolute;
right: 6.5%;
top: 17%;
width: 12%;
height: 66%;
border-radius: 6px;
box-shadow: inset 0 0 0 1px rgba(255,255,255,.18);
opacity: 0;
transition: opacity .25s ease, box-shadow .25s ease;
}
#tehran-map-media-lite .tmg-legend-btn.is-active::after {
opacity: 1;
box-shadow: inset 0 0 0 2px rgba(255,255,255,.45), 0 0 14px rgba(255,255,255,.18);
}
#tehran-map-media-lite .tmg-interaction { z-index: 5; cursor: default; }
#tehran-map-media-lite .tmg-interaction.is-over-region { cursor: pointer; }
#tehran-map-media-lite .tmg-tooltip {
position: absolute;
z-index: 7;
min-width: 170px;
max-width: min(270px, 78vw);
padding: 12px 14px;
border: 1px solid rgba(255,255,255,.28);
border-radius: 14px;
background: var(–tmg-tooltip-bg);
color: var(–tmg-text);
box-shadow: 0 14px 34px rgba(0,0,0,.32);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
pointer-events: none;
opacity: 0;
transform: translate(10px, -50%) scale(.98);
transition: opacity .2s ease, transform .2s ease;
text-align: right;
}
#tehran-map-media-lite .tmg-tooltip.show { opacity: 1; transform: translate(10px, -50%) scale(1); }
#tehran-map-media-lite .tmg-tooltip strong { display: block; font-size: 15px; line-height: 1.6; font-weight: 700; }
#tehran-map-media-lite .tmg-tooltip .tmg-price { display: block; margin-top: 2px; font-size: 22px; line-height: 1.4; font-weight: 800; }
#tehran-map-media-lite .tmg-tooltip small { display: block; margin-top: 2px; color: var(–tmg-muted); font-size: 12px; line-height: 1.6; }
#tehran-map-media-lite .tmg-sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
@media (max-width: 760px) {
#tehran-map-media-lite .tmg-tooltip { min-width: 145px; padding: 9px 11px; border-radius: 11px; }
#tehran-map-media-lite .tmg-tooltip strong { font-size: 13px; }
#tehran-map-media-lite .tmg-tooltip .tmg-price { font-size: 18px; }
#tehran-map-media-lite .tmg-tooltip small { font-size: 11px; }
#tehran-map-media-lite .tmg-legend-btn { border-radius: 8px; }
}
(function() {
const root = document.getElementById(‘tehran-map-media-lite’);
if (!root || root.dataset.ready === ‘1’) return;
root.dataset.ready = ‘1’;
const imageUrl = (root.dataset.imageUrl || ”).trim();
if (!imageUrl || imageUrl === ‘YOUR_IMAGE_URL_HERE’) {
root.innerHTML = ‘
‘;
return;
}
const regions = [{“id”: 1, “value”: 514, “x”: 56.8, “y”: 16.7, “rx”: 8.5, “ry”: 11.0}, {“id”: 2, “value”: 346, “x”: 44.6, “y”: 22.5, “rx”: 8.0, “ry”: 9.5}, {“id”: 3, “value”: 416, “x”: 68.7, “y”: 22.0, “rx”: 8.5, “ry”: 9.5}, {“id”: 4, “value”: 261, “x”: 79.3, “y”: 32.3, “rx”: 7.8, “ry”: 8.5}, {“id”: 5, “value”: 285, “x”: 38.7, “y”: 37.1, “rx”: 8.0, “ry”: 9.5}, {“id”: 6, “value”: 342, “x”: 54.2, “y”: 36.3, “rx”: 8.0, “ry”: 9.0}, {“id”: 7, “value”: 219, “x”: 65.3, “y”: 38.4, “rx”: 7.2, “ry”: 8.0}, {“id”: 8, “value”: 202, “x”: 75.4, “y”: 48.1, “rx”: 6.8, “ry”: 8.5}, {“id”: 9, “value”: 166, “x”: 46.0, “y”: 49.1, “rx”: 7.5, “ry”: 8.4}, {“id”: 10, “value”: 147, “x”: 56.8, “y”: 50.7, “rx”: 7.0, “ry”: 8.5}, {“id”: 11, “value”: 136, “x”: 64.5, “y”: 58.6, “rx”: 6.4, “ry”: 8.2}, {“id”: 12, “value”: 137, “x”: 72.4, “y”: 62.2, “rx”: 6.2, “ry”: 8.0}, {“id”: 13, “value”: 195, “x”: 87.0, “y”: 50.4, “rx”: 7.8, “ry”: 9.0}, {“id”: 14, “value”: 167, “x”: 83.3, “y”: 62.6, “rx”: 7.4, “ry”: 8.8}, {“id”: 15, “value”: 133, “x”: 77.9, “y”: 75.0, “rx”: 7.5, “ry”: 9.3}, {“id”: 16, “value”: 124, “x”: 63.0, “y”: 73.4, “rx”: 7.5, “ry”: 9.0}, {“id”: 17, “value”: 112, “x”: 46.2, “y”: 73.8, “rx”: 8.5, “ry”: 9.6}, {“id”: 19, “value”: 135, “x”: 54.0, “y”: 62.8, “rx”: 7.0, “ry”: 8.8}, {“id”: 20, “value”: 126, “x”: 57.6, “y”: 86.4, “rx”: 7.5, “ry”: 8.5}, {“id”: 21, “value”: 145, “x”: 37.3, “y”: 62.1, “rx”: 8.0, “ry”: 9.0}, {“id”: 22, “value”: 188, “x”: 31.8, “y”: 49.2, “rx”: 7.3, “ry”: 8.5}];
const legendRows = [{“id”: “gt400”, “top”: 35.4, “label”: “بیشتر از ۴۰۰ میلیون تومان”}, {“id”: “b300_400”, “top”: 41.2, “label”: “۳۰۰ تا ۴۰۰ میلیون تومان”}, {“id”: “b200_300”, “top”: 47.0, “label”: “۲۰۰ تا ۳۰۰ میلیون تومان”}, {“id”: “b150_200”, “top”: 52.9, “label”: “۱۵۰ تا ۲۰۰ میلیون تومان”}, {“id”: “b100_150”, “top”: 58.8, “label”: “۱۰۰ تا ۱۵۰ میلیون تومان”}, {“id”: “b50_100”, “top”: 64.7, “label”: “۵۰ تا ۱۰۰ میلیون تومان”}, {“id”: “under100”, “top”: 70.5, “label”: “کمتر از ۱۰۰ میلیون تومان”}];
const shell = root.querySelector(‘.tmg-shell’);
const baseImage = root.querySelector(‘.tmg-base’);
const dimmer = root.querySelector(‘.tmg-map-dimmer’);
const highlightLayer = root.querySelector(‘.tmg-highlight-layer’);
const liftLayer = root.querySelector(‘.tmg-lift-layer’);
const legendLayer = root.querySelector(‘.tmg-legend-layer’);
const interaction = root.querySelector(‘.tmg-interaction’);
const tooltip = root.querySelector(‘.tmg-tooltip’);
const tipRegion = root.querySelector(‘.tmg-region’);
const tipPrice = root.querySelector(‘.tmg-price’);
const tipBand = root.querySelector(‘.tmg-band’);
const live = root.querySelector(‘.tmg-live’);
const nf = new Intl.NumberFormat(‘fa-IR’);
let locked = false;
let active = null;
let activeFilter = null;
const highlightPieces = new Map();
const liftPieces = new Map();
const legendButtons = new Map();
baseImage.src = imageUrl;
dimmer.style.backgroundImage = `url(${imageUrl})`;
function getBandId(value) {
if (value > 400) return ‘gt400’;
if (value >= 300) return ‘b300_400’;
if (value >= 200) return ‘b200_300’;
if (value >= 150) return ‘b150_200’;
if (value >= 100) return ‘b100_150’;
if (value >= 50) return ‘b50_100’;
return ‘under100’;
}
function getBandText(value) {
if (value > 400) return ‘بیشتر از ۴۰۰ میلیون تومان’;
if (value >= 300) return ‘۳۰۰ تا ۴۰۰ میلیون تومان’;
if (value >= 200) return ‘۲۰۰ تا ۳۰۰ میلیون تومان’;
if (value >= 150) return ‘۱۵۰ تا ۲۰۰ میلیون تومان’;
if (value >= 100) return ‘۱۰۰ تا ۱۵۰ میلیون تومان’;
if (value >= 50) return ‘۵۰ تا ۱۰۰ میلیون تومان’;
return ‘کمتر از ۱۰۰ میلیون تومان’;
}
function createPiece(region, className) {
const piece = document.createElement(‘div’);
piece.className = className;
piece.style.backgroundImage = `url(${imageUrl})`;
const clip = `ellipse(${region.rx}% ${region.ry}% at ${region.x}% ${region.y}%)`;
piece.style.clipPath = clip;
piece.style.webkitClipPath = clip;
return piece;
}
regions.forEach(region => {
const hPiece = createPiece(region, ‘tmg-highlight-piece’);
highlightLayer.appendChild(hPiece);
highlightPieces.set(region.id, hPiece);
const lPiece = createPiece(region, ‘tmg-lift-piece’);
liftLayer.appendChild(lPiece);
liftPieces.set(region.id, lPiece);
});
legendRows.forEach(row => {
const btn = document.createElement(‘button’);
btn.type = ‘button’;
btn.className = ‘tmg-legend-btn’;
btn.dataset.bandId = row.id;
btn.style.top = row.top + ‘%’;
btn.setAttribute(‘aria-pressed’, ‘false’);
btn.setAttribute(‘aria-label’, ‘فیلتر: ‘ + row.label);
btn.addEventListener(‘click’, (ev) => {
ev.stopPropagation();
setFilter(activeFilter === row.id ? null : row.id);
});
legendLayer.appendChild(btn);
legendButtons.set(row.id, btn);
});
function updateLegendState() {
legendButtons.forEach((btn, id) => {
const on = activeFilter === id;
btn.classList.toggle(‘is-active’, on);
btn.setAttribute(‘aria-pressed’, on ? ‘true’ : ‘false’);
});
}
function updateFilterHighlights() {
highlightPieces.forEach((piece, regionId) => {
const region = regions.find(r => r.id === regionId);
const show = !!activeFilter && getBandId(region.value) === activeFilter;
piece.classList.toggle(‘active’, show);
});
}
function setFilter(filterId) {
activeFilter = filterId;
root.classList.toggle(‘is-filtered’, !!activeFilter);
updateLegendState();
updateFilterHighlights();
if (active) setLiftedRegion(active);
}
function getLocalPoint(ev) {
const r = shell.getBoundingClientRect();
return {
px: ev.clientX – r.left,
py: ev.clientY – r.top,
x: ((ev.clientX – r.left) / r.width) * 100,
y: ((ev.clientY – r.top) / r.height) * 100
};
}
function findRegion(x, y) {
let best = null;
let bestScore = Infinity;
for (const region of regions) {
const dx = (x – region.x) / region.rx;
const dy = (y – region.y) / region.ry;
const score = dx * dx + dy * dy;
if (score r.width – 10) left = px – tw – 14;
top = Math.max(th / 2 + 8, Math.min(r.height – th / 2 – 8, top));
tooltip.style.left = left + ‘px’;
tooltip.style.top = top + ‘px’;
}
function clearLiftPieces() { liftPieces.forEach(piece => piece.classList.remove(‘active’)); }
function setLiftedRegion(region) {
clearLiftPieces();
if (!region) return;
const allowed = !activeFilter || getBandId(region.value) === activeFilter;
if (!allowed) return;
const piece = liftPieces.get(region.id);
if (piece) piece.classList.add(‘active’);
}
function showRegion(region, px, py, announce) {
active = region;
setLiftedRegion(region);
interaction.classList.add(‘is-over-region’);
tipRegion.textContent = ‘منطقه ‘ + nf.format(region.id);
tipPrice.textContent = nf.format(region.value) + ‘ میلیون تومان’;
tipBand.textContent = ‘متوسط قیمت هر مترمربع · ‘ + getBandText(region.value);
tooltip.classList.add(‘show’);
tooltip.setAttribute(‘aria-hidden’, ‘false’);
placeTooltip(px, py);
if (announce) live.textContent = `منطقه ${nf.format(region.id)}، ${nf.format(region.value)} میلیون تومان در هر مترمربع`;
}
function hideRegion(force) {
if (locked && !force) return;
active = null;
clearLiftPieces();
interaction.classList.remove(‘is-over-region’);
tooltip.classList.remove(‘show’);
tooltip.setAttribute(‘aria-hidden’, ‘true’);
}
interaction.addEventListener(‘pointermove’, (ev) => {
if (ev.pointerType === ‘touch’ || locked) return;
const p = getLocalPoint(ev);
const region = findRegion(p.x, p.y);
if (region) showRegion(region, p.px, p.py, false);
else hideRegion(false);
});
interaction.addEventListener(‘pointerleave’, () => hideRegion(false));
interaction.addEventListener(‘click’, (ev) => {
const p = getLocalPoint(ev);
const region = findRegion(p.x, p.y);
if (!region) {
locked = false;
hideRegion(true);
return;
}
locked = true;
showRegion(region, p.px, p.py, true);
});
interaction.addEventListener(‘keydown’, (ev) => {
if (ev.key === ‘Escape’) { locked = false; hideRegion(true); return; }
if (![‘ArrowLeft’,’ArrowRight’,’ArrowUp’,’ArrowDown’,’Enter’,’ ‘].includes(ev.key)) return;
ev.preventDefault();
let idx = active ? regions.findIndex(r => r.id === active.id) : 0;
if (ev.key === ‘ArrowLeft’ || ev.key === ‘ArrowDown’) idx = (idx + 1) % regions.length;
if (ev.key === ‘ArrowRight’ || ev.key === ‘ArrowUp’) idx = (idx – 1 + regions.length) % regions.length;
const region = regions[idx];
locked = true;
const rect = shell.getBoundingClientRect();
showRegion(region, rect.width * region.x / 100, rect.height * region.y / 100, true);
});
document.addEventListener(‘click’, (ev) => {
if (!root.contains(ev.target)) { locked = false; hideRegion(true); }
});
window.addEventListener(‘resize’, () => {
if (active && tooltip.classList.contains(‘show’)) {
const rect = shell.getBoundingClientRect();
placeTooltip(rect.width * active.x / 100, rect.height * active.y / 100);
}
});
})();
براساس دادههای منتشرشده از سوی کانال رصدخانه بازار مسکن، متوسط قیمت پیشنهادی فروشندگان مسکن در هفته منتهی به جمعه دوم مردادماه ۱۴۰۵، معادل ۲۰۹ میلیون تومان در هر مترمربع بوده است.
افزایش قیمت پیشنهادی در برخی مناطق تهران
مقایسه قیمتهای پیشنهادی در مناطق ۲۲گانه تهران با هفته قبل نشان میدهد فروشندگان در برخی مناطق، مبالغ پیشنهادی خود را افزایش دادهاند. میانگین قیمت ثبتشده در نقشه جدید نیز در مقایسه با نیمه تیرماه حدود نیم درصد افزایش یافته است.
روند فعلی بازار مسکن از یکسو با رشد تند قیمتها در ماههای بهار فاصله دارد، اما از سوی دیگر، قیمتهای پیشنهادی وارد مسیر کاهشی نشدهاند. به بیان دیگر، سرعت رشد قیمت کاهش یافته، اما سطح عمومی قیمتها همچنان در برابر رکود معاملاتی مقاومت میکند.
سرمایهگذاران فعلاً بازار مسکن را در اولویت قرار نمیدهند
رصدخانه بازار مسکن معتقد است وضعیت فعلی بازار دو پیام اصلی دارد. پیام نخست این است که در شرایط کنونی، بازار ملک در اولویت سرمایهگذاران قرار ندارد.
براساس تحلیل منتشرشده از سوی این کانال، شرایط ناشی از جنگ باعث شده است تمایل سرمایهگذاران به داراییهایی مانند طلا و ارز، بیشتر از سرمایهگذاری در بازار مسکن باشد؛ بازاری که نقدشوندگی بسیار کمتری نسبت به طلا و ارز دارد.
کاهش حضور خریداران و سرمایهگذاران در بازار مسکن، به تعمیق رکود معاملاتی منجر شده است؛ بااینحال، این رکود تاکنون نتوانسته است قیمتهای پیشنهادی فروشندگان را کاهش دهد.
مقاومت قیمت مسکن در برابر رکود معاملات
پیام دوم نقشه حرارتی بازار مسکن، مقاومت سطح قیمتها در برابر رکود تقاضاست. در شرایطی که تعداد خریداران حاضر در بازار کاهش یافته است، قیمتهای پیشنهادی همچنان، هرچند بهمیزان محدود، افزایش پیدا میکنند.
دنیای اقتصاد یکی از دلایل این وضعیت را تداوم افزایش قیمت تمامشده ساخت مسکن عنوان کرده است. رشد هزینه زمین، مصالح ساختمانی، دستمزد و سایر هزینههای ساخت باعث شده است فروشندگان و سازندگان، حتی در شرایط کاهش تقاضا، تمایل چندانی به پایینآوردن قیمتها نداشته باشند.
منطقه ۱۷ ارزانترین منطقه مسکونی تهران شد
براساس نقشه حرارتی جدید بازار مسکن تهران، کف قیمت پیشنهادی مسکن در میان مناطق ۲۲گانه پایتخت از متری ۱۱۲ میلیون تومان در منطقه ۱۷ آغاز میشود.
این در حالی است که در دورههای گذشته معمولاً منطقه ۱۸ تهران پایینترین متوسط قیمت مسکن را در میان مناطق پایتخت در اختیار داشت. قرارگرفتن منطقه ۱۷ در جایگاه ارزانترین منطقه تهران، نشاندهنده تغییر در ترتیب مناطق پایین جدول قیمت مسکن است.
باید توجه داشت که ارقام منتشرشده در این نقشه، قیمت پیشنهادی فروشندگان است و لزوماً با قیمت نهایی ثبتشده در معاملات قطعی مسکن برابر نیست. قیمت هر واحد مسکونی میتواند متناسب با موقعیت جغرافیایی، سن بنا، متراژ، کیفیت ساختمان، امکانات و شرایط فروش، با میانگین منطقه متفاوت باشد.
منبع این گزارش:
این خبر به صورت خودکار توسط پلتفرم BankdariPress از خبرگزاری راه پرداخت استخراج شده است.