PC Ekspert Forum

PC Ekspert Forum (https://forum.pcekspert.com/index.php)
-   Web dizajn, programiranje i ostalo (https://forum.pcekspert.com/forumdisplay.php?f=39)
-   -   Crtanje koordinata u JAVI (https://forum.pcekspert.com/showthread.php?t=207606)

svebee 16.01.2011. 13:39

Crtanje koordinata u JAVI
 
Tražim neki primjer kako jednostavno smjestiti hrpu koordinata 44-46 LAT i 14-17 LON na ekran veličine 1280x720 px.

Ima li nekakva klasa koju samo ubacim i crtam do mile volje? :)

burki 17.01.2011. 09:10

Nisam siguran točno što ti treba ali možda je ovo to što tražiš...

svebee 17.01.2011. 12:00

Citiraj:

Autor burki (Post 1826379)
Nisam siguran točno što ti treba ali možda je ovo to što tražiš...

Nisam siguran kako bih to uklopio u svoju priču? Koliko vidim to je samo - točka (da ne trebam odvojeno upisivati x,y već samo unesem point). Može nešto detaljnije?

Konkretnije, trebam postupak prenošenja Merkatorove kartografske projekcije (mercator map projection) koje koristi Google Maps na "papir" 1280x720px i tako da 14 bude lijeva stranica, 17 desna stranica, 44 donja i 46 gornja stranica "papir" tj. tog mog okvira - tako da sve točke budu jednoliko raspoređene unutar tog okvira.

FitzTN 17.01.2011. 13:16

Ja sam se nešto osnovno s tim bavio, povlačio sam poligone iz baze podataka (sql) i iscrtavao, ali se nisam previše zezao pa sam sve prebacio u lokalni sustav ekrana i to je to bilo, ali vjerujem da se mogu postaviti granice sustava. Obrati pažnju na to da ti je ishodište ekrana gore ljevo i da su koordinatne osi obratne.

Mislim da bi ti sve skupa bilo lakše u pythonu s matplotlib, ali ako treba biti java, nek bude :D

Ti nisi moja struka, a stalno tu navračaš :)

Evo ti kod tog mog, nemoj se zgražat, nije mi se dalo optimirat :)

Code:

import java.awt.Graphics;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.sql.*;
import org.freehep.graphics2d.VectorGraphics;
import org.freehep.util.export.ExportDialog;

public class Baza extends JPanel {

  public void paint(Graphics g) {
//Povecanje prikaza
double povecanje=2;
boolean brp=true;
//Uredjivanje
Font arialV_B_I = new Font ("Arial",Font.BOLD | Font.ITALIC,18);
Font arialM_N = new Font ("Arial",Font.PLAIN, 14);
//Podaci za spajanje na bazu
String url="jdbc:postgresql://localhost/postgis2";
String kor_ime="postgres";
String sifra="sifra";
Connection baza=null;
Statement stmt=null;
ResultSet rset=null;
VectorGraphics vg = VectorGraphics.create(g);
//Spajanje na bazu
try {
    Class.forName("org.postgresql.Driver");
    baza=DriverManager.getConnection(url,kor_ime,sifra);
    stmt = baza.createStatement();
    rset = stmt.executeQuery("Select gid, contents, asText(the_geom) AS geom from zadatak.zadatak");
    while (rset.next()) {
        //Podaci iz baze
        Integer gid=rset.getInt("gid");
        String brojparcele=rset.getString("contents");
        String geometrija=rset.getString("geom");
        String geom1=geometrija.replace("POLYGON((", "");
        String geom2=geom1.replace("))", "");
        String geom2a=geom2.replace(" ", ",");
        String [] geom3=null;
        geom3=geom2a.split(",");
        int duljina=geom3.length;
        double Y []=new double [duljina/2];
        double X []=new double [duljina/2];
        int i=0;
        double doublegeom [] = new double [geom3.length];
        for (i=0;i             doublegeom [i] = Double.parseDouble(geom3[i]);
        }
        int j1=0;
        int k=0;
        for (int j=0;j             j1=j+1;
            Y[k]=doublegeom[j];
            X[k]=doublegeom[j1];
            k=k+1;
        }
        int br_tocaka=Y.length;
        double Y1 []=new double [Y.length];
        double X1 []=new double [X.length];
        for (int m=0;m             Y1[m]=(Y[m]-5575300)*povecanje; //Lokalno
        }
        for (int n=0;n             X1[n]=(-X[n]+5074250)*povecanje; //Lokalno


        }
        vg.drawPolygon(Y1, X1, br_tocaka);
        if (brp==true) {
        double Ydod=0;
        double Xdod=0;
        for (int o=0;o             Ydod=Ydod+Y1[o];
            Xdod=Xdod+X1[o];
        }
        double Ysr=(Ydod/br_tocaka)-(povecanje*5);
        double Xsr=(Xdod/br_tocaka)+(povecanje*5);
        vg.drawString(brojparcele,Ysr, Xsr);}
    }
    stmt.close();
    rset.close();
    baza.close();
          } catch (Exception e) {
            vg.setFont(arialV_B_I);
            vg.drawString("Problem: " + e.getMessage(),'-',100);
          ;}
    vg.setFont(arialV_B_I);
    vg.drawString("Vizualizacija podataka iz baze - zadatak 53", '=', 20);
    vg.setFont(arialM_N);
    vg.drawString("Podaci su prikazani u lokalnom koordinatnom sustavu", '=', 40);
    if (povecanje!=1 | povecanje<1) {vg.drawString("Povecanje ="+povecanje+" x",'=',80);}
        }


  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().add(new Baza());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(800,800);
    frame.setLocationRelativeTo(null);
    frame.setTitle("Vizualizacija podataka iz PostgreSQL baze podataka");
    frame.setVisible(true);
  }
}


svebee 17.01.2011. 15:48

Citiraj:

Autor FitzTN (Post 1826498)
Mislim da bi ti sve skupa bilo lakše u pythonu s matplotlib, ali ako treba biti java, nek bude :D

ma zato jer nju od tih svih čudesa najbolje poznajem. mogao bi i nešto drugo, ali rokovi mi i nisu baš bajni :)

ako imaš nešto jednostavno što funkcionira u Pythonu/nečemu/bilo čemu... i da mogu samo "prepisati" svoje podatke unutra dapače :D

budem sad ovo pogledao...

FitzTN 17.01.2011. 16:44

Evo u pythonu, osakatio sam jedan drugi program pa probaj :D

Code:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# numpy
import numpy as np
# matplotlib plotting module
import matplotlib.pyplot as plt
# matplotlib colormap module
#import matplotlib.cm as cm
# Matplotlib font manager
#import matplotlib.font_manager as font_manager
y,x=np.loadtxt('tocke.csv',unpack=True,skiprows=0,delimiter=';',usecols=(0,1),comments='#')
graf = plt.figure(1)
#ax = graf.subplots_adjust(hspace=0.5)
#ax = graf.add_subplot(211)
ax = graf.add_subplot(111)
naslov=unicode("Naslov", "utf-8")
xoznaka=unicode("Geografska dužina (°)", "utf-8")
yoznaka=unicode("Geografska širina (°)", "utf-8")
ax.set_title(naslov,family='serif', size='xx-large')
ax.set_xlim(14, 17)
ax.set_ylim(44, 46)
plt.xlabel(xoznaka, size='large')
plt.ylabel(yoznaka, size='large')
plt.scatter(x, y, marker='s', cmap=None, norm=None,vmin=None, vmax=None, alpha=None, linewidths=0,verts=None, figure='f')
#plt.colorbar()
graf = plt.figure(1)
imeslike="proba"
#plt.savefig(''+imeslike+'.png', dpi=100)
plt.show()

Ovo je ulazna csv datoteka:
45.79880556;15.95253333
45.811575;15.97999444
45.79605278;15.95978333
45.80117222;15.94436944
45.80418889;15.94404167
45.79942778;15.92806667
45.77279444;15.98232778
45.82538889;15.93781667
45.81059722;15.89199167
45.81554444;15.97460556
45.81335833;15.96428333
45.80950278;15.98833889
45.81265556;15.97189722
45.80843889;16.01774444
45.82552222;15.97701944
45.81465278;15.97399444
45.77222778;15.98186667
45.8059;16.02977778
45.80943611;15.96471667


A ovo je izlazna slika

svebee 20.01.2011. 00:04

Ja imam .txt fajl (8MB) sa mrežom - bilo bi dobro kad bi program bio .exe pa samo u njegov folder popikam svoje "resource" fajlove (mrežu i sam algoritam) i samo pokrenem.

Znači imam .exe fajl/nešto što pokrenem :), u njegov folder strpam "mreza.txt" i "algoritam.txt" čiji je sastav ovakav

45.815189,15.933249-45.815189,15.933249
45.815189,15.933249-45.813824,15.928523
45.815189,15.933249-45.812246,15.920229
45.815189,15.933249-45.811674,15.917397
45.815189,15.933249-45.813024,15.905263
45.815189,15.933249-45.811543,15.905375
...

Kad pokrenem program on povuče mrežu i nacrta je (sive tanke linije) iz datoteke mreza.txt. Nakon toga počinje crtati algoritam iz datoteke algoritam.txt - znači ista stvar kao i mreža ide red po red i crta linije - ovaj puta crvenom debljom bojom samo (da se vidi razlika). Ako naiđe na liniju koja počinje sa "G" npr. (kao "gotovo") crta ju samo zeleno. Ako počinje sa F crta debelo zeleno. Znači stalno ista stvar - samo druge boje/debljine. Nakon svake linije napravi delaj od 100ms npr. da se vidi kako algoritam "radi".

mreza.txt = sve linije tanke sive
algoritam.txt obicna linija = deblje crvene crte
algoritam.txt linija pocinje sa slovom G = tanke zelene linije
algoritam.txt linija pocinje sa F = debela zelena linija

Nešto tipa ovo (naravno ne 3D i te fičre) - http://www.youtube.com/watch?v=jjpmuZEbtok


Ima li zainteresiranih? Plaćam :)

mc_fish 21.01.2011. 00:36

kolko?:)

platforma? python? java? nekaj mobilnog
do kad?

dodatna funkcionalnost?
edit: output?

mora li pratit strukturu citanja predefiniranu?

Bubba 21.01.2011. 20:57

Citiraj:

Autor svebee (Post 1828715)
Ima li zainteresiranih? Plaćam :)

Moram priznati da te nisam tocno skuzio sto hoces jer sam samo bacio oko na brzinu, ali ako ti treba algoritam kako spojiti dvije koordinate linijom (apstrakciju prijenosa GPS koordinate na "papir" rijesi samostalno), prouci Bresenham's line algorithm.

svebee 22.01.2011. 01:17

Citiraj:

Autor Bubba (Post 1830289)
(apstrakciju prijenosa GPS koordinate na "papir" rijesi samostalno)

stvar je vremena :)

Citiraj:

Autor Bubba (Post 1830289)

siguran sam da bih nešto iskombinirao, kako sam uspio srediti i Dijsktru (čak sa dinamičkim izračunom bridova :D) vjerujem da bi se i ovdje nešto iskombiniralo. međutim, isto kao i gore...nemam vremena se trenutno time baviti :(

Bubba 22.01.2011. 11:33

Citiraj:

Autor svebee (Post 1830413)
stvar je vremena :)

siguran sam da bih nešto iskombinirao, kako sam uspio srediti i Dijsktru (čak sa dinamičkim izračunom bridova :D) vjerujem da bi se i ovdje nešto iskombiniralo. međutim, isto kao i gore...nemam vremena se trenutno time baviti :(

E jebi ga, 'oce ti to tako u zivotu... :)

BTW, mozda ce ti ovo pomoci, samo sto je vezano direktno za Google Maps API (to sam osobno koristio, i iako te jos uvijek ne shvatjam sto ti tocno treba, meni je za GPS pracenje i crtanje povijesti ruta posluzilo savrseno elegantno).

http://www.svennerberg.com/2008/10/p...n-google-maps/
http://econym.org.uk/gmap/

HTH.

FitzTN 22.01.2011. 13:10

Njemu treba da mu prvo iscrta sve linije u jednoj boji (recimo sve ulice). To nije problem, mala modifikacija mog koda gore gdje umjesto plt.scatter ide plt.plot(x,y) gdje su x,y matrice koordinata početnih i završnih točaka linije.

Nakon toga mu treba drugi dio program, koji će preko tih linija iscrtavati druge, redom, s malom pauzom i tako da mjenjaju boje. Algoritam koji traži put od neke točke/čvora, preko tih "ulica" iz prvog dijela do druge točke. :D

Vjerujem da nije neki problem sve skupa iako mu je struktura samih ulaznih podataka malo zeznuta :D Ne kužim zašto 2 vrste delimitera, zašto je boja na početku i tako hehe :-)

Samo je pitanje vremena :)

svebee 22.01.2011. 15:08

Citiraj:

Autor FitzTN (Post 1830631)
Vjerujem da nije neki problem sve skupa iako mu je struktura samih ulaznih podataka malo zeznuta :D Ne kužim zašto 2 vrste delimitera, zašto je boja na početku i tako hehe :-)

što se tiče toga mogu ja to promijeniti, meni ne igra neku ulogu - kako tom programu za crtanje najbolje paše mogu poriktati ulazne parametre/podatke.

inače ovo da - to mi treba :) prvo obična mreža, pa linije u bojama preko te iste mreže (vidi video iznad) :beer:

svebee 26.01.2011. 23:33

bump, zar nitko ne zna ovo sklepati? :D

mc_fish 28.01.2011. 14:03

majstore mogu ti ja u cem god oces, samo sam tolko bez vremena da ak se mos stript jos tj-2 inace 4 money i prek noci


Sva vremena su GMT +2. Sada je 18:32.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 1999-2024 PC Ekspert - Sva prava pridržana ISSN 1334-2940
Ad Management by RedTyger