Seite 1 von 1
Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 10:14
von kussji
Hallo
Bin noch Anfänger in python wie auch in linux (Raspian/Raspberry)
Ich würde gerne von einem GPS-Empfänger die WGS84-Koordinaten in Schweizer-Koordinaten (LV95) transformieren. Dazu gibt es von swisstopo.ch eine DLL bzw. je nach System Bibliotheken.
https://shop.swisstopo.admin.ch/de/prod ... e/DLL_info
Es gibt ein Beispiel-Code für Python mit Hilfe von COMTYPES - schön und gut aber irgendwann habe ich rausgefunden, dass diese für Python mit Windowssystemen sind und nicht Linux. Oder verstehe ich was falsch?
Kann mir jemand Tipps geben, wie ich hier ans Ziel komme. (Grundlagenstudium bin ich dran

, googeln kann ich auch, aber vielleicht suche ich falsch ?)
Danke und Gruss
Code: Alles auswählen
import os
try:
#Load Reframe COM library
from comtypes.client import GetModule, CreateObject
GetModule(os.environ["ProgramFiles"] + "\\swisstopo\\ReframeDLL\\swisstopoReframeLib.tlb")
#Create a new Reframe object
from comtypes.gen.swisstopoReframeLib import Reframe
o=CreateObject(Reframe)
Federal Office of Topography swisstopo Report 09-07
REFRAME library Page 24
#Input coordinates: read in a file, got from a textbox, #or obtained through another method or library...
e_lv03 = 601000.0
n_lv03 = 197500.0
h_ln02 = 555.0
#Transform LV03 coordinates to LV95 and LN02 height to Bessel
result = o.ComputeReframe(e_lv03, n_lv03, h_ln02, 0, 1, 0, 2)
#Save results to variables
e_lv95 = result[0]
n_lv95 = result[1]
h_bessel = result[2]
retcode = result[3]
#Analyze result
if retcode == 1: #OK
… #TODO
else: #Error
… #TODO
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 11:25
von __deets__
COM ist zwar strenggenommen plattformunabhaengig, jedoch nur unter Windows ueblich. Aber spaetestens deine DLL ist nur noch fuer Windows nutzbar. Theoretisch kannst du mit Wine arbeiten, aber dann ist *alles* in Wine, auch zB der Python-Interpreter, und alle anderen Pakete die du benutzen willst.
Das einfachste waere wohl die Verwendung von
https://proj4.org/ via pyproj. Wenn das deine gewuenschte Transformation beherrscht.
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 11:27
von __deets__
Oh, gerade nochmal geschaut. Es gibt doch
https://github.com/ValentinMinder/Swiss ... _ch1903.py von den gleichen Leuten. Das ist pures Python.
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 17:24
von kussji
Als Anfänger sage ich mal "schönes script" um zu sehen, wie man sowas macht. Leider hilft mir das für mein Projekt nicht weiter, weil die Berechnung eine Genauigkeit im 1-Meter-Bereich hat. Mein Ziel ist aber cm-Genauigkeit zu erreichen. Mit DGNSS durch gemachte Tests durchaus realistisch. Nur fand die Umrechnung per Hand statt das soll python unter linux machen.
Die genannte DLL hätte diese Präzision - ist aber meines Wissens nur compiliert verfügbar.
In diesem Forum kann mir wohl für folgendes nicht geholfen werden. Die exakte Formel (cm-Bereich) hätte ich ja, was mir aber jetzt fehlt ist der Offset zwischen CH1903 und ETRS89 (als Formel oder Tabelle, da scheinbar nicht linear)
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 17:32
von __deets__
So ganz verstehe ich dich nicht. Wenn die Umrechnung per Hand geschah, dann hast du doch eine Formel? Und warum kann die nicht einfach verwandt werden? Oder meinst du die Nutzung eines Tools unter Windows, das jetzt durch Python/Linux ersetzt werden soll?
Und die DLL gibt es in der REFRAME-Variante ja auch fuer Linux. Wenn das nicht reicht - ja, dann musst du in den sauren Apfel beissen, und entweder Windows benutzen (kann ja auch virtualisiert unter Linux laufen), oder eben auf Wine setzen.
Hilfe bei der Erstellung einer eigenen Umrechnung ist tatsaechlich eher nicht zu erwarten hier - das ist halt schon ein sehr spezielles Thema.
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 17:35
von kussji
__deets__ hat geschrieben: Mittwoch 16. Mai 2018, 11:25
COM ist zwar strenggenommen plattformunabhaengig, jedoch nur unter Windows ueblich. Aber spaetestens deine DLL ist nur noch fuer Windows nutzbar. Theoretisch kannst du mit Wine arbeiten, aber dann ist *alles* in Wine, auch zB der Python-Interpreter, und alle anderen Pakete die du benutzen willst.
Das einfachste waere wohl die Verwendung von
https://proj4.org/ via pyproj. Wenn das deine gewuenschte Transformation beherrscht.
was mir komisch scheint, dass beim Download der DLL folgendes steht:
"Beschreibung: Version 3.2 für Windows 32- oder 64-Bit, Mac oder
Linux - Zip-Archiv, das die Binärdateien, die Dokumentation und Beispiele enthält"
warum steht da Linux?
die gleichnamige (zugehörige) Datei "swisstopoReframeLib.tlb" zur *.dll hilft wohl auch nicht weiter - oder?
Ev. versuche ich es mal mit WINE kenne ich nicht - klingt insgesamt aber interessant - auch in andern Zusammenhängen.
Danke trotzdem
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 17:43
von __deets__
Stehen tut das da, finden tut man nur DLLs, und ggf. ein JAR. Du kannst ja auch einfach mit Java arbeiten, das sollte plattformunabhaengig sein. Wenn die Helden nicht einen Wrapper fuer ihre Windows DLLs gebaut haben

Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 20:29
von narpfel
Die DLLs sind anscheinend keine nativen Windows-DLLs, sondern .NET- bzw- Mono-DLLs (das sagt zumindest die Downloadseite und `file`) und sollten deswegen eigentlich auch unter Linux laufen. Mit
IronPython sollten die relativ einfach ansprechbar sein.
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 21:28
von __deets__
Cool. Für Python tut das natürlich auch nix. Aber C# ist ja auch ok.
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 16. Mai 2018, 23:10
von kussji
__deets__ hat geschrieben: Mittwoch 16. Mai 2018, 17:43
Stehen tut das da, finden tut man nur DLLs, und ggf. ein JAR. Du kannst ja auch einfach mit Java arbeiten, das sollte plattformunabhaengig sein. Wenn die Helden nicht einen Wrapper fuer ihre Windows DLLs gebaut haben
Danke für die Antworten.
Vielleicht sind es doch Helden

. Mit meinen Kenntnissen hätte ich es wohl geschafft einer DLL Umrechnungen zu entlocken. Aber die Integration für python und linux in meinem Fall übersteigt meine Kenntnisse.
Die Helden stellen auch folgende Dateien (im Download enthalten) zur Verfügung - kann das ev. weiterhelfen?
- ReframeLibWrapper.dll
- ReframeLibWrapper.lib
Ansonsten klopfe ich mal bei den Helden an, wenn die sich überhaupt mit mir abgeben wollen
Mit Java und IronPython schaue ich mir mal an...
Danke euch...
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Dienstag 3. Juli 2018, 17:10
von kussji
... so einige Tage später wieder bei diesem Thema
Habe noch keinen besseren Plan als es einfach mal mit "wine" zu probieren.
Gesagt - getan - nicht funktionieren das
Meine Randdaten:
- Platform: Raspberry Pi 3B+ mit Raspian
- Emulator: eltechs.com Version exagear-desktop-v-2-4
- Emulatoreinstellung "Windows7" (auch mit Win10 probiert)
- wine-2.0-eltechs
Als Installation habe ich folgende probiert:
pi@raspberrypi:~/Downloads $ wine python-3.7.0-amd64.exe
pi@raspberrypi:~/Downloads $ wine python-3.6.6.exe
ehrlich gesagt, weiss ich auch nicht genau welches Paket ich nehmen soll - muss doch was mit x86 sein - 32 oder 64???.
Das Problem ist, dass das Installationsprogramm von Python mit Fehlermeldung abbricht.
"0x80070005 - Access denied"
Das Errorlog sagt zwar was aus "... Failed to cache bundle from..." Aber das verstehe ich nicht - siehe unten
Finde keine brauchbaren Informationen zu der Fehlermeldung.
Irgendwo habe ich gelesen, dass das Installationsprogramm unter linux nicht lief - er Python unter echtem Windows installiert hat und dann die Installation nach linux kopiert hat. Ist das eine gute Idee?
Was könnte ich probieren?
Danke schon mal...
P.S. Habe auch Notepad++ installiert - Dies war ohne Probleme möglich...
Auszug der letzten Zeilen des Logfiles:
Code: Alles auswählen
[002D:002E][2018-07-03T17:04:14]i362: System restore disabled, system restore point not created.
[0028:0029][2018-07-03T17:04:14]i370: Session begin, registration key: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{f684de81-73c2-4924-ad43-e7ae400d47b5}, options: 0x7, disable resume: No
[0028:0029][2018-07-03T17:04:20]i000: Caching bundle from: 'C:\windows\Temp\{6B430E95-82E4-4781-A74C-E606858C0E77}\.be\python-3.7.0-amd64.exe' to: 'C:\users\pi\Local Settings\Application Data\Package Cache\{f684de81-73c2-4924-ad43-e7ae400d47b5}\python-3.7.0-amd64.exe'
[0028:0029][2018-07-03T17:04:26]e000: Error 0x80070005: Failed to cache bundle from: 'C:\windows\Temp\{6B430E95-82E4-4781-A74C-E606858C0E77}\.be\python-3.7.0-amd64.exe' to 'C:\users\pi\Local Settings\Application Data\Package Cache\{f684de81-73c2-4924-ad43-e7ae400d47b5}\python-3.7.0-amd64.exe'
[0028:0029][2018-07-03T17:04:26]e000: Error 0x80070005: Failed to cache bundle from path: C:\windows\Temp\{6B430E95-82E4-4781-A74C-E606858C0E77}\.be\python-3.7.0-amd64.exe
[0028:0029][2018-07-03T17:04:26]e000: Error 0x80070005: Failed to begin registration session.
[0028:0029][2018-07-03T17:04:26]e000: Error 0x80070005: Failed to register bundle.
[0028:0029][2018-07-03T17:04:26]i399: Apply complete, result: 0x80070005, restart: None, ba requested restart: No
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Dienstag 3. Juli 2018, 17:18
von __deets__
Ich habe das bei meinem Vorschlag fuer Wine ueberlesen, aber das geht natuerlich nicht fuer den PI. Der ist dafuer viel zu schwachbruestig, und vor allem hat er einen andere CPU-Architektur als Windows und deine DLL sie brauchen. Das bringt nix.
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Dienstag 3. Juli 2018, 17:55
von kussji
Okey - dann kann ich mir das abschminken? Oder?
Dachte der exagear-Emulator sollte das richten so das x86 möglich ist auch mit den DLL's.
Jedenfalls habe ich Tut's gefunden wo Python in Wine auf dem Raspberry installiert wurde - hat bei denen anscheinend funktioniert.
Sollte es doch irgendwie gehen, bleibt dann die berchtigte Frage mit der Performance...
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Dienstag 3. Juli 2018, 18:05
von kussji
Hatte mir auch schon überlegt, ein "echtes" mini Windows Maschinchen zuzulegen. Liebäugle mit dem LattePanda mit Win10 (Vollversion) Das solle laufen, jedoch habe ich bedenken, das Win10 auf solchen Maschinchen laufen (nicht WIN -IoT). Da ist wohl 2/3 des Speichers mit dem OS gefüllt. Und ob da Preis/Leistung stimmt??? Hmmm???
Das ganze soll ein Mobiles Gerät werden, da schleppe ich nicht gerne Laptops oder Desktops herum
Oder wär ev. Raspi und Win10 IoT eine mögliche Lösung. Hat da jemand Erfahrung ob darauf auch Python läuft? Denn das ist ja für Visual Studio ausgerichtet.
Oder ich befasse mich einfach mit Visual Studio...
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Dienstag 3. Juli 2018, 19:00
von Tholo
Also LattePanda (Rev 1) hab ich eines da. Das ist mir aber nicht stabil genug und läuft mittlerweile gar nicht mehr an. Ich würde eher zu einem
Udoo greifen. Bin aber eher weg von den x86 SBC.
Das Udoo hat einen vollwertiges Win10. Kann sogar Win7 und Android wenns wäre
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Mittwoch 4. Juli 2018, 07:48
von Sirius3
Was tut denn an Mono nicht und hast Du schon Java, bzw. Jython ausprobiert?
Re: Einbinden einer *.dll oder *.tlb
Verfasst: Donnerstag 12. Juli 2018, 13:30
von Apex
Hallo, ich bin selber nicht fit mit python aber dafür komme ich aus der "GeoBranche". Nach einer kurzen Suche bin ich auf eine leichtere Lösung zur koordinatentransformation gestoßen.
Such mal nach "GeoDjango". Allgemein kommt man zur Zeit eigentlich nicht um "GEOS" rum, wenn du viel mit koordinaten machen musst solltest du dich mit den funktionen von GEOS befassen.
Folgend ein Lösungsbeispiel (auch nur kopiert)
--------------------BEISPIEL--------------------
from django.contrib.gis.geos import Point
pnt = Point(30, 50, srid=4326) #eingangskoordinate mit SRID
desired_srid = 22186 #Ausgabekoordinatensystem (SRID)
pnt.transform(desired_srid)
pnt.ewkt
u'SRID=22186;POINT (11160773.5712331663817167 19724623.9116888605058193)'
---------------------------
Die passenden SRID Codes kannst du im I-Net finden