[postgis-users] Getting dimensions of polygon sides
Bruce Rindahl
rindahl at lrcwe.com
Wed Jun 11 13:24:55 PDT 2008
Regina
After looking closely at your code I think you are doing exactly the
same as I suggested. I had to add the intermediate steps because my
method needed to find the line (distance) between 2 arbitrary points on
the polygon where you are always looking at two adjacent ones.
The only thing I see is your last line. Will changing :
FROM dnd.rems_survey ap ) p) As b
CROSS JOIN generate_series(1, 1000) n
WHERE n < b.nump;
to:
FROM dnd.rems_survey ap ) p) As b
CROSS JOIN generate_series(1, b.nump - 1) n;
be any faster? It should avoid a WHERE test in each iteration.
Bruce
Obe, Regina wrote:
> Bruce,
>
> Thanks for the below. I think it will take me a while to digest what
> you are doing. I think I learned a couple of things off the bat.
>
> 1) I may need the Right Hand Rule call since I was assuming things were
> already ordered correctly and my simple spot check seems to suggest that
> it is but you never know.
>
> 2) I'm confused between ST_Boundary and ST_ExteriorRing and when to use
> one over the other. I assume ST_Boundary takes into consideration holes
> where as ST_ExteriorRing just gives you the outer ring. Now I'm
> thinking about it I probably should replace my ST_Boundary with
> ST_ExteriorRing.
>
> In case anyone is curious. Attached is a snapshot of what I get when I
> use my simple 2 point assumption. It works in most cases but in others
> where they used more than 2 points to describe each corner, I get extra
> measures.
> Not the dimok is my ideal case and the dimalmost okay - see how I have
> an extra measure.
>
> You think Simplifying before I extract would fix that.
>
> My final query and updates look like this - seems to run fairly fast for
> the 5000 parcel list I care about.
>
> INSERT INTO assessing.parcdimstime_2008(pid, pid_year, the_geom)
> SELECT b.pid, b.pid_year, ST_MakeLine(ST_PointN(the_boundary,n),
> ST_PointN(the_boundary, n + 1)) As the_side
> FROM (SELECT pid, pid_year, the_boundary,
> ST_NumPoints(the_boundary) As nump
> FROM (SELECT ap.parcelid as pid, 2008 as pid_year,
> ST_Boundary(ap.the_geom) As
> the_boundary
> FROM dnd.rems_survey ap ) p) As b
> CROSS JOIN generate_series(1, 1000) n
> WHERE n < b.nump;
>
>
> UPDATE assessing.parcdimstime_2008 SET side_length =
> CAST(ST_Length(the_geom) As numeric(8,2));
>
>
>
More information about the postgis-users
mailing list