Vous créez des tampons unilatéraux ou des lignes parallèles dans PostGIS?


19

Je cherche un moyen de créer des tampons dits unilatéraux ou des lignes parallèles dans PostGIS. Exemple: 1. tampon, 2. d'un côté, 3. des deux côtés

texte alternatif

J'ai trouvé une discussion sur la liste de diffusion de 2009 et des informations sur sa mise en œuvre dans GEOS , mais rien sur l'état actuel de PostGIS.

Si la fonction n'est pas encore implémentée, connaissez-vous des solutions? Est-il possible de couper un côté d'un tampon normal?


Vous recherchez donc un équivalent de «décalage» dans AutoCAD?
dassouki

@dassouki: Désolé, je ne connais pas AutoCAD. Mais je pense que UMN Mapserver a une option "offset" qui ferait ce que je recherche.
underdark

Comment créer des tampons unilatéraux ou des lignes parallèles, à partir d'une table de 600 lignes?

Bienvenue sur le site. Si l'ensemble de réponses actuel ne résout pas votre problème, vous devez l'ouvrir en tant que nouvelle question (et indiquer pourquoi cette question ne répond pas à votre problème). Dans le format du site, ce n'est pas un endroit approprié pour faire cette déclaration, car ce n'est pas une réponse à la question.
Andy W

Comment puis-je créer des lignes parallèles dans une table MULTILINESTRING?
Felipe Costa

Réponses:


13

Les tampons unilatéraux appropriés étaient censés avoir atterri en 1.5 , mais il me semble que, même si les styles ont atterri, le côté n'a pas réussi. Il existe cependant un patchset actuel qui expose GEOSSingleSidedBufferet exécute le tampon unilatéral comme prévu , sous le nom ST_OffsetCurve; voir plus de détails dans le ticket # 413 . Utilisé:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Bonjour, j'essaie d'utiliser cette solution mais n'utilise pas souvent les postgis - J'ai testé cette requête et j'obtiens des valeurs de sortie, mais comment les traduire en fonctionnalités? Je veux juste les lignes à la fin, soit dans le cadre de la table d'origine, soit dans une nouvelle.C'est ma requête: sélectionnez ST_AsText (ST_OffsetCurve (test_data_.geom, test_data_.buffer_dis, 'join = mitre mitre_limit = 5.0')) from test_data_;
kflaw

@kflaw - vous l'avez probablement déjà compris, mais il vous suffit d'ajouter au début de la requête: "créer newtable sous" ou pour une vue, "créer ou remplacer view newview as" suivi de l'instruction select.
jbalk

4

Cet exemple crée deux polygones de chaque côté d'une chaîne de lignes. Il nécessite PostGIS 1.5 ou supérieur. Je ne sais pas dans quelle mesure il se débrouillera avec les lignes qui se croisent.

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

Il génère:

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

Le code fonctionne de la manière suivante:

  1. Mettez en mémoire tampon la chaîne de caractères à l'aide de ST_Buffer. Nous profitons de la fonctionnalité PostGIS 1.5 prenant en charge les embouts personnalisés afin de ne spécifier aucun embout du tout. Voir l'exemple ci-dessous.
  2. Divisez le polygone tamponné en deux, en utilisant la ligne d'origine, en utilisant la méthode documentée dans le wiki .

Cela pourrait être amélioré pour faire face aux lignes auto-croisantes à l'avenir.

Un linestring tamponné avec un embout plat


3

Cette modification crée deux chaînes de lignes parallèles. Il nécessite PostGIS 1.5 ou supérieur.

géométrie ou poids requis et distance dans le tampon


SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

-------------- RÉSULTATS

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"


0

Parce que je ne peux toujours pas commenter ici, j'ajoute cette réponse

SCW donne la meilleure réponse,

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

Mais ressemble au changement de fonction
http://postgis.refractions.net/docs/ST_OffsetCurve.html

Maintenant, le 'right'paramètre n'est plus nécessaire. L'utilisation d'une distance positive créera le côté gauche et une distance négative créera le côté droit

Aussi aucun patch nécessaire avec mes postgis

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.