- 一个点(POINT)
- 一条线(LINESTRING)
- 一个多边形(POLYGON)
- 一个内含空洞的多边形(POLYGON with a hole)
- 一个图形集合(COLLECTION)
PostGIS提供了两张表用于追踪和报告数据库中的几何图形
- spatial_ref_sys:定义了数据库已知的所有空间参照系统
- geometry_columns:数据库中所有空间数据表的描述信息
- ST_GeometryType(geometry) —— 返回几何图形的类型
- ST_NDims(geometry) —— 返回几何图形的维数
- ST_SRID(geometry) —— 返回几何图形的空间参考标识码
-
ST_GeomFromText(text, srid) —— 返回geometry
-
ST_AsText(geometry) —— 返回text
-
ST_AsGeoJSON(geometry) —— 返回text
-
ST_GeomFromGeoJSON(geomJSON) —— 返回geometry
-
ST_Perimeter(geometry) —— 返回几何面周长
-
ST_Area(geometry) —— 返回几何面面积
- ST_Intersects、ST_Crosses、ST_Overlaps测试几何图形是否相交
如果两个图形有相同的部分,即如果它们的边界或内部相交,则ST_Intersects(geometry A, geometry B)返回TRUE。intersect测试可以使用空间索引。
SELECT name, boroname
FROM nyc_neighborhoods
WHERE ST_Intersects(geom, ST_GeomFromText('POINT(583571 4506714)',4326));
controller层:
@PostMapping
public MapElement addMapElement(@RequestBody MapElement mapElement){
mapElement.setGeoStr(geometryToString(mapElement.getLongitude(), mapElement.getLatitude()));
mapService.addMapElement(mapElement);
Long id = mapElement.getId();
return mapService.findById(id);
}
private String geometryToString(double longitude, double latitude){
String geoStr = "POINT" + "(" + longitude + " " + latitude + ")";
return geoStr;
}
mybatis层:
<insert id="addMapElement" parameterType="com.honorzhang.postgresql.model.MapElement" useGeneratedKeys="true" keyProperty="id">
<!--PostgreSQL所特有的生成自增主键的方法-->
<selectKey keyProperty="id" resultType="Long" order="BEFORE">
SELECT nextval('map_elements_id_seq'::regclass)
</selectKey>
insert into map_elements(name, longitude, latitude, element_location)
values (#{name}, #{longitude}, #{latitude}, ST_GeomFromGeoJSON(#{geoStr}))
</insert>
controller层:
@DeleteMapping("/{id}")
public Boolean deleteMapElement(@PathVariable Long id){
Boolean deleteMapElementSuccess = true;
try{
mapService.deleteMapElement(id);
}catch (Exception e){
log.info("删除失败:" + e);
deleteMapElementSuccess = false;
}
return deleteMapElementSuccess;
}
mybatis层:
<delete id="deleteMapElement" parameterType="Long">
delete from map_elements where id = #{id}
</delete>
controller层:
@PutMapping()
public MapElement updateMapElement(@RequestBody MapElement mapElement){
mapElement.setGeoStr(geometryToString(mapElement.getLongitude(), mapElement.getLatitude()));
mapService.updateMapElement(mapElement);
Long id = mapElement.getId();
return mapService.findById(id);
}
mybatis层:
<update id="updateMapElement" parameterType="com.honorzhang.postgresql.model.MapElement" useGeneratedKeys="true" keyProperty="id" >
UPDATE map_elements
<trim prefix="set" suffixOverrides=",">
<if test="name!=null">name = #{name},</if>
<if test="longitude!=null">longitude = #{longitude},</if>
<if test="latitude!=null">latitude = #{latitude},</if>
<if test="geoStr!=null">element_location = ST_GeomFromText(#{geoStr}, 4326),</if>
</trim>
WHERE id=#{id}
</update>