Einbinden einer *.dll oder *.tlb

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

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 :roll: , 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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Oh, gerade nochmal geschaut. Es gibt doch https://github.com/ValentinMinder/Swiss ... _ch1903.py von den gleichen Leuten. Das ist pures Python.
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

__deets__ hat geschrieben: Mittwoch 16. Mai 2018, 11:27 Oh, gerade nochmal geschaut. Es gibt doch https://github.com/ValentinMinder/Swiss ... _ch1903.py von den gleichen Leuten. Das ist pures Python.
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)
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

__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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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 🙄
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

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.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Cool. Für Python tut das natürlich auch nix. Aber C# ist ja auch ok.
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

__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 8) . 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 :lol:
Mit Java und IronPython schaue ich mir mal an...

Danke euch...
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

... 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 :cry:

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

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...
kussji
User
Beiträge: 78
Registriert: Mittwoch 16. Mai 2018, 09:58

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 8)

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...
Tholo
User
Beiträge: 177
Registriert: Sonntag 7. Januar 2018, 20:36

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was tut denn an Mono nicht und hast Du schon Java, bzw. Jython ausprobiert?
Apex
User
Beiträge: 8
Registriert: Montag 10. April 2017, 12:50

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
Antworten