ZipLocate, geolocating邮政编码的API

分享于 

7分钟阅读

GitHub

  繁體 雙語
An API for geolocating zip codes
  • 源代码名称:ZipLocate
  • 源代码网址:http://www.github.com/nathancahill/ZipLocate
  • ZipLocate源代码文档
  • ZipLocate源代码下载
  • Git URL:
    git://www.github.com/nathancahill/ZipLocate.git
    Git Clone代码到本地:
    git clone http://www.github.com/nathancahill/ZipLocate
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/nathancahill/ZipLocate
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    ZipLocate

    用于邮政编码地理定位的API,可以在 ziplocate.us 使用。

    设置API的自承载版本:
    • 从Github克隆源
    
    $ git clone https://github.com/nathancahill/ZipLocate.git
    
    
    
    
    • 创建 virtualenv 并安装需求
    
    $ virtualenv env
    
    
    $ source env/bin/activate
    
    
    $ pip install -r requirements.txt
    
    
    
    
    • config.example.py 编辑为 config.py

    • 创建数据库模型

    
    >>> import config
    
    
    >>> from app import create_app, db
    
    
    >>> db.create_all(app=create_app(config))
    
    
    
    
    下载ZCTA5数据

    ZCTA5是基于美国人口普查数据的邮政编码多边形的近似。

    当前,在 2014 ( 502m ) 中:

    ftp://ftp2.census.gov/geo/tiger/TIGER2014/ZCTA5/tl_2014_us_zcta510.zip

    或者浏览这里的数据集,查找 ZCTA5 ( 邮政编码列表区域):

    https://www.census.gov/geo/maps-data/data/tiger-line.html

    基本邮编质心近似

    对于高级,基于人口密度的质心,跳到的高级节。

    • 安装 GDAL ( 在线可用教程)
    • 安装Fiona和 Shapely
    
    $ pip install Fiona
    
    
    $ pip install Shapely
    
    
    
    
    • 提取和导入ZCTA5数据
    
    $ unzip tl_2014_us_zcta510.zip
    
    
    $ python import.py tl_2014_us_zcta510.shp
    
    
    
    

    导入过程需要几分钟才能完成。

    高级邮政编码质心近似值

    对于邮编多边形中心的一个更有用的近似,我们可以用人口数据来估计群体中心点。 如果基本近似足够,你可以跳过这个复杂度,你可以跳过这个。

    • 安装Postgres和 PostGIS ( 联机可用教程)

    • 从最新美国人口普查中获取 block 级别的人口中心

    这里可用:https://www.census.gov/geo/reference/centersofpop.html。 block 级别是可用的最高粒度。

    
    $ wget http://www2.census.gov/geo/docs/reference/cenpop2010/blkgrp/CenPop2010_Mean_BG.txt
    
    
    
    
    • 在Postgres中创建地理参照 table 并在以下位置复制 CSV:
    
    > CREATE TABLE centers(statefp VARCHAR(2),
    
    
     countyfp VARCHAR(3),
    
    
     tractce VARCHAR(6),
    
    
     blkgrpce VARCHAR(1),
    
    
     population INTEGER,
    
    
     latitude FLOAT,
    
    
     longitude FLOAT);
    
    
    > COPY centers FROM 'CenPop2010_Mean_BG.txt' DELIMITER ',' CSV HEADER;
    
    
    > AddGeometryColumn('centers', 'point', '4326', 'POINT', 2);
    
    
    > UPDATE centers SET point = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326);
    
    
    > CREATE INDEX point_idx ON centers USING GIST(point);
    
    
    
    
    • 提取和导入ZCTA5数据
    
    $ unzip tl_2014_us_zcta510.zip
    
    
    $ shp2pgsql tl_2014_us_zcta510 | psql
    
    
    
    
    
    > AddGeometryColumn('tl_2014_us_zcta510', 'center', 4326, 'POINT', 2);
    
    
    > UpdateGeometrySRID('tl_2014_us_zcta510', 'geom', 4326);
    
    
    > CREATE INDEX zcta5_idx ON tl_2014_us_zcta510 USING GIST(geom);
    
    
    
    
    • 计算人口加权中心
    
    > UPDATE
    
    
     tl_2014_us_zcta510
    
    
     SET
    
    
     center = (
    
    
     SELECT
    
    
     ST_SetSRID(
    
    
     ST_Point(
    
    
     SUM(ST_X(point) * population)/NULLIF(SUM(population), 0),
    
    
     SUM(ST_Y(point) * population)/NULLIF(SUM(population), 0)
    
    
     ),
    
    
     4326)
    
    
    
     FROM (
    
    
     SELECT
    
    
     centers.point,
    
    
     centers.population
    
    
     FROM
    
    
     centers
    
    
     WHERE
    
    
     ST_Contains(tl_2014_us_zcta510.geom, centers.point)
    
    
     ) q
    
    
     );
    
    
    
    
    • 使用基本质心近似的邮政编码区域没有人口普查数据
    
    > UPDATE tl_2014_us_zcta510 set center = ST_Centroid(geom) where center is null;
    
    
    
    
    • 将数据复制到 api ( 一个 table 叫做'zip的模型中
    
    > INSERT INTO zip (zip, lat, lng) (
    
    
     SELECT zcta5ce10 AS zip, ST_Y(center) AS lat, ST_X(center) AS lng FROM tl_2014_us_zcta510
    
    
    );
    
    
    
    
    奖金:加拿大邮政编码

    我们只需要第 3列,邮政编码,纬度和经度,所以把它们切到 output.csv.

    
    $ wget http://geocoder.ca/onetimedownload/Canada.csv.gz
    
    
    $ gzip -d Canada.csv.gz
    
    
    $ cut -f 1,2,3 -d, Canada.csv> output.csv
    
    
    
    
    • 导入数据库
    
    > COPY zip from 'output.csv' DELIMITER ',' CSV;
    
    
    
    
    启动 API
    
    $ python cli.py
    
    
     * Running on http://127.0.0.1:5000/
    
    
    
    
    • 测试邮政编码查询

    http://127.0.0.1 :5000/api/v1/80301

    客户端

    • :https://github.com/jPaolantonio/ZipLocateiOS。
    • :https://github.com/ins0/php-simple-ziplocate。
    • go:: https://github.com/kureikain/go-ziplocate

    下载数据

    数据目录包含从CSV格式的上面 指令派生的ZCTA质心表。


    API  cod  GEO  ZIP  
    相关文章