37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
"""Geocoding reference tables.
|
|
|
|
ZipGeo: offline US ZIP -> lat/lng/city/state/metro (source the full ~42k-row
|
|
dataset from SimpleMaps US ZIP or Census ZCTA; a small sample is seeded for tests).
|
|
Metro: SEO landing-page anchor (pages built in Phase 7; column wired now).
|
|
"""
|
|
from app.extensions import db
|
|
|
|
|
|
class ZipGeo(db.Model):
|
|
__tablename__ = "zip_geo"
|
|
|
|
zip = db.Column(db.String(12), primary_key=True)
|
|
city = db.Column(db.String(80), nullable=False)
|
|
state = db.Column(db.String(2), nullable=False, index=True)
|
|
lat = db.Column(db.Float, nullable=False)
|
|
lng = db.Column(db.Float, nullable=False)
|
|
metro = db.Column(db.String(80), nullable=True, index=True)
|
|
|
|
def __repr__(self):
|
|
return f"<ZipGeo {self.zip} {self.city},{self.state}>"
|
|
|
|
|
|
class Metro(db.Model):
|
|
__tablename__ = "metros"
|
|
|
|
id = db.Column(db.BigInteger().with_variant(db.Integer, "sqlite"),
|
|
primary_key=True, autoincrement=True)
|
|
slug = db.Column(db.String(80), unique=True, nullable=False, index=True)
|
|
name = db.Column(db.String(120), nullable=False)
|
|
state = db.Column(db.String(2), nullable=True)
|
|
center_lat = db.Column(db.Float, nullable=True)
|
|
center_lng = db.Column(db.Float, nullable=True)
|
|
|
|
def __repr__(self):
|
|
return f"<Metro {self.slug}>"
|