PostGis 3.4.0 Tiger2023状态数据新列geoid/geoidfq不在tiger.state中

问题描述 投票:0回答:1

我正在加载 2023 年老虎人口普查数据。我使用此输出

SELECT loader_generate_nation_script('sh')
作为起点。然后,我将 2022 年的参考资料更新为 2023 年,思考可能会发生什么变化:

创建 Tiger_staging 表,然后将其直接加载到 Tiger_data 表中:

 shp2pgsql -s 4269 -g the_geom -I {local_shp_filepath} tiger_staging.{table_name} > {sql_file_path}

输出此暂存表

-- tiger_staging.state definition

-- Drop table

-- DROP TABLE tiger_staging.state;

CREATE TABLE tiger_staging.state (
    gid serial4 NOT NULL,
    region varchar(2) NULL,
    division varchar(2) NULL,
    statefp varchar(2) NULL,
    statens varchar(8) NULL,
    geoid varchar(2) NULL, <----- hello this is a new guy on the block
    geoidfq varchar(11) NULL, <----- hello this is a new guy on the block
    stusps varchar(2) NULL,
    "name" varchar(100) NULL,
    lsad varchar(2) NULL,
    mtfcc varchar(5) NULL,
    funcstat varchar(1) NULL,
    aland float8 NULL,
    awater float8 NULL,
    intptlat varchar(11) NULL,
    intptlon varchar(12) NULL,
    the_geom public.geometry(multipolygon, 4269) NULL,
    CONSTRAINT state_pkey PRIMARY KEY (gid)
);
CREATE INDEX state_the_geom_idx ON tiger_staging.state USING gist (the_geom);

然后从

tiger_data.state
 创建 
tiger.data

CREATE TABLE tiger_data.state_all(CONSTRAINT pk_state_all PRIMARY KEY (statefp),CONSTRAINT uidx_state_all_stusps  UNIQUE (stusps), CONSTRAINT uidx_state_all_gid UNIQUE (gid) ) INHERITS(tiger.state); 

然后加载该数据(这是失败,因为列不匹配)

SELECT loader_load_staged_data(lower('state'), lower('state_all'));

附加信息:

SELECT postgis_full_version()
--
POSTGIS="3.4.0 0"

SELECT VERSION()
--
PostgreSQL 16.2

PostGIS 创建的

tiger.state

-- tiger.state definition

-- Drop table

-- DROP TABLE tiger.state;

CREATE TABLE tiger.state (
    gid serial4 NOT NULL,
    region varchar(2) NULL,
    division varchar(2) NULL,
    statefp varchar(2) NOT NULL,
    statens varchar(8) NULL,
    stusps varchar(2) NOT NULL,
    "name" varchar(100) NULL,
    lsad varchar(2) NULL,
    mtfcc varchar(5) NULL,
    funcstat varchar(1) NULL,
    aland int8 NULL,
    awater int8 NULL,
    intptlat varchar(11) NULL,
    intptlon varchar(12) NULL,
    the_geom public.geometry NULL,
    CONSTRAINT enforce_dims_the_geom CHECK ((st_ndims(the_geom) = 2)),
    CONSTRAINT enforce_geotype_the_geom CHECK (((geometrytype(the_geom) = 'MULTIPOLYGON'::text) OR (the_geom IS NULL))),
    CONSTRAINT enforce_srid_the_geom CHECK ((st_srid(the_geom) = 4269)),
    CONSTRAINT pk_tiger_state PRIMARY KEY (statefp),
    CONSTRAINT uidx_tiger_state_gid UNIQUE (gid),
    CONSTRAINT uidx_tiger_state_stusps UNIQUE (stusps)
);
CREATE INDEX idx_tiger_state_the_geom_gist ON tiger.state USING gist (the_geom);

这是我第一次加载老虎数据,接下来我打算迭代并加载县和 zcta520。

我想知道如何解决这个问题,第一个解决方案是恢复到 2022 年老虎数据,但为什么我应该这样做我应该能够使用最新的可用数据。第二个可行的解决方案是从 postgis 创建的

tiger.state
表中删除这两列,尽管这种解决方法似乎不正确。第三种可能的解决方案是更改
tiger_data.state
创建表语句
INHERITS (tiger.state)
->
INHERITS(tiger_data.state)
,但我没有经验知道我可能会在这里破坏什么。

postgresql postgis shapefile
1个回答
0
投票

我看到这个问题来自 2022 年,但考虑到这仍然是一个相关问题,具体取决于您尝试使用的数据年份......

要使用 2023 年以后的 Tiger 数据,您必须使用 PostgreSQL v 16+。 要使用 2022 年以后的 Tiger 数据,请使用早期版本的 PostgreSQL。

正如您所注意到的,列定义的更改破坏了相关的地理空间扩展。您使用的 PostgreSQL 版本将影响安装的 PostGIS 和相关扩展的版本。特别是,有基于先前版本的 PostGIS docker 镜像 (< 16) versions of PostgreSQL, and they will produce exactly the error seen above.

我可能建议在 dockerhub 上查找我在“therapeuticyoga/postgis-osm-geo-route-amd”下发布的与 TIGER 2023+ 数据兼容的图像。

© www.soinside.com 2019 - 2024. All rights reserved.