Suntuubi-palvelussa käytetään evästeitä. Palvelua käyttämällä hyväksyt evästeiden käytön. Lue lisää. OK
2930311234
567891011
12131415161718
19202122232425
262728293012

RSS

 Päällekkäiset alueet (OverLapping Polygons)
14.09.2018 08:04 | IGLIES 615 / IL

OverLapping Polygons

 

Joskus tulee tilanteita, että AutoCAD kuva täytyy saada tähän perinteisempään paikkatieto maailmaan.
Tässä yhteydessä usein huomaa, että topologiassa on runsaasti toivomisen varaa ja tämän lisäksi
alueiden muodostus hyvin harvoin menee niinkuin pitäisi.

Tässä käsitellään Kangasalan kaupungin Ruutanan kaupunginosan aineistoa.
Ensin luetaan Ruutana_KAAVALUE.dxf tiedosto sisään ArcMapiin ja valitaan siitä suoraan
Polygon muotoinen aineisto putkelle.

Add Data

Käyttömukavuuden kannalta kannattaa aineisto puskea suoraan tietokantamuotoon
Rotan oikealla  Data: Export Data...

Ja luetaan kama putkelle.

 

Seuraavaksi analysoidaan päällekkäiset alueet. Erinomainen työkalu tähän löytyy
Menu: Geoprocessing: Intersect

Ja lykätään aineisto samaan tietokantaan edellisen kanssa. Tässä tapauksessa
tulokseksi tuli taso nimeltä KAAVALUE_Intersect

 

toc

Täydellisessä maailmassa tämä olisi tässä, mutta ei. Myös alla (tai päällä) oleva 
Alue on mukana kuviotiedostossa, joten nyt tarvitsee vähän askarella, että saadaan se
mitä lähdettiin hakemaan.

 

kartta

 

Ihan ensimmäiseksi täytyy valita KAAVALUE nuo päällekäiset (tai alekkaiset) featuret
ja poistaa ne sotkemasta.
Menu: Selection: Select By Location...
Tärkein on kohta
Spatial selection method for target layer feature(s): are identical to the source layer feature
(Toimii toki parillaa muullakin tavalla, mutta tämä riittää tähän).

sbl

 

 

Sitten editointi päälle ja poistetaan nuo valitut kohteet tasolta KAAVALUE.

 

Nyt meillä on mielenkiintoinen ongelma. On taso KAAVALUE_Intersect jossa on kaksi
päällekkäistä aluetta. Ongelma siis vain lisääntyi, joten haetaan siihen helpotusta
ja yhdistetään kaksi tasoa attribuutti tauluilla toisiinsa. Tällä meidän pitäisi
päästä tilanteeseen jossa meillä on tasolla KAAVALUE_Intersect ne tasot, jotka
halutaan säilyttää ja ne, jotka kuuluu tasoon KAAVALUE ja nämä halutaan taas
poistaa.

Napautetaan rotan oikealla tasoa KAAVALUE_Intersect ja valitaan
Joins and Relates: Join...

join

Ja jos katsotaan KAAVALUE_Intersect attribuuttitaulua huomataan, että
vain noilla alueilla, jotka löytyy tasosta KAAVALUE, on tietoa.
(OBJECTID kenttä on osassa tyhjä <null>)

taulu

Joten tehdään tauluun kysely (Select By Attributes)
ja kirjoitetaan ehdoksi KAAVALUE.OBJECTID IS NOT NULL

 

kysely

 

Tuloksena on halutut rivit.
Laitetaan editointi päälle ja poistetaan valitut rivit pois kuleksimasta.
Sitten poistetaan taulun liitokset.
Joins and Relates:Remove All Joins.

Sitten vielä vähän kosmetiikaa. Tehdään reikiä alueeseen KAAVALUE
ArcToolbox: Analysis Tools: Overlay: Erase

erase

Saadaan pois nuo päällekkäisyydet. Ja viimeisenä silauksena lykätään nuo
puuttuvat alueet takaisin alkuperäiseen.
ArcToolbox: Data Management Tools: General: Append

Ja VOT, siinä meillä on alueet ilman päällekäisyyksiä.

lopputulos

#GIS #ArcMap #OverLapping_Polygons

 

 


 - IGLIES 615 / IL | Kommentoi



 Henkilötunnuksen (Sotu) käsittely SQL lauseessa
22.11.2017 14:32 | -GisFather

Joskus herää siihen karmeaa tosiasiaan, että kaikki ei tietokannan puolella
ole mennytkään kuin Suomifilmissä. Päivitysrutiini on saattanut rikkoa tietueita.
Hyvässä lykyssä riviltä ei löydy muuta kuin SoTu, eli sosiaaliturvatunnus.
Ja silloin kun tämä huomataan, pitäisi samaan aikaan raapia kasaan tilastotietoa
perustuen ikään, sukupuoleen ja syntymävuoteen (eli ikäluokkiin). Kiirellä kuten
aina.

Onneksi SoTu pitää sisällään kaiken tarvittavan ja ennen isoa urakkaa tietokannan
puolella voi hoitaa alta pois nuo tilastot.

Sukupuoli selviää Sotun viimeisestä merkistä, tämä on miessukupuolella pariton numero
ja naissukupuolella vastaavasti parillinen. Näistä uusista kotkotuksista sitten tiedä
mitä ne tulee olemaan, joten se jää nähtäksi, eikö se SoTu muutenkin ole menossa uusiksi
SoTen lailla. Tietokantaan yleensä lykätään uroksille merkki tai numero 1 ja sille toiselle
sitten loogisesti 2, joten tarvittava SQL-lause näyttää jotenkin tältä.

UPDATE TAULU SET Sukupuoli=
 CASE 
  WHEN (SUBSTR(HETU,10,1) % 2)= 1 THEN 1
  ELSE 2
 END;

Nyt pitäisi kaikilla taulun tietueilla olla sukupuoli, lukuun ottamatta trans etc...


Seuraavaksi askarrellaan tauluun syntymävuosi, että ikäluokkien käsittely tulisi
astetta oikeammaksi. tarvittava SQL-aluse tämän toteuttamiseen voisi olla seuraava.

UPDATE TAULU SET syntymavuosi=
 CASE SUBSTR(HETU,7,1)
  WHEN 'A' THEN CAST('20'|| SUBSTR(HETU,5,2) AS Integer)
  WHEN '-' THEN CAST('19'|| SUBSTR(HETU,5,2)  AS Integer)
  ELSE CAST('18'|| SUBSTR(HETU,5,2)  AS Integer)
 END

Tässä huomioidaan vuosisata jolla ko. henkilö on syntynyt. 1800-luvulla
syntyneillä erotusmerkki on +, 1900 luvulla taas - ja nämä nykyisen kuluvan
vuosisadan tuotteiden erotusmerkki on A.


Ikä on sitten mutkikkaampi. Sen laskeminen on paljon kiinni tietokannasta.
Itse olen ihastunut SQLite (SpatiaLite) tietokantaan sen näppäryyden takia.
Ja siinä lasku menee tällä lailla.

SELECT HETU,ika,syntymavuosi,
 (strftime('%Y','now') -
  strftime('%Y',
                CASE SUBSTR(HETU,7,1)
                 WHEN 'A' THEN CAST('20'|| SUBSTR(HETU,5,2) AS Integer)
                 WHEN '-' THEN CAST('19'|| SUBSTR(HETU,5,2)  AS Integer)
                 ELSE CAST('18'|| SUBSTR(HETU,5,2)  AS Integer)
                END
           || '-' || SUBSTR(HETU,3,2) || '-' || SUBSTR(HETU,1,2))) - 
  (strftime('%m-%d', 'now') < 
   strftime('%m-%d',
                CASE SUBSTR(HETU,7,1)
                 WHEN 'A' THEN CAST('20'|| SUBSTR(HETU,5,2) AS Integer)
                 WHEN '-' THEN CAST('19'|| SUBSTR(HETU,5,2)  AS Integer)
                 ELSE CAST('18'|| SUBSTR(HETU,5,2)  AS Integer)
                END
           || '-' || SUBSTR(HETU,3,2) || '-' || SUBSTR(HETU,1,2))) AS Erotus
FROM TAULU;
-- Nyt vasta katsellaan ja vertaillaan !!

Aikamoinen hirviö, joten suosittelen vakavasti laskemaan erilliseen kenttään
syntymäajan päivämäärät muodossa YYYY-MM-DD esim. näin.

Ensin kenttä:
ALTER TABLE "TAULU"
ADD COLUMN 'syntyma_aikaD';

ja sitten lykätään kama sisään SoTuun perustuen.

UPDATE "TAULU" 
SET 'syntyma_aikaD' =
 CASE SUBSTR(HETU,7,1)
  WHEN 'A' THEN CAST('20'|| SUBSTR(HETU,5,2) AS Integer)
  WHEN '-' THEN CAST('19'|| SUBSTR(HETU,5,2)  AS Integer)
  ELSE CAST('18'|| SUBSTR(HETU,5,2)  AS Integer)
 END
  || '-' || SUBSTR(HETU,3,2) || '-' || SUBSTR(HETU,1,2);


Nyt sitten on mukavampi laskea ikä sarakkeeseen syntyma_aikaD.
UPDATE TAULU SET ika=
  (strftime('%Y','now') - strftime('%Y',syntyma_aikaD)) -
  (strftime('%m-%d', 'now') <  strftime('%m-%d',syntyma_aikaD));

Iän laskemiseen löytyy netistä paljon esimerkkejä ja vain jokunen toimii oikein,
joten kannattaa olla todella tarkkana. Itse käytin Oraclessa pitkään lausetta

trunc(to_number(SYSDATE - to_date(kp.c_syntaika,'yyyymmdd')) / 365.25) AS "Ika",

vain nyt huomatakseni, että se laskee suunnilleen oikein.

 


 - -GisFather | Kommentoi



 SBAS Satelliittien NMEA ja PRN koodit
11.07.2017 15:00 | GISBAS

Kattavaa listausta en suoraan löytänyt ja itseäni ainakin kiinnostaa että mikä

halvatun 36 se siinä Garminin näytöllä vilkuttaa.

 

SBAS Constellation
  PRN NMEA Satellite Name Longitude  
EGNOS 120 33 Inmarsat 3-F2 (AOR-E) 15.5° W  
EGNOS 121 34 Inmarsat 3-F5 (EMEA) 53.0° W SBAS Backup
WAAS 122 35 Inmarsat 3-F4 (AOR-W) 142.0° W phased out
EGNOS 123 36 Astra 5B 31.5° E  
EGNOS 124 37 ESA (Artemis) 21.5° E  
SDCM 125 38 Luch-5B 16.0° W  
EGNOS 126 39 Inmarsat 4-F2 (IOR-W) 25.0° E  
GAGAN 127 40 GSAT-8 55.0° E  
GAGAN 128 41 GSAT-10 83.0° E  
MSAS 129 42 MTSAT 1R 140.0° E  
EGNOS 130 43 Inmarsat 4-F1 63.0° E  
EGNOS 131 44 Inmarsat 3-F1 (IOR) 64.5° E retired (Indian Ocean)
GAGAN 132 45 GSAT-12 83.0° E  
WAAS 133 46 Immarsat 4-F3 (AMR) 98.0° W  
WAAS 134 47 Inmarsat 3-F3 (POR) 178.0° E phased out
WAAS 135 48 Galaxy XV 133.0° W  
EGNOS 136 49 SES-5 5.0° E testing (a.k.a. Sirius 5 or Astra 4B)
MSAS 137 50 MTSAT 2 145.0° E  
WAAS 138 51 Anik F1R (Telesat) 107.3° W  
GAGAN 139 52 GSAT-15 93.5 E  
SDCM 140 53 Luch-5V 95.0° E  
SDCM 141 54 Luch-5A 167.0° E  
QZSS 183 96 QZS-1    

Pidätän kaikki oikeudet omiin virheisiini.


 - GISBAS | Kommentoi



 Python,ArcPy ja HTTP POST
23.12.2016 10:39 | Merry GIStmas

Jeesasin vähän kaveria ja tätä se poiki. Tietokannan nimi PPCT kertoo jotain,
mutta ei siitä sen enempää. Tässä on tarkoitus seurata latukoneen ja latuverkon
välistä suhdetta. Jos latukone käy ladun likellä, saadaan siitä leima lopulta
latuverkon viivalle. Latuverkon suhteen on tärkeätä käyttää Line tyyppiä.
Tutkitusti liian pitkä PolyLine viivaketju saastuu pitkältä matkalta
koneen käydessä vieressä antaen virheellistä informaatiota.

Tässä kokonaisuudessa tarvitaan Pythonia, ArcPytä ja FileGeodatabasea.
Runsasta pioneerihenkeä ja rautaisia hermoja unohtamatta.
ArcPy rutiinit on jalostettu ArcGIS ModelBuilderia käyttäen, mutta kolmeen
ensimmäiseen osioon riittää kyllä ihan perus Python.

Pakettia lähdetään kasaamaan siten, että ensin lähetetään koneiden
seurantatietoa ylläpitävälle palvelimelle kirjekuori XML muotoisena
tietona HTTP POST protokollaa käyttäen. Oikean muotoista kysely vastaan
palvelin palauttaa tietoa kysellystä koneesta XML muotoisena tiedostona.
Joka sitten luetaan XML muotoisesta sekä TXT että CSV muotoiseksi tiedostoksi.
TXT ihan siksi että QGIS lukee sen suoraan ja laittaa koordinaatitkin automaattisesti.
CSV puolestaan luetaan tauluksi tietokantaan, josta sitten rakennellaan Point
muotoista dataa Featureksi. Tämä vielä projektoidaan GK-24 muotoon, ihan vaan
siksi, että sitä on turvallisempi ja mukavampi käsitellä.

Kun Pisteet sitten yhdistetään latuverkkoon SpatialJoinia käyttäen,
saadaan aikaleima viivalle. Nämä leiman saaneet päivitetään
sitten tietokannassa erilliselle tasolle ja näin meillä on sitten
latuverkossa aikaleimalla päivitettyä Dataa. Tästä eteenpäin
voidaa asiaa jalostaa vaikka mihinkä suuntaan. Esim.
palveluksi julkaistuna ArcGIS for Serverillä tms.


Ensiksi scripti jolla kasataan kirjekuoria lähetettäväksi palvelimelle.
Tästä muodostuu konelistan mukainen tiedosto(t) mallia kone.xml
sekä konelista.txt C:\TEMP hakemistoon. Heikkoutena tässä voi pitää sitä,
että salasana on "poltettu" koodiin itseensä. Ainakin tietoturvan kannalta.

# ************************************************************************
# 0_Luo_XML.py
# Scripti suoritetaan jarjestyksessa I.
# - Muodostetaan XML parametritiedostot C:\TEMP\*.xml
#   Joita kaytetaan aineiston kyselyyn rajapinnasta
# #Rutiinissa lasketaan nykyinen UTC aika ja se - 30 min.
# - Rutiinissa lasketaan aika vuorokauden alusta ja siita lahdetaan.
# 
# 02.12.2016 IGLIES615 / IL
# ************************************************************************
import datetime

print "0_Luo_XML.py:"
print "-------------"

kt="C:/TEMP/konelista.txt"
ulos = open(kt, "w")
#Haettavien koneiden ID tiedot. Tama on ainoa paikka missa niita yllapidetaan.
konelista = [001,002,007,N3]


for kone in konelista:
 print>>ulos, kone
ulos.close()

for kone in konelista:
 UlosTiedosto= "C:/TEMP/" + str(kone) + ".xml"
 ulos = open(UlosTiedosto, "w")

 print "Kirjoitetaan Tiedosto: " + UlosTiedosto 
 #<?xml version="1.0"?>
 ulos.write("<?xml version="+'"1.0"'+'?>'+ "\n")
 ulos.write("<InstantDataRequest>"+ "\n")
 ulos.write(" <RequestHeader>"+ "\n")
 ulos.write("  <UserName>Anonymous</UserName>" + "\n")
 ulos.write("  <Password>aikiHakaT</Password>" + "\n")
 ulos.write(" </RequestHeader>"+ "\n")
 ulos.write(" <EventDataRequest>"+ "\n")
 ulos.write("  <Target>devices</Target>" + "\n")
 ulos.write("  <DeviceId>" + str(kone) + "</DeviceId>" + "\n")
  ulos.write("  <StartTime>"+ (datetime.datetime.utcnow()- datetime.timedelta(minutes=30)).strftime("%Y-%m-%d" + "T00:00:00") +"</StartTime>" + "\n")
 ulos.write("  <EndTime>" + datetime.datetime.utcnow().strftime("%Y-%m-%d" + 'T' + "%H:%M:%S") + "</EndTime>" + "\n")
 ulos.write(" </EventDataRequest>" + "\n")
 ulos.write("</InstantDataRequest>" + "\n")
 ulos.close()
 print ""

Sitten sinne rajapintaan kyselemään konelistan mukaisesti generoitujen tiedostojen
mukaan. Jos Dataa tulee, pusketaan se rajapinta.xml tiedostoon.

# ************************************************************************
# 1_Lue_Rajapinta.py
# Scripti suoritetaan jarjestyksessa II.
# - Poistaa C:\TEMP hakemiston tiedostot tulos.csv tulos.txt rajapinta.xml
# - Hakee Dataa rajapinnasta
# - Tarkistaa onko uutta dataa.
#
# Rakennetta muutettu 19.12.2106 
# 01.12.2016 IGLIES615 / IL
# ************************************************************************

import httplib,xml.dom.minidom,os.path,sys,glob

print "1_Lue.py: Luetaan Dataa rajapinnasta..."
print "---------------------------------------"

#Tarkistetaan ohjelman jatkuvauuden kannalta tarkea ensimmainen tiedosto
if not os.path.exists("C:/TEMP/konelista.txt"):
 print "AlustusTiedostoa: konelista ei ole"
 sys.exit()

#Poistetaan vanhat tiedostot sotkemasta, jos niita esiintyy
if os.path.isfile("C:/TEMP/tulos.csv"):
 print "Poistettu: tulos.csv"
 os.remove("C:/TEMP/tulos.csv")
if os.path.exists("C:/TEMP/tulos.txt"):
 print "Poistettu: tulos.txt"
 os.remove("C:/TEMP/tulos.txt")

rajapinta=open("c:/temp/rajapinta.xml", "a")

#Luetaan konelista tiedostosta
konelista = open("C:/TEMP/konelista.txt").read().splitlines()
print "Koneita ajossa: " + str(len(konelista))

#Haetaan dataa PPCT rajapinnasta ja samalla poistetaan *.xml tiedosto tarpeettomana
HOST = "track.anonymous.NoWhere.org"
API_URL = "/Instant/readXML"


for kone in konelista:
 Tiedosto  = "C:/TEMP/" + str(kone) + ".xml"
 TiedostoS = "C:/TEMP/" + str(kone) + "S.xml"
 t = open(Tiedosto, "r")
 ts = open(TiedostoS,"w")

 request = open(Tiedosto, "r").read()

 webservice = httplib.HTTPS(HOST)
 webservice.putrequest("POST", API_URL)
 webservice.putheader("Host", HOST)
 webservice.putheader("Content-length", "%d" % len(request))
 webservice.endheaders()
 webservice.send(request)

 statuscode, statusmessage, header = webservice.getreply()

 result = webservice.getfile().read()
 resultxml = xml.dom.minidom.parseString(result)

 print "Tiedosto: " + Tiedosto
  
 ts.write(resultxml.toprettyxml())
 t.close()
 ts.close()
 os.remove("C:/TEMP/" + str(kone) + ".xml")

lista= glob.glob("C:/TEMP/*S.xml")


#Tarkistetaan xml tiedostojen koko, jos dataa on enemman kuin 10 rivia
#Data kirjoitetaan rajapinta.xml tiedostoon.
#Lopuksi tuhotaan kaikki *S.xml tiedostot sotkemasta
for tied in lista:
 RiviLKM=1
 lasketaan = open(tied, "r")
 while True:
  rivi = lasketaan.readline()
  RiviLKM += 1
  if rivi == "":
   break
 lasketaan.close()
 #print tied
 #print RiviLKM

 if RiviLKM > 10:
  #print lasketaan
  lasketaan = open(tied, "r")
  while True:
   rivi = lasketaan.readline()
   rajapinta.write(rivi)
   if rivi == "":
    break
  lasketaan.close()
 os.remove(str(tied))

rajapinta.close()


#Poistetaan Konelista
os.remove("C:/TEMP/konelista.txt")
print ""

Jos rajapinnasta saatiin dataa, sitä työstämään. Muodostetaan XML muotoisesta
tiedostosta sekä CSV, että TXT muotoiset tiedostot C:\TEMP hakemistoon.
Rutiinia voi pienellä jalostuksella käyttää myös muuhun XML muotoisen datan manipulointiin.

# ************************************************************************
# 2_Luo_TXT_ja_CSV.py
# Scripti suoritetaan jarjestyksessa III.
# - Kasataan tiedosto tulos.txt XML => txt. Samalla muodostuu tulos.csv
#
# HUOM! Tarkista tiedoston rajapinta.xml alkurivi. On vaihdellut 5 ja 6
# valilla.
#
# 01.12.2016 IGLIES615 / IL
# ************************************************************************

import arcpy,sys,shutil,os.path

print "2_Luo_TXT_ja_CSV.py:"
print "--------------------"

if not os.path.exists("C:/TEMP/rajapinta.xml"):
 print "Tiedostoa: rajapinta.xml ei ole"
 sys.exit()

#Tarkistaan onko tajapinta.xml kelvollista dataa
RajaLKM = 1
raja = open("C:/TEMP/rajapinta.xml", "r")

while True:
 rivi = raja.readline()
 RajaLKM += 1
 if rivi == "":
  break

raja.close()

if RajaLKM < 30:
 print "Tiedosto: rajapinta.xml ei sisalla uutta Dataa"
 os.remove("C:/TEMP/rajapinta.xml")
 sys.exit()

sisaan = open("C:/TEMP/rajapinta.xml", "r")
ulos = open("C:/TEMP/tulos.csv", "w")
ulosT = open("C:/TEMP/tulos.txt", "w")

# Suodatetaan alkurivit pois, nayttaa alkavan vasta rivilta 5
RiviLKM=1
otsikot=""
kentta_lista=[]

#Ensin kasataan otsikot
while True:
 rivi = sisaan.readline().strip()
 rivi = rivi.replace('%','')
 RiviLKM += 1
 if RiviLKM > 6:
  if rivi[0:2] == '</':
   break
  else:
   #Kenoviiva tyhjan arvon lopussa, suodatetaan se pois.
   arvo=rivi[1:rivi.find(">")]
   if arvo.find('/') > 0:
      otsikot=otsikot+'"' + arvo[0:len(arvo)-1] + '"' + ','
      kentta_lista.append(arvo)
      continue
   #Kasataan sarakeotskot.
   kentta_lista.append(arvo)
   otsikot=otsikot+'"' + arvo + '"' + ','
   

#Otsikot ulos tiedostoon, suodatetaan viimeisena oleva pilkku pois.
ulos.write(otsikot[0:len(otsikot)-1]+'\n')
ulosT.write(otsikot[0:len(otsikot)-1]+'\n')
#print kentta_lista
print "IN: Otsikot tulostettu"

arvo=""
sisaan.close()

# Sitten lahdetaan kasaamaan tiedoston sisaltamia arvoja pilkuilla eroitettuna
sisaan = open("C:/TEMP/rajapinta.xml", "r")

steppi=len(kentta_lista)
laskuri=0
ulos_rivi=''

while True:
 rivi = sisaan.readline().strip()
 #Korvataan ResponseCode kentassa olevaa sotkua
 rivi = rivi.replace('%3B',';')

 if ((rivi[1:].find('>') > 0) and (rivi.find("</") > 0)) or rivi.endswith("/>") :
  arvo=rivi[1:]
  arvo=arvo[arvo.find('>') +1 :arvo.find("</")]
  ulos_rivi=ulos_rivi + arvo + ','
  laskuri=laskuri+1

  if laskuri == steppi:
   laskuri=0
   #print ulos_rivi
   ulos.write(ulos_rivi[0:len(ulos_rivi) -1] + "\n")
   ulosT.write(ulos_rivi[0:len(ulos_rivi) -1] + "\n")
   ulos_rivi=''


 if rivi == "":
  break

print "IN: AllDone"
sisaan.close()
ulos.close()
ulosT.close()
print ""

Luodaan edellytykset jatkolle. Tosin vain pisteiden osalta.

# -*- coding: cp1252 -*-
# ************************************************************************
# 3_Luo_ja_Alusta_DB.py
# Luotu 14.12.2016 siksi etta rajapinta ja etenkin Table2Table alkoivat
# tekemaan kummallisia temppuja. Tama helpompi askeltaa
#
# Scripti suoritetaan jarjestyksessa IV.
# - Luodaan FileGDB PPCT.gdb         jos sita ei ole olemassa
# - Luodaan Pist_WGS84 Feature Class jos sita ei ole olemassa
# - Poistetaan taulu Pist_WGS84S jos se on olemassa, silla uusi luodaan
#   tiedostosta tulos.csv   
# - Tyhjennetaan Feature taulu Pist_WGS84 mikali tietokanta ja feature on olemassa
# - Luodaan taulun Pist_WGS84 rakenne mikali tarpeen
#
#
# 14.12.2016 IGLIES615 / IL
# ************************************************************************


import arcpy,sys,shutil,os.path

# Local variables:
TEMP = "C:\\TEMP"
LatuData = "F:\\NoMansLand\\LatuData"
PPCT_gdb = "F:\\NoMansLand\\LatuData\\PPCT.gdb"
Pist_WGS84 = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_WGS84"
tulos_csv = "C:\\TEMP\\tulos.csv"
Pist_WGS84S = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_WGS84S"


print "3_Luo_ja_Alusta_DB.py:"
print "----------------------"

if not os.path.exists("C:/TEMP/rajapinta.xml"):
 print "Tiedostoa: rajapinta.xml ei ole"
 sys.exit()

#Luodaan aineisto saatujen tiedostojen hyodyntamista varten
#jos ne eivat ole olemassa.

# Process: Create File GDB
if not arcpy.Exists(PPCT_gdb):
 print "Process: Create File GDB"
 arcpy.CreateFileGDB_management(LatuData, "PPCT", "CURRENT")

# Process: Create Feature Class
if not arcpy.Exists(Pist_WGS84):
 print "Process: Create " + Pist_WGS84 + "Feature Class"
 arcpy.CreateFeatureclass_management(PPCT_gdb, "Pist_WGS84", "POINT", "", "DISABLED", "ENABLED", "GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]];-400 -400 1000000000;-100000 10000;-100000 10000;8,98315284119522E-09;0,001;0,001;IsHighPrecision", "", "0", "0", "0")

if arcpy.Exists(Pist_WGS84S):
 print "Process: Poistetaan taulu " + Pist_WGS84S
 arcpy.Delete_management(Pist_WGS84S, "Table")
 

if arcpy.Exists(tulos_csv):
 print "Process: Table to Table: Luodaan tiedostosta tulos.csv taulu Pist_WGS84S"
 arcpy.TableToTable_conversion(tulos_csv, PPCT_gdb, "Pist_WGS84S", "", "DeviceId \"DeviceId\" true true false 10 Text 0 0 ,First,#,C:\\TEMP\\tulos.csv,DeviceId,-1,-1;TimeStamp \"TimeStamp\" true true false 30 Text 0 0 ,First,#,C:\\TEMP\\tulos.csv,TimeStamp,-1,-1;Latitude \"Latitude\" true true false 30 Text 0 0 ,First,#,C:\\TEMP\\tulos.csv,Latitude,-1,-1;Longitude \"Longitude\" true true false 30 Text 0 0 ,First,#,C:\\TEMP\\tulos.csv,Longitude,-1,-1;Velocity \"Velocity\" true true false 8 Double 0 0 ,First,#,C:\\TEMP\\tulos.csv,Velocity,-1,-1;Heading \"Heading\" true true false 8 Double 0 0 ,First,#,C:\\TEMP\\tulos.csv,Heading,-1,-1,C:\\TEMP\\tulos.csv,Heading,-1,-1;Altitude \"Altitude\" true true false 30 Text 0 0 ,First,#,C:\\TEMP\\tulos.csv,Altitude,-1,-1,C:\\TEMP\\tulos.csv,Altitude,-1,-1;ResponseParameter \"ResponseParameter\" true true false 30 Text 0 0 ,First,#,C:\\TEMP\\tulos.csv,ResponseParameter,-1,-1;SrcTime \"SrcTime\" true true false 30 Text 0 0 ,First,#,C:\\TEMP\\tulos.csv,SrcTime,-1,-1", "")
 
if arcpy.Exists(Pist_WGS84):
 print "Process: Tyhjennetaan Feature taulu" + Pist_WGS84
 arcpy.DeleteRows_management(Pist_WGS84)

fc = Pist_WGS84S
rivit = arcpy.SearchCursor(fc)
desc = arcpy.Describe(fc)

#kentat taulusta Pist_WGS84S
kentat = desc.fields
#Poimitaan OBJECTID kentta pois listasta
kentat = kentat[1:]

point = arcpy.Point()
cursor = arcpy.InsertCursor(Pist_WGS84)
feat = cursor.newRow()

#Viitataan luodun Featuren kenttiin ja tutkitaan niiden maara
fc2=Pist_WGS84
dK4=arcpy.Describe(fc2)
ken=dK4.fields

if len(ken) < 3:
 # Luodaan taulun rakenne
 for i in kentat:
  arcpy.AddField_management(Pist_WGS84, i.name, i.type, "", "", i.length)
 #print 'K40127: Kentat luotu tauluun ' +K40127 + ' Taulusta  ' + fc
 print "Process: Pist_WGS84: Kentat luotu tauluun Pist_WGS84 Taulusta Pist_WGS84S"

print "Process: Alusta luotu ja/tai siivottu"
print ""

Pisteiden muodostamisen vuoro.

 

# ************************************************************************
# 4_TeePisteet_Tietokantaan.py
# Scripti suoritetaan jarjestyksessa V.
# - Luodaan pisteteema Pist_WGS84 taulusta Pist_WGS84S
# - Suoritetaan projektiomuunnos WGS84 => ETRS 1989 GK24FIN
#   Saadaan tulokseksi Pist_GK24
#
#
# 01.12.2016 IGLIES615 / IL
# ************************************************************************

import arcpy,os.path

print "4_TeePisteet_Tietokantaan.py:"
print "-----------------------------"

if not os.path.exists("C:/TEMP/rajapinta.xml"):
 print "Tiedostoa: rajapinta.xml ei ole"
 sys.exit()

# Local variables:
Pist_WGS84 = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_WGS84"
Pist_WGS84S = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_WGS84S"
Pist_GK24 = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24"
fc = Pist_WGS84S
rivit = arcpy.SearchCursor(fc)
desc = arcpy.Describe(fc)

point = arcpy.Point()
cursor = arcpy.InsertCursor(Pist_WGS84)
feat = cursor.newRow()

#kentat taulusta Pist_WGS84S
kentat = desc.fields
#Poimitaan OBJECTID kentta pois listasta
kentat = kentat[1:]
rivi=0

for rivi in rivit:
 #Luodaan Pistemainen Feature
 # X ja Y ja Z
 point.X = rivi.Longitude
 point.Y = rivi.Latitude
 point.Z = rivi.Altitude
 # Luodaan Point objekti perustuen noihin saatuihin pisteisiin
 # Ja suodatetaan NollaRoska pois tiedoista
 if (point.X < 10 or point.Y < 10):
  continue
 else:
  print "Muodostetaan: ",rivi.DeviceID,point.X,point.Y,point.Z,rivi.SrcTime
  point = arcpy.Point(point.X,point.Y,point.Z)

 feat.shape = point
 for kentta in kentat:
   arvo=rivi.getValue(kentta.name)
   feat.setValue(kentta.name,arvo)
 cursor.insertRow(feat)
del cursor,rivi


if arcpy.Exists(Pist_GK24):
 print "Process: Poistetaan taulu " +Pist_GK24
 arcpy.Delete_management(Pist_GK24, "Table")

# Process: Project
print "Projektoidaan: " + Pist_WGS84 + " Koordinaatistoon ETRS 1989 GK24FIN"
arcpy.Project_management(Pist_WGS84, Pist_GK24, "PROJCS['ETRS_1989_GK24FIN',GEOGCS['GCS_ETRS_1989',DATUM['D_ETRS_1989',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Gauss_Kruger'],PARAMETER['False_Easting',24500000.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',24.0],PARAMETER['Scale_Factor',1.0],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0]]", "ETRS_1989_To_WGS_1984", "GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]", "NO_PRESERVE_SHAPE", "")
print ""


( Päivitetty: 23.12.2016 12:02 )

 - Merry GIStmas | Kommentoi



 Python,ArcPy ja HTTP POST (Osa.II)
23.12.2016 11:43 | Merry GIStmas vielä toistamiseen

Kentät siedettävämpään muotoon.

# ************************************************************************
# 5_Kasittele_Kentat.py
# Scripti suoritetaan jarjestyksessa VI.
# - Kasitellaan Pist_GK24 tason kenttia
# - Konvertoidaan tekstimuotiset kentat Date tyypin kentiksi
# - Suoritetaan laskutoimitus jossa alunperin UTC aikaa olevat arvot
#   lasketaan paikalista aikaa osoittaviksi eli UTC+2
#
# 02.12.2016 IGLIES615 / IL
# ************************************************************************

# Import arcpy module
import arcpy,sys,os.path

print "5_Kasittele_Kentat.py:"
print "----------------------"

# Local variables:
Pist_GK24 = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24"

if not os.path.exists("C:/TEMP/rajapinta.xml"):
 print "Tiedostoa: rajapinta.xml ei ole"
 sys.exit()

if not arcpy.Exists(Pist_GK24):
 print "Tietokannassa ei ole Tasoa: Pist_GK24"
 sys.exit() 

print "Process: Convert Time Field TimeStamp"
arcpy.ConvertTimeField_management(Pist_GK24, "TimeStamp", "yyyy-MM-dd HH:mm:ss;1035;;", "TimeStampT", "DATE", "'Not Used'")

print "Process: Convert Time Field SrcTime"
arcpy.ConvertTimeField_management(Pist_GK24, "SrcTime", "yyyy-MM-dd HH:mm:ss;1035;;", "SrcTimeT", "DATE", "'Not Used'")


print "Process: Calculate Field TimeStampT UTC+2"
arcpy.CalculateField_management(Pist_GK24, "TimeStampT", "arcpy.time.ParseDateTimeString( !TimeStampT! ) + datetime.timedelta(hours=2)", "PYTHON", "")

print "Process: Calculate Field SrcTimeT UTC+2"
arcpy.CalculateField_management(Pist_GK24, "SrcTimeT", "arcpy.time.ParseDateTimeString( !SrcTimeT! ) + datetime.timedelta(hours=2)", "PYTHON", "")

print ""

Tässä sitten yhdistetään saadut pisteet ja latuverkko keskenään käyytäen Spatial Join
metodia. Jos viivalla on pisteistä saatu aikaleima (TimeStampT) se kirjoitetaan
erilliselle tasolle.
# -*- coding: utf-8 -*-
# ************************************************************************
# 6_Spatial_Join
# Scripti suoritetaan jarjestyksessa VII.
# - Luodaan Spatial Join Rajapinnasta haetulle K40127_GK24 tason
#   ja latuverkkoa edustavan tason Ladut valille.
# - Luodaan valiaikainen taso TEMP_LadutSP jossa Spatial Join suoritettu
# - Ne viivat, joille saatiin aika arvot kyselyn kautta tasolle TEMP_LadutSPn_x
# - Poistetataan tarpeeton valiaikaistaso TEMP_LadutSP
#
#
# 12.12.2016 IGLIES615 / IL
# ************************************************************************
# Import arcpy module
import arcpy,sys,os.path


# Local variables:
Ladut = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut"
Pist_GK24 = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24"
TEMP_LadutSP = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSP"
TEMP_LadutSPn_x = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x"
Ladut_SpatialJoin = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut_SpatialJoin"
fc=Ladut_SpatialJoin

print "6_Spatial_Join:"
print "---------------"

# Siivotaan mahdolliset vanhat sotkut ja helpotetaan askeltamista
#****************************************************************
if arcpy.Exists(TEMP_LadutSP):
 arcpy.Delete_management(TEMP_LadutSP, "")
if arcpy.Exists(TEMP_LadutSPn_x):
 arcpy.Delete_management(TEMP_LadutSPn_x, "")

#Tutkitaan jatkamisen edellytyksia
if not os.path.exists("C:/TEMP/rajapinta.xml"):
 print "Tiedostoa: rajapinta.xml ei ole"
 sys.exit()

if not arcpy.Exists(Ladut_SpatialJoin):
 print "Tietokannassa ei ole Tasoa:Ladut_SpatialJoin"
 sys.exit()

if not arcpy.Exists(Pist_GK24):
 print "Tietokannassa ei ole Tasoa: Pist_GK24"
 sys.exit() 

print "Process: Spatial Join: Pist_GK24 <=> Ladut"
arcpy.SpatialJoin_analysis(Ladut, Pist_GK24, TEMP_LadutSP, "JOIN_ONE_TO_ONE", "KEEP_ALL", "ID \"ID\" true true false 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,ID,-1,-1;FID_LADUT \"FID_LADUT\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,FID_LADUT,-1,-1;NUMERO \"NUMERO\" true true false 2 Short 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,NUMERO,-1,-1;NIMI \"NIMI\" true true false 100 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,NIMI,-1,-1;PALVELU \"PALVELU\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,PALVELU,-1,-1;PALVELUTYY \"PALVELUTYY\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,PALVELUTYY,-1,-1;KATUOSOITE \"KATUOSOITE\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,KATUOSOITE,-1,-1;POSTINUMER \"POSTINUMER\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,POSTINUMER,-1,-1;POSTITOIMI \"POSTITOIMI\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,POSTITOIMI,-1,-1;TUOTTAJATY \"TUOTTAJATY\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,TUOTTAJATY,-1,-1;TUOTTAJA \"TUOTTAJA\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,TUOTTAJA,-1,-1;ESTEETTOMY \"ESTEETTOMY\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,ESTEETTOMY,-1,-1;URL \"URL\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,URL,-1,-1;VARUSTEET \"VARUSTEET\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,VARUSTEET,-1,-1;VALAISTUS \"VALAISTUS\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,VALAISTUS,-1,-1;HUOLTOTILA \"HUOLTOTILA\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,HUOLTOTILA,-1,-1;KUNTO \"KUNTO\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,KUNTO,-1,-1;PYSAKOIN \"PYSAKOIN\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,PYSAKOIN,-1,-1;KIINTEIST \"KIINTEIST\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,KIINTEIST,-1,-1;HUOMIOT \"HUOMIOT\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,HUOMIOT,-1,-1;SHAPE_LENG \"SHAPE_LENG\" true true false 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,SHAPE_LENG,-1,-1;Shape_Length \"Shape_Length\" false true true 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut,Shape_Length,-1,-1;DeviceId \"DeviceId\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,DeviceId,-1,-1;TimeStamp \"TimeStamp\" true true false 8000 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,TimeStamp,-1,-1;Latitude \"Latitude\" true true false 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,Latitude,-1,-1;Longitude \"Longitude\" true true false 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,Longitude,-1,-1;Velocity \"Velocity\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,Velocity,-1,-1;Heading \"Heading\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,Heading,-1,-1;Altitude \"Altitude\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,Altitude,-1,-1;ChannelId \"ChannelId\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,ChannelId,-1,-1;ResponseCode \"ResponseCode\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,ResponseCode,-1,-1;ResponseParameter \"ResponseParameter\" true true false 40 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,ResponseParameter,-1,-1;SrcTime \"SrcTime\" true true false 8000 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\Pist_GK24,SrcTime,-1,-1;TimeStampT \"TimeStampT\" true true false 8 Date 0 0 ,First,#,F:\\NNoMansLandoMansLandlojarvi\\LatuData\\PPCT.gdb\\Pist_GK24,TimeStampT,-1,-1;SrcTimeT \"SrcTimeT\" true true false 8 Date 0 0 ,First,#,F:\\ylojarvi\\LatuData\\PPCT.gdb\\Pist_GK24,SrcTimeT,-1,-1", "INTERSECT", "30 Meters", "")

#Valitaan vain AikaArvot sisaltavat rivit tasolta TEMP_LadutSPn_x
print "Process: Select: vain AikaArvot tasolle TEMP_LadutSPn_x"
arcpy.Select_analysis(TEMP_LadutSP, TEMP_LadutSPn_x, "\"TimeStampT\" IS NOT NULL")

#Process: Delete: TEMP_LadutSP
print "Process: Tuhotaan valiaikainen taulu: TEMP_LadutSP"
arcpy.Delete_management(TEMP_LadutSP, "")

print ""

Sitten aikaleimalla päivitetyt viivat sille "oikealle" tasolle.

# -*- coding: utf-8 -*-
# ************************************************************************
# 7_latujen_paivitys.py
#
# 16.12.2016
# Otetaan erilleen, toimii vakaammin ja tekee myos niita toivottuja asioita
# 
# Scripti suoritetaan jarjestyksessa VIII.
# - haetaan tasolta Ladut_SpatialJoin ne viivat jotka yhdistyvat Select Layer By Location
#   operaation kautta tason TEMP_LadutSPn_x kanssa.
# - Poistetaan tasolta Ladut_SpatialJoin vanhan aika leiman omaavat viivat ts. vanhat ladut
# - Sitten lykataan uusi viivattieto taulusta TEMP_LadutSPn_x tauluun Ladut_SpatialJoin
#   Naita vosi sitten kutsu uusiksi laduiksi
# - Poistetataan tarpeeton valiaikaistaso TEMP_LadutSPn_x
#
#
# 16.12.2016 IGLIES615 / IL
# ************************************************************************
# Import arcpy module
import arcpy,sys,os.path


# Local variables:
Ladut_SpatialJoin__2_ = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut_SpatialJoin"
TEMP_LadutSP_xQ__3_ = "TEMP_LadutSP_xQ"
TEMP_LadutSP_xQ = TEMP_LadutSP_xQ__3_
TEMP_LadutSPn_x = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x"
Ladut_SpatialJoin_xQ__3_ = TEMP_LadutSP_xQ
TEMP_LadutSPn_x__2_ = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x"
Ladut_SpatialJoin = TEMP_LadutSPn_x__2_
Ladut_SpatialJoin__4_ = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut_SpatialJoin"

print "7_latujen_paivitys:"
print "-------------------"

#Tutkitaan jatkamisen edellytyksia
if not os.path.exists("C:/TEMP/rajapinta.xml"):
 print "Tiedostoa: rajapinta.xml ei ole"
 sys.exit()

if not arcpy.Exists(TEMP_LadutSPn_x):
 print "Tasoa: TEMP_LadutSPn_x ei ole"
 sys.exit()

if not arcpy.Exists(Ladut_SpatialJoin__2_):
 print "Tasoa: Ladut_SpatialJoin ei ole"
 sys.exit()

# Process: Make Feature Layer (2)
print "Process: Tehdaan Feature Layer: TEMP_LadutSP_xQ"
arcpy.MakeFeatureLayer_management(Ladut_SpatialJoin__2_, TEMP_LadutSP_xQ__3_, "", "", "OBJECTID OBJECTID VISIBLE NONE;Shape Shape VISIBLE NONE;Join_Count Join_Count VISIBLE NONE;TARGET_FID TARGET_FID VISIBLE NONE;ID ID VISIBLE NONE;FID_LADUT FID_LADUT VISIBLE NONE;NUMERO NUMERO VISIBLE NONE;NIMI NIMI VISIBLE NONE;PALVELU PALVELU VISIBLE NONE;PALVELUTYY PALVELUTYY VISIBLE NONE;KATUOSOITE KATUOSOITE VISIBLE NONE;POSTINUMER POSTINUMER VISIBLE NONE;POSTITOIMI POSTITOIMI VISIBLE NONE;TUOTTAJATY TUOTTAJATY VISIBLE NONE;TUOTTAJA TUOTTAJA VISIBLE NONE;ESTEETTOMY ESTEETTOMY VISIBLE NONE;URL URL VISIBLE NONE;VARUSTEET VARUSTEET VISIBLE NONE;VALAISTUS VALAISTUS VISIBLE NONE;HUOLTOTILA HUOLTOTILA VISIBLE NONE;KUNTO KUNTO VISIBLE NONE;PYSAKOIN PYSAKOIN VISIBLE NONE;KIINTEIST KIINTEIST VISIBLE NONE;HUOMIOT HUOMIOT VISIBLE NONE;SHAPE_LENG SHAPE_LENG VISIBLE NONE;DeviceId DeviceId VISIBLE NONE;TimeStamp TimeStamp VISIBLE NONE;Latitude Latitude VISIBLE NONE;Longitude Longitude VISIBLE NONE;Velocity Velocity VISIBLE NONE;Heading Heading VISIBLE NONE;Altitude Altitude VISIBLE NONE;ChannelId ChannelId VISIBLE NONE;ResponseCode ResponseCode VISIBLE NONE;ResponseParameter ResponseParameter VISIBLE NONE;SrcTime SrcTime VISIBLE NONE;TimeStampT TimeStampT VISIBLE NONE;SrcTimeT SrcTimeT VISIBLE NONE;Erotus Erotus VISIBLE NONE;Shape_Length Shape_Length VISIBLE NONE")

# Process: Select Layer By Location
print "Process: Haetaan vanhat ladut taulusta Ladut_SpatialJoin"
arcpy.SelectLayerByLocation_management(TEMP_LadutSP_xQ__3_, "INTERSECT", TEMP_LadutSPn_x, "", "NEW_SELECTION", "NOT_INVERT")

# Process: Delete Rows
print "Process: Poistetaan ne vanhat ladut taulusta Ladut_SpatialJoin"
arcpy.DeleteRows_management(TEMP_LadutSP_xQ)

#Process: Append: Lisataan uudet ladut vanhojen poistettujen tilalle tauluun Ladut_SpatialJoin
print "Process: Lisataan uudet ladut vanhojen poistettujen tilalle"
arcpy.Append_management("F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x", Ladut_SpatialJoin__4_, "NO_TEST", "oin_Count \"Join_Count\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,Join_Count,-1,-1;TARGET_FID \"TARGET_FID\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,TARGET_FID,-1,-1;ID \"ID\" true true false 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,ID,-1,-1;FID_LADUT \"FID_LADUT\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,FID_LADUT,-1,-1;NUMERO \"NUMERO\" true true false 2 Short 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,NUMERO,-1,-1;NIMI \"NIMI\" true true false 100 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,NIMI,-1,-1;PALVELU \"PALVELU\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,PALVELU,-1,-1;PALVELUTYY \"PALVELUTYY\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,PALVELUTYY,-1,-1;KATUOSOITE \"KATUOSOITE\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,KATUOSOITE,-1,-1;POSTINUMER \"POSTINUMER\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,POSTINUMER,-1,-1;POSTITOIMI \"POSTITOIMI\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,POSTITOIMI,-1,-1;TUOTTAJATY \"TUOTTAJATY\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,TUOTTAJATY,-1,-1;TUOTTAJA \"TUOTTAJA\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,TUOTTAJA,-1,-1;ESTEETTOMY \"ESTEETTOMY\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,ESTEETTOMY,-1,-1;URL \"URL\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,URL,-1,-1;VARUSTEET \"VARUSTEET\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,VARUSTEET,-1,-1;VALAISTUS \"VALAISTUS\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,VALAISTUS,-1,-1;HUOLTOTILA \"HUOLTOTILA\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,HUOLTOTILA,-1,-1;KUNTO \"KUNTO\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,KUNTO,-1,-1;PYSAKOIN \"PYSAKOIN\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,PYSAKOIN,-1,-1;KIINTEIST \"KIINTEIST\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,KIINTEIST,-1,-1;HUOMIOT \"HUOMIOT\" true true false 254 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,HUOMIOT,-1,-1;SHAPE_LENG \"SHAPE_LENG\" true true false 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,SHAPE_LENG,-1,-1;DeviceId \"DeviceId\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,DeviceId,-1,-1;TimeStamp \"TimeStamp\" true true false 8000 Text 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,TimeStamp,-1,-1;Latitude \"Latitude\" true true false 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,Latitude,-1,-1;Longitude \"Longitude\" true true false 8 Double 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,Longitude,-1,-1;Velocity \"Velocity\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,Velocity,-1,-1;Heading \"Heading\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,Heading,-1,-1;Altitude \"Altitude\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,Altitude,-1,-1;ChannelId \"ChannelId\" true true false 4 Long 0 0 ,First,#,F:\\NoMansLand\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,ChannelId,-1,-1;ResponseCode \"ResponseCode\" true true false 4 LonNoMansLandNoMansLandNoMansLandNoMansLandNoMansLandNoMansLandg 0 0 ,First,#,F:\\ylojarvi\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,ResponseCode,-1,-1;ResponseParameter \"ResponseParameter\" true true false 40 Text 0 0 ,First,#,F:\\ylojarvi\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,ResponseParameter,-1,-1;SrcTime \"SrcTime\" true true false 8000 Text 0 0 ,First,#,F:\\ylojarvi\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,SrcTime,-1,-1;TimeStampT \"TimeStampT\" true true false 8 Date 0 0 ,First,#,F:\\ylojarvi\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,TimeStampT,-1,-1;SrcTimeT \"SrcTimeT\" true true false 8 Date 0 0 ,First,#,F:\\ylojarvi\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,SrcTimeT,-1,-1;Shape_Length \"Shape_Length\" false true true 8 Double 0 0 ,First,#,F:\\ylojarvi\\LatuData\\PPCT.gdb\\TEMP_LadutSPn_x,Shape_Length,-1,-1", "")

print "Process: Tuhotaan valiaikainen taulu: TEMP_LadutSPn_x"
arcpy.Delete_management(TEMP_LadutSPn_x, "")

#Poistetaan vanhat tiedostot sotkemasta
if os.path.isfile("C:/TEMP/tulos.csv"):
 print "Poistettu: tulos.csv"
 os.remove("C:/TEMP/tulos.csv")
if os.path.exists("C:/TEMP/tulos.txt"):
 print "Poistettu: tulos.txt"
 os.remove("C:/TEMP/tulos.txt")

print ""

Lasketaan lopuksi erotus ajohetken ja koneen aikaleiman välillä ja siivotaan jäljet.

# ************************************************************************
# 8_Laske_Aika.py
#
# 
# Scripti suoritetaan jarjestyksessa IX.
# - Tama rutiini suorittaa aika arvojen laskuun kent(taan / tiin)
#
#
# 19.12.2016 IGLIES615 / IL
# ************************************************************************

import arcpy,sys,os

Ladut_SpatialJoin = "F:\\NoMansLand\\LatuData\\PPCT.gdb\\Ladut_SpatialJoin"
fc=Ladut_SpatialJoin

#Tutkitaan jatkamisen edellytyksia
if not os.path.exists("C:/TEMP/rajapinta.xml"):
 print "Tiedostoa: rajapinta.xml ei ole"
 sys.exit()

#Tutkitaan tason Ladut_SpatialJoin olemassaolo
if not arcpy.Exists(Ladut_SpatialJoin):
 print "Tietokannassa ei ole Tasoa:Ladut_2016_Line_SpatialJoin"
 sys.exit() 


print "8_Laske_Aika.py:"
print "---------------"


if 'Erotus' not in [f.name for f in arcpy.ListFields(fc)]:
 print "Process: Add Field: Lisataan kentta Erotus"
 arcpy.AddField_management(Ladut_SpatialJoin, "Erotus", "FLOAT", "", "", "", "", "NULLABLE", "NON_REQUIRED", "")

print "Process: Lasketaan erotus nykyhetki - TimeStampT kentaan Erotus"
arcpy.CalculateField_management(Ladut_SpatialJoin, "Erotus", "DateDiff (\"h\", [TimeStampT],Now (  ) )", "VB", "")

if os.path.exists("C:/TEMP/rajapinta.xml"): 
 print "Poistettu: rajapinta.xml"
 os.remove("C:/TEMP/rajapinta.xml")


print ""

Kasataan palasista kokonaisuus joka muodostaa "kehittyneen" komentojonotiedoston.

@ECHO OFF
REM 02.12.2016 IGLIES615 / IL
CLS
ECHO.
ECHO ******************************
ECHO Suoritetaan LatuDatan paivitys
ECHO ******************************
ECHO.
C:\Python\ArcGIS10.3\python.exe C:\LatuData\0_Luo_XML.py
C:\Python\ArcGIS10.3\python.exe C:\LatuData\1_Lue_Rajapinta.py
C:\Python\ArcGIS10.3\python.exe C:\LatuData\2_Luo_TXT_ja_CSV.py
C:\Python\ArcGIS10.3\python.exe C:\LatuData\3_Luo_ja_Alusta_DB.py
C:\Python\ArcGIS10.3\python.exe C:\LatuData\4_TeePisteet_Tietokantaan.py
C:\Python\ArcGIS10.3\python.exe C:\LatuData\5_Kasittele_Kentat.py
C:\Python\ArcGIS10.3\python.exe C:\LatuData\6_Spatial_Join.py
C:\Python\ArcGIS10.3\python.exe C:\LatuData\7_latujen_paivitys.py
C:\Python\ArcGIS10.3\python.exe C:\LatuData\8_Laske_Aika.py

Ns. "In Real Life" tämä on toiminut OK. Ajastuksella ajettu tunnin välein.
Livenä ajossa on 18 konetta ja jos kaikki tuottaa dataa, kasvaa massa melko
suureksi. Tunnin välein ajettuna vaara siihen, että tulee ns. törmäys, on
suuri etenkin kun joutuu nuhapumppu työasemalta ajamaan aineiston hitaan
yhteyden läpi serverillä sijaitsevalle tietokannalle.

Helpoiten ajatus tapahtuu tuoreimmissa M$-Windows työasemissa komennolla
C:\>schtasks /create /tn "LatuData" /tr c:\Latudata\LatuKartta.BAT /sc minute /mo 60

Jos tietokanta alkaa antamaa virheitä Table to Table kohdalla, poista tiedosto
C:\TEMP\schema.ini


( Päivitetty: 23.12.2016 11:59 )

 - Merry GIStmas vielä toistamiseen | Kommentoi


©2018 Iglies - suntuubi.com