Cute Happy Ghost
본문 바로가기
QGIS·Geo

[postgis] ST_EXTENT 함수로 경계값(BBOX)찾기, ST_AsGeoJSON활용해 BBOX값 가져오기, openlayers에서 ST_EXTENT활용하기(parameter있을 때)

by JENN_tech7 2022. 6. 21.
728x90
SMALL

처음에 영역을 잡아주기 위해 ST_EXTENT라는 함수를 활용하려했지만 아래와 같이 BOX(..)로 떴다

그래서 스크립트단에서 BOX를 빼고 ,를 추가해보았지만 잘리지않았다..ㅎㅎ

JAVA단에서도 잘라보았지만 잘리긴하지만 좌표변환을 할때 이상한 숫자로 변환이됐다(아마 좌표로 인식하지못한듯)

쿼리에서도 잘라보았지만 max값은 변환이 되나 min값을 변환이되지않았다

심지어 변환된 max값도 이상한 좌표를 반환했다 ..ㅜ

BOX(126.88203089594275 37.57600491611421,126.96332878726157 37.65921538593538)

 

 

 

그래서 어쩔 수 없이 ST_XMax...등을 사용하여 각 extent값을 가져와서 아래와 같이 설정을 했다

하지만 데이터가 많을수록 쿼리가 느려지고 ST_EXTENT라는 쉬운 함수를 쓰고싶었다

한 줄이면 될 것을 저렇게 많이 써버리니까 맘에 들지 않았다...

<select id="getExtent"  resultType="java.util.HashMap" >
   select 
        (select ST_XMax(geom) as xmax FROM layer_emd_edge WHERE sig_cd = #{sig_cd}::varchar order by xmax desc limit 1)
        ,(select ST_YMax(geom) as ymax FROM layer_emd_edge WHERE  sig_cd =#{sig_cd}::varchar order by ymax desc limit 1)
        ,(select  ST_XMin(geom) as xmin FROM layer_emd_edge WHERE  sig_cd = #{sig_cd}::varchar order by xmin  limit 1)
        ,(select ST_YMin(geom) as ymin FROM layer_emd_edge WHERE  sig_cd = #{sig_cd}::varchar order by ymin limit 1)
    from layer_emd_edge limit 1
</select>

 

 

이것도 맘에 안들어...

map.getView().fit((ol.proj.transform([result[0].xmax, result[0].ymax, result[0].xmin, result[0].ymin], 'EPSG:4326', 'EPSG:3857'));

 

 

 

 

이것저것 해본결과 ST_AsGeoJSON이라는 것을 발견했다.

BBOX가 필요하니까 1번 옵션을 쓰면 된다고 생각했고 아래와 같이 실행했다

<select id="getExtent"  resultType="java.util.HashMap" >
      select ST_AsGeoJSON(ST_EXTENT(geom), 9, 1) from layer_sgg_edge 
         <trim prefix="WHERE" prefixOverrides="and">
            <if test="sido_cd  != null and sido_cd != ''">
                AND sido_cd = #{sido_cd }::varchar
            </if>
            <if test="sig_cd != null and sig_cd != ''">
                AND sig_cd = #{sig_cd}::varchar
            </if>
        </trim>
</select>

 

위와 같이 결과가 나왔으니 나는 bbox만 빼오면 됐었다!

ㅇ{ㅖ~~~~

 

 

 

최종 js소스

//value값 뽑기
....
var sido_cd = data.features[0].properties.sido_cd;

//영역지정
getSidoExtent(value);


function getSidoExtent(value){
    	$.ajax({ 
    		url: "/living/getExtent.do",
    		data: {sido_cd :sido_cd},
    		dataType : 'json',
    		type: 'post',
    		success: function(result){
				//result값을 json으로 parse시키고 bbox를 가져옴            
    			var extent = JSON.parse(result[0].st_asgeojson).bbox;
                
                //3857로 변환
    			var extent_3857 = ol.proj.transformExtent(extent, 'EPSG:4326', 'EPSG:3857');
                
                //fit 설정
                map.getView().fit(extent_3857);
    		},
    		error : function(err){
    			console.log("error");
    		}
    	});
    }

 

 

 

 

 

 

참고한 ref

https://postgis.net/docs/ST_Extent.html

 

ST_Extent

Name ST_Extent — Aggregate function that returns the bounding box of geometries. Synopsis box2d ST_Extent(geometry set geomfield); Description An aggregate function that returns a box2d bounding box that bounds a set of geometries. The bounding box coord

postgis.net

 

 

 

https://postgis.net/docs/ST_AsGeoJSON.html

 

ST_AsGeoJSON

Name ST_AsGeoJSON — Return a geometry as a GeoJSON element. Synopsis text ST_AsGeoJSON(record feature, text geomcolumnname, integer maxdecimaldigits=9, boolean pretty_bool=false); text ST_AsGeoJSON(geometry geom, integer maxdecimaldigits=9, integer optio

postgis.net

 

728x90
LIST

댓글