Skip to Content.
Sympa Menu

freegeocz - Re: [FreeGeoCZ] umiestnenie polygonov na body

freegeocz AT fsv.cvut.cz

Předmět: Svobodná geoinformační infrastruktura

List archive

Re: [FreeGeoCZ] umiestnenie polygonov na body


Chronological Podle vláken 
  • From: vojtko <vojtko AT fns.uniba.sk>
  • To: Svobodná geoinformační infrastruktura <freegeocz AT fsv.cvut.cz>
  • Subject: Re: [FreeGeoCZ] umiestnenie polygonov na body
  • Date: Wed, 09 Sep 2009 17:08:29 +0200
  • List-archive: <http://mailman.fsv.cvut.cz/pipermail/freegeocz>
  • List-id: Svobodná geoinformační infrastruktura <freegeocz.fsv.cvut.cz>

Ahoj Juraj,

napisal som ti na tento problem skript v pythone (narychlo, je primitivny, ale bude sa aspon dobre citat). Je to trochu zlozitejsie, ale pre nedostatok casu, som to neurobil ako GRASS modul. Zial zatial vie urobit len severojuzne obdlzniky, ale ked sa nan pozriete nebude problem ho prepisat aj na iny ucel. Dufam, ze je to to, co potrebujes. Odskusal som ho, malo by to fungovat.

Postup je nasledovny:

1. export bodov z GRASSu cez prikaz v.out.ascii
v.out.ascii input=tvoje_body output=tvoje_body.grass format=standard

2. samotne vytvorenie obdlznikov urobi z tychto vyexportovanych suradnic bodov skript, ktory som nazval 'points.py'. prikaz je nasledovny:
points.py tvoje_body.grass vysledok vysledok (skript prijima tri argumenty, 1. je vstup dat, 2. a 3. su vystupy, ktore potrebujes)

3. po spusteni skriptu sa vytvoria dva nove subory v tvojom pracovnom adresari jeden sa bude volat vysledok.boundary a druhy vysledok.centroid

4. tieto dva subory treba importovat do GRASSu:
v.in.ascii input=vysledok.boundary output=tvoj_polygon format=standard
v.in.ascii input=vysledok.centroid output=tvoj_centroid format=standard

5. teraz je potrebne body z vrstvy tvoj_centroid pretypovat naozaj na centroidy (v skutocnosti su to points):
v.type input=tvoj_centroid output=tvoj_naozaj_centroid type=point,centroid

6. mame dva subory, jeden obsahuje polygony (tvoj_polygon) a druhy centroidy (tvoj_naoizaj_centroid), treba ich spojit:
v.patch input=tvoj_polygon,tvoj_naozaj_centroid output=finito

7. a nakoniec spojit vektor s databazovou tabulkou


Pekny den,


Rasto
'
Rastislav Vojtko
Dept. Geology & Palaeontology
Faculty of Natural Sciences
Comenius University
Mlynska dolina G
84215 Bratislava
Web:
http://www.aosg.yw.sk
http://geopaleo.fns.uniba.sk

Vojtech Honzik wrote:
Jestli máš rozchozený PostGIS, přijde mi to jako nejjednodušší
varianta rozšířit tabulku o další sloupec typu geometry, vzít WKT
polygon, který má střed kratší strany v počátku souřadnicového systému
a posunout (přetransformovat) ho pro každý záznam v tabulce na správné
místo.

UPDATE tabulka SET <polygon> =
ST_Translate(ST_GeomFromText('POLYGON(-1 0,-1 10,1 10,1 0, -1 0)'),
ST_X(<bod>), ST_Y(<bod>))

Případně i s natočením o daný úhel:
http://postgis.refractions.net/documentation/manual-1.4/ST_Affine.html

Vojta


2009/9/9 WochteR <wochter AT seznam.cz>:
Prave GRASS nevidim ako pouzitelny nastroj.
Pracu s vektormi nema az tak zvladnutu.

Skor rozmyslam nad QGIS a jeho pluginmi, popripade JUMP, KOSMO a podobne.
Alebo este priamo v postgise. Tu som zvazoval postup:
k existujucemu bodu vytvorit dalsi bod vzdialeny 20 metrov (dlhsia strana
obdlznika), potom tieto body spojit do linie a nasledne urobit buffer 1m.
Problem je v tom, ze buffer urobi na koncoch ciary samozrejme obluk. :-)

juraj




------------ Pôvodná správa ------------
Od: vojtko <vojtko AT fns.uniba.sk>
Predmet: Re: [FreeGeoCZ] umiestnenie polygonov na body
Dátum: 09.9.2009 13:57:07
----------------------------------------
Ahojte,

ja by som postupoval nasledovne:
1) export vektorovych bodov z GRASSu do grass ascii formatu (v.out.ascii),
2) potom by som napisal skript v pythone alebo tcl/tk, ktory by tie body
previedol na polygony o pozadovanej velkosti spolu so stitkami (chce to vsak
trochu casu);
3) importoval spat do GRASSU vysledok (v.in.ascii).
4) pripojil naspat databazovu tabulku na stitky polygonov noveho vektora.

Tento postup si vsak vyzaduje trochu casu, samozrejme, ze data musia byt v
metricke, nie v uhloch ako Lat/Long.
Bod cislo 2 nie je uplna brkacka.

Nie je mi zname, ze by to GRASS vedel urobit interne, ale budem rad, ak
niekto pozna postup. Celkom ma tento problemik zaujal.

Pekny den,

Rasto


Rastislav Vojtko
Dept. Geology & Palaeontology
Faculty of Natural Sciences
Comenius University
Mlynska dolina G
84215 Bratislava
Web:
http://www.aosg.yw.sk
http://geopaleo.fns.uniba.sk


MICHÁLEK Jan Mgr. wrote:
Vypadá to komplikovaně, no já bych si převedl body do JTSK, pak už by
to
komplikovaný nebylo, algorytmus bysem napsal v pythonu a hrnul to do
Postgisu
asi.
Je.

-----Original Message-----
From: freegeocz-bounces AT fsv.cvut.cz
[mailto:freegeocz-bounces AT fsv.cvut.cz] On
Behalf Of WochteR
Sent: Wednesday, September 09, 2009 8:53 AM
To: freegeo
Subject: [FreeGeoCZ] umiestnenie polygonov na body

Dobry den,
Obraciam sa na Vas s prosbou o radu.
Mam vrstvu bodov zameranych GPS. Potrebujem vytvorit novu vrstvu s
polygonmi
(maju to byt obdlzniky 2x10 metrov) ktorych stredy kratsej strany budu
presne na
danych bodoch. Orientacia dlzhsej strany by mala ist by default na sever
(lepsie
keby sa dal azimut zvolit), no neskor chcem este niektore otacat.
Mam ich vela a chcem sa vyhnut rucnemu vkladaniu.
Rozmyslal som nad vytiahnutim suradnice bodu vo formate WKT (postgis) a
potom
napisat algoritmus na konstrukciu obdlznika, ale je to dost komplikovane.
Poznate jednoduchsie riesenie prosim Vas?
Pozeral som sa na funkcie roznych GIS ako JUMP, KOSMO, WGIS... ale
nenasiel
som funkcionalitu ktora by mi pomohla.
Dakujem

Juraj
>
__________ Informace od ESET NOD32 Antivirus, verze databaze 4408
(20090908)
__________
Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz
> >
__________ Informace od ESET NOD32 Antivirus, verze databaze 4408
(20090908)
__________
Tuto zpravu proveril ESET NOD32 Antivirus.

http://www.eset.cz
>
_______________________________________________
FreeGeoCZ mailing list
FreeGeoCZ AT fsv.cvut.cz
http://mailman.fsv.cvut.cz/mailman/listinfo/freegeocz


_______________________________________________
FreeGeoCZ mailing list
FreeGeoCZ AT fsv.cvut.cz
http://mailman.fsv.cvut.cz/mailman/listinfo/freegeocz



_______________________________________________
FreeGeoCZ mailing list
FreeGeoCZ AT fsv.cvut.cz
http://mailman.fsv.cvut.cz/mailman/listinfo/freegeocz





#!/usr/bin/env python
################################################################################
# points-1.0.py --
#
# --- Points --- 
# (GRASS software) 
#
# Author: Rastislav Vojtko, PhD.
# RV: points.py v.1.0 Wed 09 Sep 2009 04:44:54 PM CEST 
# Comenius University, Bratislava, Slovakia
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# For more information see <http://www.gnu.org/licenses/>.
################################################################################

import sys
import string

# Funkcia zapise do suboru *.centroid data
def printc(pt5, cat, outfile_c):
    header = "P  1 1\n"
    outfile_c.write(header)
   
    x5 = pt5[0]
    y5 = pt5[1]
    x5 = " %s" % x5
    y5 = " %s\n" % y5
    line5 = x5 + y5
   
    outfile_c.write(line5)
    
    footer = " 1     %s         \n" % cat
    outfile_c.write(footer)
    

# Funkcia zapise do suboru *.boundary data
def printf(pt1, pt2, pt3, pt4, outfile):
    header = "B  5\n"
    outfile.write(header)
   
    x1 = pt1[0]
    y1 = pt1[1]
    x1 = " %s" % x1
    y1 = " %s\n" % y1
    line1 = x1 + y1
   
    outfile.write(line1)
   
    x2 = pt2[0]
    y2 = pt2[1]
    x2 = " %s" % x2
    y2 = " %s\n" % y2
    line2 = x2 + y2

    outfile.write(line2)
    
    x3 = pt3[0]
    y3 = pt3[1]
    x3 = " %s" % x3
    y3 = " %s\n" % y3
    line3 = x3 + y3

    outfile.write(line3)
    
    x4 = pt4[0]
    y4 = pt4[1]
    x4 = " %s" % x4
    y4 = " %s\n" % y4
    line4 = x4 + y4

    outfile.write(line4)
    outfile.write(line1)
    
# Funkcia vypocita pozadovane suradnice bodov obdlznika a centroidu            
def compute(x, y, cat, outfile, outfile_c):
    """Function computes angle between two nodes of along line"""
    
    # vypocita suradnice 1. bodu polygonu
    pt_x1 = (x - 1.0)
    pt_y1 = y
    pt1 = [ pt_x1, pt_y1 ]
    
    # vypocita suradnice 2. bodu polygonu
    pt_x2 = (x - 1.0)
    pt_y2 = (y + 10.0)
    pt2 = [ pt_x2, pt_y2 ]
    
    # vypocita suradnice 3. bodu polygonu
    pt_x3 = (x + 1.0)
    pt_y3 = (y + 10.0)
    pt3 = [ pt_x3, pt_y3 ]
    
    # vypocita suradnice 4. bodu polygonu
    pt_x4 = (x + 1.0)
    pt_y4 = (y)
    pt4 = [ pt_x4, pt_y4 ]
    
    # vypocita suradnice stredu polygonu"
    pt_x5 = (x)
    pt_y5 = (y + 5)
    pt5 = [ pt_x5, pt_y5 ]
    
    print "pt1 = ", pt1
    print "pt2 = ", pt2
    print "pt3 = ", pt3
    print "pt4 = ", pt4
    
    printf(pt1, pt2, pt3, pt4, outfile)
    printc(pt5, cat, outfile_c)

def rozdel(dict, outfile, outfile_c):
    print "Sme v compute function..."
    #print dict[1]
    #print dict[2]
    riadok1 = dict[1]
    riadok2 = dict[2]
    
    riadok1 = string.split(riadok1)
    riadok2 = string.split(riadok2)
    print riadok1
    print riadok2
    
    x = riadok1[0]
    y = riadok1[1]
    x = string.atof(x)
    y = string.atof(y)
    cat = riadok2[1]
    print x
    print y
    print cat
    compute(x, y, cat, outfile, outfile_c)

def scandata(infile, outfile, outfile_c):
    count = 0
    while True:
        line = infile.readline()
        
        count = count + 1
        if line == "":
            break
        if count < 11:
            continue
        else:
            a = string.strip(line)
            a = string.split(a, " ")

            if a[0] == 'P':
                dict = {}
                for p in range(2):
                    dict[p + 1] = infile.readline()

                rozdel(dict, outfile, outfile_c)    

def main(argv):
    print "Now, we are in python..."
    inputf = sys.argv[1]
    outputf = sys.argv[2]
    outputc =sys.argv[3]
    outputf = outputf + ".boundary"
    outputc = outputc + ".centroid"
    infile = open(inputf, 'r')
    outfile = open(outputf, 'w')
    outfile_c = open(outputc, 'w')
    print inputf
    print outputf
    print outputc
    
    out = """ORGANIZATION: 
DIGIT DATE: 
DIGIT NAME: 
MAP NAME: 
MAP DATE: 
MAP SCALE:    1
OTHER INFO:   
ZONE:         0
MAP THRESH:   0.000000
VERTI:
"""
    outfile.write(out)
    outfile_c.write(out)
    
    scandata(infile, outfile, outfile_c)
    infile.close()
    outfile.close()
    outfile_c.close()
    print "finish..."
    exit()


if __name__ == "__main__":
    main(sys.argv[1:])

## End of script (c), RV.




Archivace běží na MHonArc 2.6.19+.

Top of Page