PostSQL编写经验(利用坐标值,创建空间要素字段)

1、创建数据表station,包含geometry字段:

CREATE TABLE "public"."station" (
  "name" varchar(20) COLLATE "pg_catalog"."default",
  "lat" float4,
  "lon" float4,
  "geometry" "public"."geometry",
  "code" varchar(4) COLLATE "pg_catalog"."default" NOT NULL,
  CONSTRAINT "station_pkey" PRIMARY KEY ("code")
)

2、程序创建表格记录时,应用SQL语句:

sSQL = "INSERT INTO station(lat, lon, geometry) " + \ 
       "VALUES(%f,%f, ST_GeomFromText('POINT(%f %f)', 4326))" \
       % (lat, lon, lon, lat)

代码用于python,注意最后创建点数据的经纬数值输入采用的是:(lon lat) 的方式

参数:4326,表示的是地理投影坐标系统,代表地理坐标系中的GCS_WGS_1984

3、如需增补空间坐标值,采用SQL语句:update

update station as a set geometry = 
        ST_GeomFromText('POINT('||(select lon || ' ' || lat from station 
        where id =a.id)||')', 4326) 

该语句可直接在Navicat for PostgreSQL中运行。

4、考虑跨越日经线的空间要素创建

跨越日经线,空间坐标发生变化,Lon值从179跳跃至-179,采取Line绘制的图形,会出现360度的连线,形成乱线。此时需采取多线方式创建空间要素,Lon值同正负的生成一条线段,多个线段组成一个空间要素MULTILINSTING,以确保使用同一属性数据,为一个空间实体。

        #########
        #lat、lon为点集数组
            
            lat1 = lat[0]
            lon1 = lon[0]
            pt_str = '(' + str(lon[0]) + ' ' + str(lat[0])
            iLen = len(lat)
            i = 1
            while(i< iLen):
                pt_str1 = str(lon[i]) + ' ' + str(lat[i])
                if  lon1 * lon[i] > 0:               #同为正负值,说明前后两点处于日经线同侧
                    pt_str += ',' + pt_str1
                else:
                    pt_str += '),(' + pt_str1
                lon1 = lon[i]
                i += 1
                                
            pt_str += ')'
            
            linestring = 'MULTILINESTRING('
            linestring = linestring + pt_str +')'
            
            sSQL = 'INSERT INTO line_table(code, StartTime,EndTime, geometry) ' + \
                   'VALUES (\'%s\', \'%s\', \'%s\', ST_GeomFromText(\'%s\', 4326))' \
                   % (code, start_time, end_time, linestring)
                   
            pgHelp.insert(sSQL)

 

你可能感兴趣的:(PostSQL编写经验(利用坐标值,创建空间要素字段))