Mevcut dizgilere köşe nasıl eklenir?


10

Sahip olursam

Linestring(1 2, 1 5, 1 9)

ve bir

Point(1 3)

Linestring'i birleştirebilecek ve sırayı koruyacak şekilde herhangi bir işlev var mı?

Linestring(1 2, 1 3, 1 5, 1 9)

Yani mevcut satırlara sadece köşe noktaları mı ekleyeceksiniz?
RK

evet, mevcut linestring'e vertice ekleyerek linestring ile sonuçlanır.
BorisT

Neden bunu yapman gerekiyor?
RK

Yanıtlar:


8

Eğer LineString sadece belirli bir noktaya en yakın konumda alt bölümlere bölünecekse, bunu istediğinizi yapabilirsiniz (LineString'i belirli bir noktaya en yakın noktaya böler ve daha sonra iki segmenti yeniden oluşturur)

SELECT ST_AsText(
         ST_LineMerge(
           ST_Union(
             ST_Line_Substring(line, 0, ST_Line_Locate_Point(line, point)),
             ST_Line_Substring(line, ST_Line_Locate_Point(line, point), 1)
       )))
FROM  ST_GeomFromText('Linestring(1 2, 1 5, 1 9)') as line, 
      ST_GeomFromText('Point(1 3)') as point;

Ancak, Point'inizin LineString'e yansıtılmaması gerekiyorsa, bu çalışmaz.


2

PostGIS, noktayı nereye ekleyeceğinizi belirtmeniz gerekse de bunu yapmanıza izin verecek ST_AddPoint'e sahiptir .

ST_AddPoint - Noktadan önce bir LineString öğesine nokta ekler (0 tabanlı dizin).

Örnekler:

--guarantee all linestrings in a table are closed
        --by adding the start point of each linestring to the end of the line string
        --only for those that are not closed
        UPDATE sometable
        SET the_geom = ST_AddPoint(the_geom, ST_StartPoint(the_geom))
        FROM sometable
        WHERE ST_IsClosed(the_geom) = false;

        --Adding point to a 2-d line
        SELECT ST_AsEWKT(ST_AddPoint(ST_GeomFromEWKT('LINESTRING(1 2, 1 5, 1 9)'), ST_MakePoint(1, 3), 1));

        --result
        st_asewkt
        ----------
        LINESTRING(1 2, 1 3, 1 5, 1 9)

evet, bu işlev için biliyorum ama yeni noktamı nereye koymalıyım bilmiyorum.
BorisT
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.