数据准备
接下来,我们用OceanBase创建一个新库gis,并且创建如下表:
DROP DATABASE IF EXISTS gis;
CREATE DATABASE gis;
USE gis;
-- 候选店铺表
CREATE TABLE candidate_shops (
id INT PRIMARY KEY AUTO_INCREMENT,
shop_name VARCHAR(100) NOT NULL,
area DECIMAL(6,2) COMMENT '店铺面积(㎡)',
lon DECIMAL(10,6) NOT NULL COMMENT '经度',
lat DECIMAL(10,6) NOT NULL COMMENT '纬度',
geom GEOMETRY NOT NULL COMMENT '空间点位',
rent_month DECIMAL(10,2) NOT NULL COMMENT '月租金(元)'
) COMMENT '奶茶店候选选址表';
-- 核心配套设施表
CREATE TABLE core_facilities (
id INT PRIMARY KEY AUTO_INCREMENT,
facility_name VARCHAR(100) NOT NULL,
type VARCHAR(50) NOT NULL COMMENT '配套类型:写字楼/大学城/住宅小区',
geom GEOMETRY NOT NULL COMMENT '空间点位',
facility_scale VARCHAR(20) NOT NULL COMMENT '规模:大型/中小型'
) COMMENT '客流核心配套表';
-- 竞品表
CREATE TABLE competitors (
id INT PRIMARY KEY AUTO_INCREMENT,
comp_name VARCHAR(100) NOT NULL,
geom GEOMETRY NOT NULL COMMENT '空间点位',
open_time DATETIME NOT NULL COMMENT '开业时间'
) COMMENT '同业态奶茶店竞品表';
-- 道路表
CREATE TABLE roads (
id INT PRIMARY KEY AUTO_INCREMENT,
road_name VARCHAR(100) NOT NULL,
road_level VARCHAR(20) NOT NULL COMMENT '道路等级:主干道/次干道/支路',
geom GEOMETRY NOT NULL COMMENT '道路几何图形'
) COMMENT '交通道路表';
-- 商圈表
CREATE TABLE business_circles (
id INT PRIMARY KEY AUTO_INCREMENT,
circle_name VARCHAR(100) NOT NULL,
circle_level VARCHAR(20) NOT NULL COMMENT '商圈等级:核心商圈/次级商圈/边缘商圈',
geom GEOMETRY NOT NULL COMMENT '商圈多边形'
) COMMENT '商圈范围表';
-- 财务参数表
CREATE TABLE finance_params (
param_id INT PRIMARY KEY AUTO_INCREMENT,
unit_price DECIMAL(5,2) NOT NULL COMMENT '客单价(元/单)',
gross_margin DECIMAL(3,2) NOT NULL COMMENT '毛利率(如0.75=75%)',
labor_month DECIMAL(10,2) NOT NULL COMMENT '月人工成本(元)',
water_electric_fixed DECIMAL(10,2) DEFAULT 2000 COMMENT '月固定水电成本(元)',
other_cost DECIMAL(10,2) DEFAULT 1000 COMMENT '月其他成本(元)',
amortize_months INT DEFAULT 12 COMMENT '加盟费摊销月数',
platform_commission DECIMAL(3,2) DEFAULT 0.2 COMMENT '外卖平台抽佣比例',
package_cost DECIMAL(3,2) DEFAULT 1.0 COMMENT '单均打包成本(元)'
) COMMENT '核心财务参数表';
-- 空间得分表
CREATE TABLE shop_spatial_score (
shop_id INT PRIMARY KEY,
shop_name VARCHAR(100) NOT NULL,
passenger_flow_score INT COMMENT '客流得分(0-40)',
competition_score INT COMMENT '竞争得分(0-30)',
traffic_score INT COMMENT '交通得分(0-30)',
total_spatial_score INT COMMENT '空间总得分(0-120)'
) COMMENT '店铺空间得分表';
-- 盈利测算表
CREATE TABLE shop_profit_calc (
shop_id INT PRIMARY KEY,
shop_name VARCHAR(100) NOT NULL,
total_spatial_score INT COMMENT '空间总得分',
monthly_revenue DECIMAL(12,2) COMMENT '预估月营收(元)',
monthly_cost DECIMAL(12,2) COMMENT '预估月总成本(元)',
monthly_profit DECIMAL(12,2) COMMENT '预估月净利润(元)',
payback_period DECIMAL(6,2) COMMENT '回本周期(月)',
profit_status VARCHAR(20) COMMENT '盈利状态',
priority VARCHAR(20) COMMENT '选址优先级'
) COMMENT '店铺盈利测算及选址结果表';
然后创建索引:
-- 候选店铺表索引
CREATE SPATIAL INDEX idx_candidate_geom ON candidate_shops(geom);
CREATE INDEX idx_candidate_rent ON candidate_shops(rent_month);
-- 核心配套表索引
CREATE SPATIAL INDEX idx_facilities_geom ON core_facilities(geom);
CREATE INDEX idx_facilities_type ON core_facilities(type, facility_scale);
-- 竞品表索引
CREATE SPATIAL INDEX idx_competitors_geom ON competitors(geom);
CREATE INDEX idx_competitors_time ON competitors(open_time);
-- 道路表索引
CREATE SPATIAL INDEX idx_roads_geom ON roads(geom);
CREATE INDEX idx_roads_level ON roads(road_level);
-- 商圈表索引
CREATE SPATIAL INDEX idx_circles_geom ON business_circles(geom);
CREATE INDEX idx_circles_level ON business_circles(circle_level);
插入数据:
-- 1. 候选店铺数据
INSERT INTO candidate_shops (id, shop_name, area, lon, lat, geom, rent_month) VALUES
-- 国贸:核心商圈+8个大型配套+8个竞品+主干道≤200米(空间分高,租金极高)
(1, '国贸银泰候选店', 25.50, 116.462832, 39.911898, ST_GeomFromText('POINT(116.462832 39.911898)'), 80000.00),
-- 三里屯:核心商圈+5个大型配套+10个竞品+主干道≤200米(空间分中,租金超高)
(2, '三里屯太古里候选店', 18.90, 116.451273, 39.924458, ST_GeomFromText('POINT(116.451273 39.924458)'), 90000.00),
-- 望京:次级商圈+4个大型配套+5个竞品+主干道≤200米(空间分中,租金中高)
(3, '望京SOHO候选店', 30.20, 116.492021, 39.996478, ST_GeomFromText('POINT(116.492021 39.996478)'), 45000.00),
-- 亚运村:次级商圈+2个大型配套+3个竞品+主干道201-500米(空间分低,租金中)
(4, '亚运村北辰候选店', 22.80, 116.402654, 40.008923, ST_GeomFromText('POINT(116.402654 40.008923)'), 30000.00),
-- 朝阳大悦城:边缘商圈+1个大型配套+2个竞品+主干道501-1000米(空间分极低,租金中低)
(5, '朝阳大悦城候选店', 28.60, 116.542715, 39.933761, ST_GeomFromText('POINT(116.542715 39.933761)'), 25000.00),
-- 常营:边缘商圈+0个大型配套+1个竞品+主干道>1000米(空间分最低,租金极低)
(6, '常营天街候选店', 32.50, 116.633947, 39.901285, ST_GeomFromText('POINT(116.633947 39.901285)'), 15000.00)
ON DUPLICATE KEY UPDATE rent_month = VALUES(rent_month);
-- 2. 核心配套数据(1km内配套数量差异:8/5/4/2/1/0)
INSERT INTO core_facilities (facility_name, type, geom, facility_scale) VALUES
-- 国贸1km内(8个大型配套)
('国贸三期写字楼', '写字楼', ST_GeomFromText('POINT(116.461254 39.910876)'), '大型'),
('国贸商城写字楼', '写字楼', ST_GeomFromText('POINT(116.463897 39.912145)'), '大型'),
('SKP写字楼', '写字楼', ST_GeomFromText('POINT(116.458765 39.923456)'), '大型'),
('建国门写字楼集群', '写字楼', ST_GeomFromText('POINT(116.478901 39.932145)'), '大型'),
('北京工业大学(国贸校区)', '大学城', ST_GeomFromText('POINT(116.481234 39.930876)'), '大型'),
('CBD住宅小区', '住宅小区', ST_GeomFromText('POINT(116.458765 39.925678)'), '大型'),
('永安里住宅小区', '住宅小区', ST_GeomFromText('POINT(116.468765 39.905678)'), '大型'),
('光华路住宅小区', '住宅小区', ST_GeomFromText('POINT(116.478765 39.915678)'), '大型'),
-- 三里屯1km内(5个大型配套)
('三里屯SOHO写字楼', '写字楼', ST_GeomFromText('POINT(116.448876 39.922987)'), '大型'),
('工体周边住宅小区', '住宅小区', ST_GeomFromText('POINT(116.446876 39.932987)'), '大型'),
('朝阳公园写字楼', '写字楼', ST_GeomFromText('POINT(116.466876 39.932987)'), '大型'),
('三里屯住宅小区', '住宅小区', ST_GeomFromText('POINT(116.441876 39.927987)'), '大型'),
('北京联合大学(三里屯校区)', '大学城', ST_GeomFromText('POINT(116.456876 39.937987)'), '大型'),
-- 望京1km内(4个大型配套)
('望京SOHO写字楼', '写字楼', ST_GeomFromText('POINT(116.490876 39.997123)'), '大型'),
('望京科技园写字楼', '写字楼', ST_GeomFromText('POINT(116.494876 39.995214)'), '大型'),
('望京新城住宅小区', '住宅小区', ST_GeomFromText('POINT(116.487876 39.992214)'), '大型'),
('中央美术学院', '大学城', ST_GeomFromText('POINT(116.497876 39.999214)'), '大型'),
-- 亚运村1km内(2个大型配套)
('亚运村写字楼', '写字楼', ST_GeomFromText('POINT(116.400876 40.008123)'), '大型'),
('亚运村住宅小区', '住宅小区', ST_GeomFromText('POINT(116.397876 40.012123)'), '大型'),
-- 朝阳大悦城1km内(1个大型配套)
('朝阳大悦城写字楼', '写字楼', ST_GeomFromText('POINT(116.540876 39.931123)'), '大型'),
-- 常营1km内(0个大型配套,仅中小型)
('常营社区服务中心', '住宅小区', ST_GeomFromText('POINT(116.630876 39.900876)'), '中小型');
-- 3. 竞品数据(500米内竞品数量差异:8/10/5/3/2/1)
INSERT INTO competitors (comp_name, geom, open_time) VALUES
-- 国贸500米内(8个竞品,含6个开业≥1年)
('蜜雪冰城国贸店', ST_GeomFromText('POINT(116.461987 39.911234)'), '2023-05-12'),
('古茗国贸二店', ST_GeomFromText('POINT(116.463876 39.913214)'), '2023-07-19'),
('喜茶国贸店', ST_GeomFromText('POINT(116.460987 39.912234)'), '2022-03-15'),
('奈雪国贸店', ST_GeomFromText('POINT(116.464876 39.910214)'), '2022-05-20'),
('CoCo国贸店', ST_GeomFromText('POINT(116.462987 39.914234)'), '2022-07-25'),
('益禾堂国贸店', ST_GeomFromText('POINT(116.460876 39.913214)'), '2024-01-10'),
('甜啦啦国贸店', ST_GeomFromText('POINT(116.465987 39.912234)'), '2024-03-18'),
('沪上阿姨国贸店', ST_GeomFromText('POINT(116.461876 39.910214)'), '2022-09-30'),
-- 三里屯500米内(10个竞品,含7个开业≥1年)
('喜茶三里屯店', ST_GeomFromText('POINT(116.449876 39.923987)'), '2021-11-15'),
('奈雪三里屯店', ST_GeomFromText('POINT(116.450876 39.925987)'), '2022-01-20'),
('古茗三里屯店', ST_GeomFromText('POINT(116.448876 39.924987)'), '2022-04-25'),
('CoCo三里屯店', ST_GeomFromText('POINT(116.452876 39.922987)'), '2022-06-30'),
('蜜雪冰城三里屯店', ST_GeomFromText('POINT(116.447876 39.926987)'), '2022-08-15'),
('益禾堂三里屯店', ST_GeomFromText('POINT(116.453876 39.923987)'), '2023-10-20'),
('甜啦啦三里屯店', ST_GeomFromText('POINT(116.446876 39.924987)'), '2023-12-25'),
('沪上阿姨三里屯店', ST_GeomFromText('POINT(116.451876 39.925987)'), '2024-02-10'),
('茶颜悦色三里屯快闪店', ST_GeomFromText('POINT(116.454876 39.922987)'), '2024-04-15'),
('书亦烧仙草三里屯店', ST_GeomFromText('POINT(116.445876 39.926987)'), '2022-10-30'),
-- 望京500米内(5个竞品,含3个开业≥1年)
('喜茶望京店', ST_GeomFromText('POINT(116.490876 39.997123)'), '2022-07-15'),
('奈雪望京店', ST_GeomFromText('POINT(116.491876 39.995214)'), '2022-09-20'),
('CoCo望京店', ST_GeomFromText('POINT(116.493876 39.996214)'), '2023-11-25'),
('蜜雪冰城望京店', ST_GeomFromText('POINT(116.492876 39.998214)'), '2024-01-30'),
('古茗望京店', ST_GeomFromText('POINT(116.489876 39.996214)'), '2022-11-15'),
-- 亚运村500米内(3个竞品,含2个开业≥1年)
('喜茶亚运村店', ST_GeomFromText('POINT(116.401876 40.008123)'), '2022-08-15'),
('CoCo亚运村店', ST_GeomFromText('POINT(116.400876 40.009123)'), '2023-10-20'),
('蜜雪冰城亚运村店', ST_GeomFromText('POINT(116.402876 40.007123)'), '2022-10-25'),
-- 朝阳大悦城500米内(2个竞品,含1个开业≥1年)
('喜茶朝阳大悦城店', ST_GeomFromText('POINT(116.541876 39.931123)'), '2022-09-15'),
('蜜雪冰城朝阳大悦城店', ST_GeomFromText('POINT(116.543876 39.932123)'), '2024-02-20'),
-- 常营500米内(1个竞品,开业<1年)
('蜜雪冰城常营店', ST_GeomFromText('POINT(116.632876 39.900876)'), '2024-03-15');
-- 4. 道路数据(匹配候选店距离梯度)
INSERT INTO roads (road_name, road_level, geom) VALUES
-- 主干道(匹配国贸/三里屯/望京≤200米,亚运村201-500米,朝阳大悦城501-1000米,常营>1000米)
('建国路', '主干道', ST_GeomFromText('LINESTRING(116.450000 39.900000, 116.468000 39.910000, 116.478000 39.920000)')),
('三里屯路', '主干道', ST_GeomFromText('LINESTRING(116.440000 39.920000, 116.455000 39.930000)')),
('望京街', '主干道', ST_GeomFromText('LINESTRING(116.480000 39.990000, 116.495000 40.000000)')),
('北四环东路', '主干道', ST_GeomFromText('LINESTRING(116.380000 40.000000, 116.400000 40.010000, 116.420000 40.020000)')),
('朝阳北路', '主干道', ST_GeomFromText('LINESTRING(116.530000 39.920000, 116.545000 39.930000, 116.560000 39.940000)')),
-- 次干道
('光华路', '次干道', ST_GeomFromText('LINESTRING(116.460000 39.915000, 116.480000 39.915000)'));
-- 5. 商圈数据(匹配候选店商圈等级)
INSERT INTO business_circles (circle_name, circle_level, geom) VALUES
('CBD核心商圈', '核心商圈', ST_GeomFromText('POLYGON((116.450000 39.900000, 116.480000 39.900000, 116.480000 39.930000, 116.450000 39.930000, 116.450000 39.900000))')),
('三里屯核心商圈', '核心商圈', ST_GeomFromText('POLYGON((116.440000 39.920000, 116.460000 39.920000, 116.460000 39.940000, 116.440000 39.940000, 116.440000 39.920000))')),
('望京次级商圈', '次级商圈', ST_GeomFromText('POLYGON((116.480000 39.980000, 116.500000 39.980000, 116.500000 40.010000, 116.480000 40.010000, 116.480000 39.980000))')),
('亚运村次级商圈', '次级商圈', ST_GeomFromText('POLYGON((116.390000 40.000000, 116.410000 40.000000, 116.410000 40.020000, 116.390000 40.020000, 116.390000 40.000000))')),
('朝阳大悦城边缘商圈', '边缘商圈', ST_GeomFromText('POLYGON((116.530000 39.920000, 116.550000 39.920000, 116.550000 39.940000, 116.530000 39.940000, 116.530000 39.920000))')),
('常营边缘商圈', '边缘商圈', ST_GeomFromText('POLYGON((116.620000 38.890000, 116.640000 38.890000, 116.640000 39.910000, 116.620000 39.910000, 116.620000 38.890000))'));
-- 6. 财务参数数据(不知名牌奶茶店通用值)
INSERT INTO finance_params (param_id, unit_price, gross_margin, labor_month, water_electric_fixed, other_cost, amortize_months, platform_commission, package_cost) VALUES
(1, 18.00, 0.75, 12000.00, 2500.00, 1500.00, 12, 0.20, 1.00)
ON DUPLICATE KEY UPDATE unit_price = VALUES(unit_price);