# Data and method

**Dataset:** CityMETER Luxury Brands Thailand  
**Snapshot date:** 2026-10-21 (Asia/Bangkok)  
**Record grain:** one brand–point-of-sale observation  
**Release level:** exploratory public demo; not a complete market census


> หน่วยข้อมูล: หนึ่งรายการ = หนึ่ง brand–point-of-sale observation — บนหน้าจอเรียกว่า “สาขา” (ร้าน เคาน์เตอร์ หรือ shop-in-shop ของแบรนด์หนึ่งในสถานที่หนึ่ง) ไม่ใช่จำนวนสาขาทั้งประเทศของแบรนด์

## หน่วยข้อมูลและขอบเขต

หนึ่งรายการคือแบรนด์–สาขา อาจเป็น boutique, beauty counter, department store, multibrand retailer, duty-free, outlet, pop-up หรือร้าน standalone หลายแบรนด์อาจใช้หน้าร้านและพิกัดเดียวกัน ขณะที่แบรนด์เดียวอาจมีหลายแถวในศูนย์เดียวกัน จึงรายงาน **แบรนด์ไม่ซ้ำ** และ **สาขา** แยกกัน ไม่เรียกจำนวนแถวว่า “จำนวนหน้าร้านอิสระ”

Research refresh มี 349 รายการ และรักษาต้นฉบับ 352 แถวสำหรับ legacy reconciliation ไม่ลบแถวที่ตรวจพบปิดถาวร เว็บไซต์มี 565 research records: 349 refresh, 211 legacy ที่ยังจับคู่ไม่ลงตัว และ 5 ข้อสังเกตสถานะจากประวัติที่ต้องเก็บแยก ข้อสังเกตสถานะอาจอ้างถึงสาขาเดียวกับ refresh จึงไม่ใช้ทั้งหมดเป็นจำนวนร้านที่เปิดอยู่ รายละเอียดจำนวนล่าสุดและ coverage อยู่ใน `data/luxury.json` → `meta`; ตารางบนหน้าเว็บแสดงจำนวนตามตัวกรองจริง

ครอบคลุม luxury designers, fine jewellery, watches, upscale streetwear, Thai designers และ curated retailers โดยแยก beauty/fragrance และ accessible premium เป็นกลุ่มขยาย การจัดกลุ่มเป็น research taxonomy ไม่ใช่การรับรองระดับแบรนด์จากหน่วยงานทางการ

## สถานะสาขาและประวัติ

- `permanently closed`: พบหลักฐานปิดถาวรของสถานที่นั้น เก็บรายการและลิงก์หลักฐานไว้ ค่าเริ่มต้นแยกออกจากรายการ refresh ที่ใช้สำรวจ presence
- `temporarily closed`: สถานะพัก/ปิดชั่วคราวจากแหล่งข้อมูล ไม่เปลี่ยนเป็นปิดถาวร
- `closure_conflict_review`: official listing ที่เพิ่งตรวจยังแสดงรายการ แต่แผนที่เดิมระบุปิดถาวร จึงคงหลักฐานทั้งสองชุดและพักจาก presence ค่าเริ่มต้น ไม่เลือกหลักฐานฝ่ายใดเป็นข้อยุติ
- พบใน official locator หรือ directory: ยืนยันว่ามีรายการอยู่ในแหล่งที่ตรวจ ไม่ใช่การยืนยันเปิดจริงด้วยการลงพื้นที่
- `legacy_unmatched`: แถวจากประวัติที่ยังจับคู่หรือยืนยันใหม่ไม่ได้ การไม่พบใน locator เพียงอย่างเดียวไม่เพียงพอให้ตัดสินปิดถาวร

snapshot นี้เก็บข้อสังเกต `permanently closed` จากประวัติ 21 แถว และ `temporarily closed` 1 แถว มี closure conflicts 4 รายการที่สัมพันธ์กับแถวเดิม 52, 229, 324 และ 329 จึงแสดง refresh ตามค่าเริ่มต้น 345 จาก 349 รายการ รายการ conflict ยังดูได้ใน “ทั้งหมด รวมประวัติเดิม” พร้อมแหล่งข้อมูลและสถานะรอตรวจ

เมื่อหลักฐานขัดกัน ให้คงข้อขัดแย้งและวันที่ตรวจไว้ “Closed now” ตามเวลาทำการไม่ใช่ “permanently closed” และการย้ายร้านควรตรวจสถานที่เดิมกับสถานที่ใหม่แยกกัน

## พิกัดและการจับคู่ Shopping Center

พิกัดรักษาแหล่งที่มาและบทบาท (`geometryRole`, `geometryStatus`, `coordinateSource`) การกู้พิกัดจากลิงก์แผนที่เดิมยืนยันเพียงตำแหน่งที่ลิงก์นั้นชี้ ไม่ยืนยันว่าร้านยังเปิดอยู่ พิกัดจาก official locator ยังคงเป็นข้อสังเกตจากแหล่งข้อมูล พิกัดศูนย์การค้าหรืออาคารต้องอ่านเป็น **host-complex / building representative point** ไม่ใช่ประตูร้านหรือชั้นที่ร้านตั้งอยู่

ผลรอบนี้ refresh มีพิกัด 349/349 รายการ: จุดสถานที่จากแหล่งข้อมูล 171 แถว และตัวแทนศูนย์/อาคาร 178 แถว ไม่อ้างว่า 171 จุดแรกผ่านการสำรวจหน้าร้านแล้ว ประวัติ 348/352 แถวมีพิกัดที่ใช้ได้ อีก 4 แถว (41, 132, 315, 342) พัก geometry เดิมไว้เพื่อทบทวนตัวตน/host การใช้จุด host ใหม่ใน refresh ไม่ใช่การยอมรับพิกัดเดิมที่ถูกพัก

หากไม่มีพิกัดที่รองรับ ให้คงค่า missing และเก็บรายการในตาราง ไม่ใช้จุดกึ่งกลางย่าน จังหวัด หรือร้านข้างเคียงแทน จุดอ้างอิงผู้เช่ารายอื่นในอาคารเดียวกันต้องติดป้ายว่าเป็นตัวแทนอาคาร และมีหลักฐานยืนยัน host เดียวกันก่อนใช้

บริบท Shopping Center ใช้ **39 host complexes** จาก CityMETER production และ crosswalk **48 ชื่อสถานที่** จาก research workbook การจับคู่เป็นชื่อเดียวกันหลัง normalize หรือ alias ที่ระบุ parent complex เดียวกัน เช่น Siam Takashimaya → ICONSIAM และ One Bangkok / Parade → One Bangkok ไม่มีการจับคู่ด้วย “ศูนย์ที่ใกล้ที่สุด”

ข้อมูลแต่ละศูนย์เก็บ UUID ของ CityMETER, external ID, ชื่อ และ latitude/longitude ที่ endpoint `/detail/{rowId}` คืนมาตรง ๆ ไม่ใช้พิกัดที่ลดความละเอียดจาก map tile เป็นพิกัดร้าน ไม่บังคับจับคู่ชื่อที่ยังแยกตัวตนไม่ได้ เช่น MAYA, Gaysorn Tower หรือ Central Phuket Floresta กับ record ของผู้เช่าภายในศูนย์

**Production source:** <https://landometer.com/v3/citymeter?d=shoppingCenter>  
**API base:** `https://landometer.com/api/v2/citymeter-v3/shopping-center`  
**Retrieval date:** 2026-10-21

หน้าจอ production ระบุช่วงข้อมูลต้นทาง Google Places API **2026-05-28**, OpenStreetMap และ Longdo Map **2026-07-20**, ประมวลผล **2026-07-20** วันที่ดึงข้อมูลในเดือนตุลาคมจึงไม่ใช่วันที่ทุก attribute ได้รับการสำรวจใหม่

GLA/GFA มีทั้งค่ารายงาน ค่ารวบรวม และค่าคำนวณ ให้คง source/confidence ประกอบทุกครั้ง ตัวอย่างเช่น GFA บางแห่งคำนวณจาก GLA÷0.7 และ GLA บางแห่งประมาณจาก OSM ไม่สรุปรวมเป็นขนาดตลาดที่วัดยืนยันแล้ว จำนวน Longdo POIs ใกล้เคียงไม่ใช่จำนวนสัญญาเช่าหรือผู้เช่าที่เปิดจริง; demo ไม่ใช้จำนวนดังกล่าวแทนจำนวน luxury brands

## หมุดรายร้านและการจัดวางบนจอ

แต่ละสาขาที่มีพิกัดมี feature และหมุดของตัวเอง แม้หลายรายการจะใช้ชื่อแบรนด์หรือพิกัดต้นทางเดียวกัน ไม่มีการรวมหมุดตามระดับซูมหรือรวมตามอาคาร หน่วยนับยังเป็น brand–POS observation ไม่รับรองว่าหนึ่งหมุดเป็นหนึ่งหน้าร้านอิสระที่ผ่านการตรวจตัวตนครบแล้ว ประวัติที่เลือกแสดงเป็นข้อสังเกตเดิม ไม่ใช่จำนวนร้านใหม่เพิ่ม

เมื่อหมุดซ้อนกัน ระบบจัดตำแหน่งใน screen space ให้แต่ละหมุดเลือกได้ และวาดเส้นกลับพิกัดต้นทาง การจัดนี้คำนวณใหม่เมื่อเลื่อนหรือซูม ไม่เขียน latitude/longitude ใหม่ในข้อมูล แหล่ง GeoJSON คงตำแหน่งต้นทาง หมุดที่ใช้จุดตัวแทนศูนย์ยังคงบทบาทดังกล่าว

เมื่อดูระดับภูมิภาคหรือประเทศ เครื่องหมายรายร้านจะย่อขนาดลงเพื่อไม่ให้การจัดแยกกระจายร้านกรุงเทพฯ ไปทั่วแผนที่ ยังมีหนึ่งเครื่องหมายต่อหนึ่งรายการโดยไม่แทนด้วยตัวเลขรวม ซูมเข้าเพื่อดูหมุดรายร้านและอาคารสามมิติ

## กราฟและขอบเขตย่าน

กราฟและแผนที่ย่านใช้ **ขอบเขตตัวกรองก่อนการเลือกย่าน** (`scopeRows`) ส่วนหมุด ตัวเลขรวม และตารางใช้รายการหลังการเลือกย่าน/focus (`rows`) เพื่อให้การเทียบย่านยังเห็นทุกย่านในตัวกรองและ “แบรนด์เฉพาะย่าน” ไม่กลายเป็น 100% เมื่อเลือกย่านเดียว หน้าจอบอกความต่างนี้ด้วยคำอธิบายกำกับ แบรนด์ไม่ซ้ำนับเป็น Set ของชื่อแบรนด์ต่อย่าน; ย่าน × กลุ่มแบรนด์ แสดงเป็นตารางตัวเลขที่ระบายสีด้วย LDS `count` family; แบรนด์เฉพาะ/ร่วม เทียบทุกย่านที่มีสาขาใน `scopeRows` ก่อนตัดอันดับ ไม่แปลงเป็นยอดขายหรืออุปสงค์

แผนที่ภาพรวมระบายสีย่านตามแบรนด์ไม่ซ้ำด้วย `count` family (จำนวนรวม ไม่ใช่ความหนาแน่น) แบ่ง 5 ระดับเท่าช่วงจากค่าสูงสุดในตัวกรอง ประกาศช่วงตัวเลขในคำอธิบาย ใช้ HEX เดียวกันทั้งธีมสว่างและมืด ย่านที่นิยามไว้แต่ไม่พบแบรนด์ในตัวกรองแสดงเป็นศูนย์ที่สำรวจแล้ว (fill ต่ำสุด + เส้นขอบศูนย์) พื้นที่นอกย่านไม่ระบายสี ที่ zoom ≥ 14.5 สีย่านปิดเพื่อให้หมุดและอาคารอ่านได้ เมื่อเลือกย่านหรือสำรวจ 3 ย่าน เฉพาะย่านเหล่านั้นคงสีและรายละเอียด ย่านอื่นเหลือเส้นขอบบาง และรายการนอก focus เป็นจุดบริบทสีเทาที่ยังคงหนึ่งจุดต่อหนึ่งรายการ

ย่านใช้ polygon ที่นิยามคงที่จากหลักฐานชื่อพื้นที่และแนวถนน/แม่น้ำ แทนการเชื่อมจุดตามรัศมี รูปทรงจึงไม่เปลี่ยนเมื่อเลือกแบรนด์หรือสถานะ ใช้ point-in-polygon จากพิกัดต้นทาง; หากทับเส้นร่วมให้ใช้ priority และ ID คงที่เพื่อกำหนดสมาชิกหนึ่งย่านโดยไม่เปลี่ยนตามตัวกรอง

ขอบเขตเป็น **ข้อเสนอวิเคราะห์ที่ต้องตรวจเพิ่ม** ไม่ใช่เขตปกครอง ผลสำรวจผู้บริโภค หรือ catchment ที่ยืนยันแล้ว ข้อมูลที่อยู่นอกขอบเขตยังแสดงอยู่และไม่ถูกบังคับเข้าเขตใกล้สุด ชื่อย่านในข้อมูลเดิมเก็บไว้แยกจากการกำหนดย่านเชิงพื้นที่ อ่านรายละเอียด แหล่งอ้างอิง และแนวขอบใน [NEIGHBORHOOD_METHOD.md](docs/NEIGHBORHOOD_METHOD.md)

## อาคารสามมิติ

อาคารเป็นบริบทของสาขา ใช้รูปทรง footprint หรือ building parts จากแหล่งข้อมูล พร้อมเก็บ source identity และวิธีจับคู่ ไม่สร้างสี่เหลี่ยมหรือวงกลมจากพิกัดร้านเพื่ออ้างเป็นรูปทรงอาคาร ไม่เลือกอาคารที่ใกล้ที่สุดแทนการยืนยันตัวตนหรือ point containment

การแสดงความสูงแยกค่าที่แหล่งข้อมูลระบุ ค่าประมาณ และไม่ทราบ หากไม่ทราบให้คงค่า height ว่างและใช้ความสูงแสดงผล 3 เมตรเพื่อให้เห็นรูปทรงตามแนวทาง CityMETER Building ซึ่งไม่ใช่ความสูงที่วัดได้ พิกัดร้านภายใน host complex ไม่ยืนยันห้อง ชั้น หรือ footprint ของส่วนอาคารที่ร้านใช้จริง

snapshot นี้มี 60 host footprints และ 53 building parts จาก 9 hosts รองรับ 333/349 รายการใหม่ อีก 16 รายการยังไม่มีการจับคู่อาคารที่รองรับ ความสูงแบบจำลองของ 4 อาคารในทรงวาด (OSM ways 1053924942, 1053924944, 1491142739, 1053934669) อยู่ระหว่าง 45.44–74.60 เมตรและยังไม่มีความสูง/จำนวนชั้นจาก OSM รองรับ จึงเก็บ `height_m` ต้นทางไว้ แต่ตั้ง `height_status=model_height_review` และใช้ `display_height_m=3` เพื่อแสดงรูปทรงระหว่างรอตรวจ ไม่แก้ค่าต้นทางเป็นความสูงที่เดาขึ้นใหม่

## สิทธิ์และความพร้อม

ผู้ใช้อนุญาตให้นำบริบท Shopping Center ของ CityMETER มาใช้ใน demo นี้ สิทธิ์ของ underlying providers ยังคงแยกตามแหล่ง จึงเก็บ provenance และหลีกเลี่ยงการเผยแพร่ raw nearby-tenant lists, credentials หรือข้อมูลส่วนบุคคลที่ไม่จำเป็น แบรนด์และเครื่องหมายการค้าเป็นของเจ้าของตามกฎหมาย

แผนที่ใช้ vector tiles ของ [OpenFreeMap](https://openfreemap.org/) (OpenMapTiles schema, ข้อมูล OpenStreetMap) ผ่าน style ที่สร้างเองใน `js/map-style.js` ตั้งแต่รุ่น 0.3 แทน style สำเร็จรูป Positron/Dark พร้อม attribution ของ OpenFreeMap, OpenMapTiles และ OpenStreetMap ตามผู้ให้บริการ ไม่มี offline download หรือ bulk tile prefetch (ชั้นมวลอาคารโฟกัสดึง tile ซ้ำเฉพาะ ≤ 9 tiles ที่แตะย่านโฟกัส จาก URL เดียวกับที่ MapLibre โหลด) กราฟวาดภายในโปรเจกต์โดยไม่มีไลบรารีภายนอก การโหลด CDN หรือการเปิด demo สำเร็จไม่ใช่หลักฐานว่าสาขาทั้งหมดผ่าน field validation

## มวลอาคารเมือง (บริบท ไม่ใช่ข้อมูลของชุดนี้)

ตั้งแต่รุ่น 0.3 แผนที่แสดงอาคารทั้งเมืองจาก `building` source-layer ของ OpenFreeMap (ที่มา OpenStreetMap) สองชั้น:

- **ชั้นเมือง (quiet):** fill-extrusion จาก tile โดยตรง ใช้ `render_height` / `render_min_height` ที่ OpenMapTiles คำนวณจาก tag `height`, `building:levels` หรือค่า default เมื่อไม่มี tag อาคารที่ tile ระบุ `hide_3d` ไม่แสดง สีโทนเงียบจาก `--basemap-massing-quiet`
- **ชั้นโฟกัส:** อาคารที่ซ้อนทับ polygon ของย่านที่โฟกัส ถอดจาก tile เดียวกันด้วย `js/mvt.js` แล้ว **ขยายออกเล็กน้อยและลบมุมโค้ง** (`js/geometry.js`) ให้รูปทรงใหม่ล้อมต้นฉบับทั้งก้อน ยกความสูงขึ้น 0.35 เมตร เป็นการแสดงผลแบบโมเดลเมืองเท่านั้น (คำตอบต่อ maplibre-style-spec #1047 ที่ยังไม่รองรับใน MapLibre) ไม่เปลี่ยน footprint หรือความสูงต้นทางในข้อมูลใด
- อาคารจาก OSM ที่ซ้อนกับ **อาคารที่ตั้งร้าน** ใน `data/venue-buildings.geojson` ถูกตัดออกจากชั้นโฟกัสและซ่อนในชั้นเมืองด้วย feature id เพื่อให้อาคารที่ตั้ง (สี `map.activeLayer`) เป็นชั้นเดียวที่ถือข้อมูลของชุดนี้

ความสูงและรูปทรงจาก OSM เป็นบริบทที่ความครอบคลุมต่างกันรายพื้นที่ (OpenFreeMap รวมอาคารความสูงเดียวกันเป็น MultiPolygon เดียว) ห้ามนำไปอ้างเป็นความสูงจริง จำนวนชั้น หรือข้อเท็จจริงของร้าน รายการตรวจความครอบคลุมรายย่านอยู่ใน backlog N09

## กรอบจังหวัด (บริบทสำหรับมุมมองทั้งประเทศ)

ตั้งแต่รุ่น 0.4 `data/provinces.geojson` เก็บกรอบของ 9 จังหวัดที่มีสาขาในชุดข้อมูล ที่มาคือ `provinces.geojson` ของ [OpenGISData-Thailand](https://github.com/chingchai/OpenGISData-Thailand) (ผู้เผยแพร่ระบุว่าขอบเขตการปกครองอ้างอิงกรมการปกครอง; สัญญาอนุญาต CC BY 4.0) ดึงเมื่อ 22 ต.ค. 2569 ที่ commit `fafcea179cda88b689f5697c3866a449e79cd298` (sha256 ของไฟล์ต้นทาง `310c3adf…011c0`) ด้วย `scripts/extract-provinces.mjs`: เลือกเฉพาะจังหวัดใน `js/model.js#PROVINCES` (จับคู่ด้วยชื่อไทย) ปัดพิกัดเป็น 5 ตำแหน่ง ไม่ simplify, id = รหัสจังหวัดของ production, `dopaCode` = รหัส 2 หลักของ DOPA (กรุงเทพมหานคร 10, ภูเก็ต 83 …) กรอบใช้เป็นบริบทและทางเดิน (ระบายสีตามจำนวนแบรนด์ไม่ซ้ำต่อจังหวัดต่ำกว่า zoom 9, กดเพื่อเจาะลง) ไม่ใช่การยืนยันขอบเขตการปกครอง และอาจต่างจากขอบเขตที่ CityMETER production ใช้ (backlog N13) attribution แสดงใน control ของแผนที่

## รหัสจังหวัดและ breadcrumb

ย่านทั้ง 10 มี `provinceCode` / `provinceName` ใน `data/neighborhoods.geojson` (metadata.version 2026-10-22-r2; geometry ไม่เปลี่ยน) รหัสตรงกับ path ของ CityMETER production ที่สังเกตเมื่อ 22 ต.ค. 2569 (`/v3/citymeter/BKK`, `/PKT`, `/CMI`, `/SPK`, `/NBI`, `/CBI`, `/PTE`, `/UDN`, `/NMA`) ระดับที่สามของ production เข้ารหัสชนิดใน path (`/L/{locale uuid}`, `/M/{dopa code}`) ย่านของชุดนี้ยังไม่ใช่ Locale จึงเสนอ `/N/{neighborhood id}` เป็นทางเลือกระหว่างรอลงทะเบียน (Inference — ยังไม่ได้ทำใน production) ระดับที่สี่คือสถานที่: ศูนย์การค้าที่จับคู่แล้วใช้ `centers[].id` ซึ่งเป็น Shopping Center id ของ CityMETER (`externalId` SC-…, source `landometer.com/api/v2/citymeter-v3/shopping-center/detail/{id}`) จึงเสนอ `/V/{center id}` ต่อท้าย; สถานที่ที่ไม่มี id ใช้ป้ายชื่อ venue ตามข้อมูล ระดับย่านของสถานที่ตัดสินด้วย point-in-polygon ของจุดตัวแทนสถานที่ (พิกัดศูนย์ หรือแถวแรกที่มีพิกัด) ไม่ใช่ชื่อ สถานที่นอกย่านทั้ง 10 จึงไม่มีระดับย่าน

ก่อนเป็น production dataset ต้องกำหนดผู้รับผิดชอบ รอบตรวจสถานะ การทบทวน duplicate/physical-site identity การตรวจพิกัดภาคสนาม และสิทธิ์เผยแพร่ระดับข้อมูลให้ครบ

## โลโก้สถานที่ (venue)

ตั้งแต่รุ่น 0.5 แผงสถานที่ รายการสถานที่ และรายละเอียดร้านแสดงโลโก้ของสถานที่ (ศูนย์การค้า/ห้าง/โครงการ) จากทะเบียน `data/venue-logos.json` และไฟล์ใน `assets/venue-logos/` ที่มาคือแท็บ `10_VENUE_LOGOS` ของชีต research (CityMETER Luxury Brands Thailand — Market Refresh 2026-10-21) ตรวจเมื่อ 22 ต.ค. 2569: ชื่อ venue 96 รูปแบบ → 81 ชื่อเชื่อมโลโก้ได้จากไฟล์จริง 50 ไฟล์ (ใช้ร่วมเมื่อเป็นชื่อสะกดต่าง โซนในโครงการ หรือแบนเนอร์เครือ โดยระบุ `logo_role` ทุกแถว), 14 ชื่อไม่มีโลโก้ venue แยก (ถนน ย่าน อาคารเดี่ยว), ยังไม่พบ 1 (The Mall Ramkhamhaeng); ศูนย์การค้า 39 แห่งใน `07_SHOPPING_CENTERS` เชื่อมครบ สถานะรุ่น 0.5.0: ส่งไฟล์เข้าชุดติดตั้งและตรวจ sha256 ผ่านแล้ว 33 จาก 50 ไฟล์ (57 ชื่อ venue และ 29 ศูนย์การค้ามีโลโก้) อีก 17 ไฟล์ประกาศไว้ใน `meta.pending` ของทะเบียนพร้อม sha256 ตามชีต สถานที่เหล่านั้นแสดงชื่ออย่างเดียวจนกว่าไฟล์ที่ตรวจแล้วจะเข้ามา (ไม่มีรูปเสียหรือตัวแทน) `scripts/build-venue-logos.py` ตรวจ sha256 ของทุกไฟล์กับ manifest ก่อนคัดลอก (bytes ไม่เปลี่ยน) และกำหนดสีพื้นรองจากงานศิลป์ (โปร่งใส → stone `#E5E9E6`, โปร่งใสสีอ่อน → `#182327`, ไฟล์ทึบ → ขาว) การค้นหาใช้ Shopping Center id ก่อน แล้วจึงชื่อ venue ตรงตัว ไม่ fuzzy-match; ชื่อสถานที่ยังเป็นตัวระบุหลัก โลโก้ไม่เปลี่ยนแถว พิกัด หรือสถานะใด แหล่งที่มาต่อไฟล์ (หน้าทางการ/asset URL) อยู่ใน `assets/venue-logos-manifest.json` ไม่มีลิงก์ Drive ในทะเบียนสาธารณะ การรวบรวมไฟล์ไม่ใช่ใบอนุญาตเครื่องหมายการค้า สิทธิ์ยังเป็นของเจ้าของ แสดงเพื่อระบุสถานที่ของสาขาที่สังเกตได้เท่านั้น

## โลโก้และการระบุตัวตนแบรนด์

ใช้ทะเบียนโลโก้ 168 อัตลักษณ์จากแหล่งสาธารณะทางการ 155 และ retailer 13 ไฟล์ภายในเว็บครอบคลุมชื่อแบรนด์ทั้งปัจจุบันและประวัติใน snapshot นี้ การสะกดต่างกันเชื่อมด้วย alias ที่ตรวจแล้ว ไม่จับคู่ชื่อแบบคล้ายกันโดยอัตโนมัติ กรณีชื่อเดิม PRONTO & CO. เชื่อมกับ Amétora เฉพาะ identity ที่เจ้าของงานอนุมัติ ไม่แก้ชื่อในแถวประวัติ

เก็บ source URL, SHA-256, MIME, ขนาดต้นฉบับ และ viewport crop ของพื้นที่ว่างใน [manifest](assets/brand-logos-manifest.json) ไม่เปลี่ยนสี รูปทรง หรือสัดส่วนโลโก้ ใช้พื้นรองกลางตามสีหมึกจริง โลโก้มีหน้าที่ระบุแบรนด์เท่านั้น ไม่ใช้ขนาดหรือสีโลโก้เป็นตัววัดมูลค่า ความนิยม หรือสถานะเปิดร้าน ชื่อข้อความยังแสดงในตาราง รายละเอียด และ accessible label ของหมุดทุกจุด โดยชื่อยังใช้งานได้หากไฟล์ภาพโหลดไม่สำเร็จ

โลโก้ที่มีพื้นหลังโปร่งใสใช้พื้นรองเทาหินตาม LDS (#E5E9E6) ลดแสงจ้าของป้าย ส่วนภาพที่มีพื้นขาวติดมากับต้นฉบับยังคงพื้นเดิม การจัดกรอบให้กระชับเป็นการตัดพื้นที่ว่างรอบโลโก้ในชั้นนำเสนอ ไม่เปลี่ยนสี รูปทรง หรือ bytes ของภาพต้นฉบับ
