123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- from sqlalchemy import Column, Integer, String, Text, Index, JSON
- from sqlalchemy.dialects.postgresql import JSONB
- from geoalchemy2 import Geometry
- from app.database import Base
- import json
- class County(Base):
- """县级行政区划地理数据表"""
- __tablename__ = "counties"
- # 字段映射字典
- FIELD_MAPPING = {
- '县名': 'name',
- '县代码': 'code',
- '市名': 'city_name',
- '市代码': 'city_code',
- '省名': 'province_name',
- '省代码': 'province_code'
- }
- # 反向映射字典
- REVERSE_FIELD_MAPPING = {v: k for k, v in FIELD_MAPPING.items()}
- id = Column(Integer, primary_key=True, index=True)
- name = Column(String(100), nullable=False, comment="县名")
- code = Column(Integer, comment="县代码")
- city_name = Column(String(100), comment="市名")
- city_code = Column(Integer, comment="市代码")
- province_name = Column(String(100), comment="省名")
- province_code = Column(Integer, comment="省代码")
-
- # 使用PostGIS的几何类型来存储多边形数据
- geometry = Column(Geometry('MULTIPOLYGON', srid=4326), nullable=False, comment="县级行政区划的几何数据")
-
- # 存储完整的GeoJSON数据
- geojson = Column(JSON, nullable=False, comment="完整的GeoJSON数据")
- # 显式定义索引
- __table_args__ = (
- Index('idx_counties_name', 'name'),
- Index('idx_counties_code', 'code'),
- Index('idx_counties_geometry', 'geometry', postgresql_using='gist'),
- )
- @classmethod
- def from_geojson_feature(cls, feature):
- """从GeoJSON Feature创建County实例
-
- Args:
- feature: GeoJSON Feature对象
-
- Returns:
- County: 新创建的County实例
- """
- properties = feature['properties']
- # 转换中文字段名为英文
- mapped_properties = {
- cls.FIELD_MAPPING.get(k, k): v
- for k, v in properties.items()
- }
-
- # 将GeoJSON geometry转换为WKT格式
- geometry = feature['geometry']
- wkt = f"SRID=4326;{json.dumps(geometry)}"
-
- # 创建实例
- county = cls(
- **mapped_properties,
- geometry=wkt,
- geojson=feature
- )
- return county
- def to_geojson_feature(self):
- """将County实例转换为GeoJSON Feature
-
- Returns:
- dict: GeoJSON Feature对象
- """
- properties = {}
- # 转换英文字段名为中文
- for eng_field, cn_field in self.REVERSE_FIELD_MAPPING.items():
- if hasattr(self, eng_field):
- properties[cn_field] = getattr(self, eng_field)
- return {
- 'type': 'Feature',
- 'properties': properties,
- 'geometry': self.geometry
- }
|