Modul: Ermitteln von Tankstellenpreisen im Umkreis DE/AT

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Modul: Ermitteln von Tankstellenpreisen im Umkreis DE/AT

Beitrag von Kurzer »

Modul GasStationsPrices:

Version 1.00 - 18.04.2019
Das Modul stellt Funktionen zur Verfügung, um die (günstigsten) Benzinpreise zu einer Adresse in Deutschland und Österreich automatisch zu ermitteln.
Die Preise werden online über http://www.spritpreismonitor.de (für Deustchland) und http://www.e-control.at (für Österreich) abgefragt und entsprechend aufbereitet, so dass alle Daten zur Weiterverarbeitung in einem strukturierten Array vorliegen.

Den beiden Prozeduren GetStationsDE und GetStationsAT werden dabei die GEO-Koordinaten übergeben, die den geografischen Punkt beschreiben in dessen Umkreis die Tankstellen- bzw. Preissuche erfolgen soll.

Code: Alles auswählen

GetStationsDE(sLatitude.s, sLongitude.s, sFuel.s, sUmkreis.s, Array stOutStations.stations(1))
GetStationsAT(sLatitude.s, sLongitude.s, sFuel.s, Array stOutStations.stations(1))
Die Prozeduren geben die Anzahl der ermittelten Tankstellen zurück. Die Preise und Tankstellendaten werden über ein Ausgabe-Array zurückgegeben, welches als Referenz-Parameter an die Prozedur übergeben wird.

Code: Alles auswählen

Structure stations
	iRang.i									; 0, 1, 2... günstigster zuerst
	sMarke.s
	sName.s
	sStrasse.s
	sPLZ.s
	sOrt.s
	sSorte.s
	sPreis.s								; Preis als String mit Dezimalpunkt (z.B. "1.439")
	iPreis.i								; Preis * 1000 als Integer ohne Dezimalpunkt (z.B. 1439)
EndStructure
Beide Prozeduren haben einen leicht unterschiedlichen Parametersatz. Alle Parameter sind in den Prozedur-Kommentaren beschrieben. So kann bei der deutschen Abfrage z.B. ein Radius angegeben werden, in dem nach Tankstellen gesucht werden soll. Bei der Abfrage für Österreich ist dies nicht möglich, da hier immer nur die 5 günstigsten Tankstellen zurückgegeben werden. Diese Einschränkungen resultieren aus der entsprechenden Funktionalität der Webseiten die für die Preisermittlung genutzt werden.

Die nötigen Geo-Koordinaten können mit meinem anderen Modul "AddressToGeo" erzeugt werden. Dieses Modul ermittelt zu einer regulären Adresse die zugehörigen Geo-Koordinaten.

Das Modul "AddressToGeo" ist hier zu finden: viewtopic.php?f=8&t=29821

Das Modul "GasStationsPrices" besitzt einen mit CompilerIf gekapselten Democode der die Funktion anhand von Beispielen erklärt. Die Rückgabe des Democodes sieht z.B. so aus:

Code: Alles auswählen

Spritpreise im Umkreis von 5 Km für folgende Adresse: Hauptstraße 4, 10827 Berlin
Diesel
Platz 1: € 1.229 |-> SB-Markttankstelle, SB-Markttankstelle Berlin Bessemer Str., Bessemer Str. 57, 12103 Berlin
Platz 2: € 1.239 |-> JET, JET BERLIN KREUZBERGSTR. 41, KREUZBERGSTR. 41 , 10965 BERLIN
Platz 3: € 1.239 |-> HEM, Berlin, Attilastr. 124, Attilastr. 124, 12105 Berlin
Platz 4: € 1.239 |-> Shell, BERLIN, ORANIENSTR., ORANIENSTR. 138 , 10969 BERLIN
Platz 5: € 1.239 |-> Sprint, Sprint Berlin Reuter Str., Reuter Str. 18-19, 12043 Berlin
... usw.
Hier der Sourcecode:

Code: Alles auswählen

;*************************************************************************
;* GasStationsPrices (c) Kurzer
;*************************************************************************
;*
;* Modulname         : GasStationsPrices
;* Filename          : mod_GasStationsPrices.pbi
;* Filetype          : Module [MainApp, Formular, Include, Module, Data]
;* Programming lang. : Purebasic 5.62+
;* String-Format     : Unicode [Ascii, Unicode, All]
;* Platform          : Windows [Windows, Mac, Linux, All]
;* Processor         : All [x86, x64, All]
;* Compileroptions   : -
;* Version           : 1.00
;* Date              : 18.04.2019
;* Autor             : Kurzer
;* Dependencies      :
;* -----------------------------------------------------------------------
;* Description:
;*
;* The module provides functions to automatically determine petrol prices 
;* in Germany and Austria. The prices are queried online from www.spritpreismonitor.de
;* (for Germany) and www.e-control.at (for Austria) and prepared accordingly.
;* 
;* The two procedures GetStationsDE() and GetStationsAT() are given the geo
;* coordinates which describe the geographical point, in whose periphery the
;* gas station resp. price search should take place.
;* 
;* The procedures return the number of the determined petrol stations. The price
;* and petrol station data are returned via an output array, which is passed
;* to the procedure as a reference parameter.
;* 
;* Both procedures have a slightly different parameter set. All parameters are
;* described in the procedure comments.
;* For example, a radius can be specified for the German query in which petrol
;* stations are to be searched. This is not possible for the Austria query,
;* since only the 5 cheapest petrol stations are returned. These restrictions
;* result from the corresponding functionality of the websites which are used
;* for price determination.
;* 
;* Btw: The necessary geo coordinates can be generated with my other module
;* "AddressToGeo". This module determines the corresponding geo coordinates
;* (latitude & longitude) for a regular address.
;* 
;* The module "AddressToGeo" can be found here:
;* English-Forum: https://www.purebasic.fr/english/viewtopic.php?f=27&t=66616
;* German-Forum : https://www.purebasic.fr/german/viewtopic.php?f=8&t=29821
;* -----------------------------------------------------------------------
;* Changelog:
;* 1.00 - rel 18.04.2019:
;*            First release
;* -----------------------------------------------------------------------
;* English-Forum     :
;* French-Forum      :
;* German-Forum      : https://www.purebasic.fr/german/viewtopic.php?f=8&t=31409
;* -----------------------------------------------------------------------
;* License: MIT License
;* 
;* Copyright (c) 2016/19 Kurzer
;* 
;* Permission is hereby granted, free of charge, to any person obtaining a copy
;* of this software and associated documentation files (the "Software"), to deal
;* in the Software without restriction, including without limitation the rights
;* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
;* copies of the Software, and to permit persons to whom the Software is
;* furnished to do so, subject to the following conditions:
;*
;* The above copyright notice and this permission notice shall be included in all
;* copies or substantial portions of the Software.
;* 
;* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
;* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
;* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
;* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
;* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
;* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
;* SOFTWARE.
;* 
;* ---------------- German translation of the MIT License ----------------
;*
;* MIT Lizenz:
;*
;* Hiermit wird unentgeltlich jeder Person, die eine Kopie der Software und der
;* zugehörigen Dokumentationen (die "Software") erhält, die Erlaubnis erteilt,
;* sie uneingeschränkt zu nutzen, inklusive und ohne Ausnahme mit dem Recht, sie
;* zu verwenden, zu kopieren, zu verändern, zusammenzufügen, zu veröffentlichen,
;* zu verbreiten, zu unterlizenzieren und/oder zu verkaufen, und Personen, denen
;* diese Software überlassen wird, diese Rechte zu verschaffen, unter den folgenden
;* Bedingungen:
;* 
;* Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in allen Kopien
;* oder Teilkopien der Software beizulegen.
;* 
;* DIE SOFTWARE WIRD OHNE JEDE AUSDRÜCKLICHE ODER IMPLIZIERTE GARANTIE BEREITGESTELLT,
;* EINSCHLIEßLICH DER GARANTIE ZUR BENUTZUNG FÜR DEN VORGESEHENEN ODER EINEM BESTIMMTEN
;* ZWECK SOWIE JEGLICHER RECHTSVERLETZUNG, JEDOCH NICHT DARAUF BESCHRÄNKT. IN KEINEM
;* FALL SIND DIE AUTOREN ODER COPYRIGHTINHABER FÜR JEGLICHEN SCHADEN ODER SONSTIGE
;* ANSPRÜCHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFÜLLUNG EINES VERTRAGES, EINES DELIKTES
;* ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ODER SONSTIGER VERWENDUNG DER SOFTWARE
;* ENTSTANDEN.
;*************************************************************************

DeclareModule GasStationsPrices
	;- --- [Module declaration / public elements] ------------------------------------------
	;-
	
	;*************************************************************************
	;- Compiler directives
	;*************************************************************************
	EnableExplicit
	
	;*************************************************************************
	;- Macros
	;*************************************************************************
	
	;*************************************************************************
	;- Constants
	;*************************************************************************
	#FUEL_DIESEL_DE = "diesel"
	#FUEL_SUPER_DE = "e5"
	#FUEL_SUPERE10_DE = "e10"
	#UMKREIS_5_DE = "5"
	#UMKREIS_10_DE = "10"
	#UMKREIS_15_DE = "15"
	#UMKREIS_20_DE = "20"
	#FUEL_DIESEL_AT = "DIE"
	#FUEL_SUPER_AT = "SUP"
	#FUEL_CNGGAS_AT = "GAS"
	
	;*************************************************************************
	;- Structures
	;*************************************************************************
	Structure stations
		iRang.i									; 0, 1, 2... günstigster zuerst
		sMarke.s
		sName.s
		sStrasse.s
		sPLZ.s
		sOrt.s
		sSorte.s
		sPreis.s								; Preis als String mit Dezimalpunkt (z.B. "1.439")
		iPreis.i								; Preis * 1000 als Integer ohne Dezimalpunkt (z.B. 1439)
	EndStructure
	
	;*************************************************************************
	;- Variables, Arrays, Linked Lists, Maps
	;*************************************************************************
	
	;*************************************************************************
	;- Interfaces, Prototypes
	;*************************************************************************
	
	;*************************************************************************
	;- Public Procedures (dec)
	;*************************************************************************
	Declare.i GetStationsDE(sLatitude.s, sLongitude.s, sFuel.s, sUmkreis.s, Array stOutStations.stations(1))
	Declare.i GetStationsAT(sLatitude.s, sLongitude.s, sFuel.s, Array stOutStations.stations(1))
		
EndDeclareModule

Module GasStationsPrices
	;-
	;- --- [Module implementation / private elements] -----------------------------------------
	;-
	
	;*************************************************************************
	;- Constants
	;*************************************************************************
	#URLDE = "https://www.spritpreismonitor.de/suche/?tx_spritpreismonitor_pi1%5BsearchRequest%5D%5BplzOrtGeo%5D=#LA#%2C#LO#&tx_spritpreismonitor_pi1%5BsearchRequest%5D%5Bumkreis%5D=#UMK#&tx_spritpreismonitor_pi1%5BsearchRequest%5D%5Bkraftstoffart%5D=#FUEL#&tx_spritpreismonitor_pi1%5BsearchRequest%5D%5Btankstellenbetreiber%5D="
	#URLAT = "https://api.e-control.at/sprit/1.0/search/gas-stations/by-address?latitude=#LA#&longitude=#LO#&fuelType=#FUEL#&includeClosed=false"
	
	;*************************************************************************
	;- Private Procedures (imp)
	;*************************************************************************
	Procedure.s GetStringPart(sString.s, sStartDelimiter.s, sEndDelimiter.s, iPartLength=0)
		; +-----------------------------------------------------------------
		; |Description  : Extrahiert aus einem String ein Teilstück, welches durch sStartDelimiter und sEndDelimiter eingeschlossen ist
		; |Arguments    : sString        : String aus dem der Teilstring extrahiert werden soll
		; |             : sStartDelimiter: Linker Begrenzungsstring
		; |             : sEndDelimiter  : Rechter Begrenzungsstring
		; |             : iPartLength    : Wenn > 0, dann wird sEndDelimiter ignoriert und ein Teilstring mit der Länge iPartLength zurückgegeben
		; |Results      : Ermittelter Teilstring bzw. "", wenn sStartDelimiter nicht vorhanden ist oder Fehler auftraten
		; |Remarks      : Kommen die Delimiter mehrfach vor, dann wird nur das erste Auftreten gefunden!
		; +-----------------------------------------------------------------
		Protected.i iPos1, iPos2
		
		iPos1 = FindString(sString, sStartDelimiter) + Len(sStartDelimiter)
		If iPos1 > 0
			If iPartLength = 0
				iPos2 = FindString(sString, sEndDelimiter, iPos1)
			Else
				iPos2 = iPos1 + iPartLength
			EndIf
			If iPos2 > iPos1
				ProcedureReturn Mid(sString, iPos1, iPos2 - iPos1)
			Else
				ProcedureReturn ""
			EndIf
		Else
			ProcedureReturn ""
		EndIf
	EndProcedure
	
	;*************************************************************************
	;- Public Procedures (imp)
	;*************************************************************************
	Procedure.i GetStationsDE(sLatitude.s, sLongitude.s, sFuel.s, sUmkreis.s, Array stOutStations.stations(1))
		; +-----------------------------------------------------------------
		; |Description  : Ermittelt zu einer Geoposition in Deutschland die günstigsten Tankstellen im Umkreis von 5 Km
		; |Arguments    : sLatitude    : Breitengrad (mit Dezimalpunkt)
		; |					    : sLongitude   : Längengrad (mit Dezimalpunkt)
		; |					    : sFuel        : Benzinsorte (Kürzel: #FUEL_DIESEL_DE, #FUEL_SUPER_DE)
		; |					    : sUmkreis     : Suchradius (Kürzel: #UMKREIS_5_DE, #UMKREIS_10_DE ...)
		; |             : stOutStations: Strukturiertes Array zur Aufnahme der Ergebnis-Einträge
		; |             :                Es wird per ReDim() passend dimensioniert
		; |Results      : Anzahl der in das Array eingefügten Einträge. Bei Fehler = 0
		; |Remarks      : -
		; +-----------------------------------------------------------------
		Protected.s sUrl, sResult, sLastlabel
		Protected   *ReceiveBuffer, i, iElementCount
		
		; JSON Daten von spritpreismonitor herunterladen
		If sUmkreis ="" : sUmkreis = "5" : EndIf
		sUrl = #URLDE
		sUrl = ReplaceString(sUrl, "#LA#", sLatitude)
		sUrl = ReplaceString(sUrl, "#LO#", sLongitude)
		sUrl = ReplaceString(sUrl, "#FUEL#", sFuel)
		sUrl = ReplaceString(sUrl, "#UMK#", sUmkreis)
		
		*ReceiveBuffer = ReceiveHTTPMemory(sUrl)
		If *ReceiveBuffer
			sResult = PeekS(*ReceiveBuffer, MemorySize(*ReceiveBuffer), #PB_UTF8|#PB_ByteLength)
			FreeMemory(*ReceiveBuffer)
		Else
			ProcedureReturn 0
		EndIf
		
		sResult = GetStringPart(sResult, "spmResult = ", "}];") + "}]"
		
		; JSON Daten in die Struktur extrahieren
		If ParseJSON(0, sResult)
			; Das Out-Array passend dimensionieren
			iElementCount = JSONArraySize(JSONValue(0))
			If iElementCount > 0
				iElementCount - 1
				ReDim stOutStations(iElementCount)
				; Datensätze extrahieren
				For i = 0 To iElementCount
					stOutStations(i)\sMarke = GetJSONString(GetJSONMember(GetJSONElement(JSONValue(0), i), "marke"))
					stOutStations(i)\sName = GetJSONString(GetJSONMember(GetJSONElement(JSONValue(0), i), "name"))
					stOutStations(i)\sStrasse = GetJSONString(GetJSONMember(GetJSONElement(JSONValue(0), i), "strasse"))
					stOutStations(i)\sStrasse + " " + GetJSONString(GetJSONMember(GetJSONElement(JSONValue(0), i), "hausnr"))
					stOutStations(i)\sPLZ = GetJSONString(GetJSONMember(GetJSONElement(JSONValue(0), i), "plz"))
					stOutStations(i)\sOrt = GetJSONString(GetJSONMember(GetJSONElement(JSONValue(0), i), "ort"))
					stOutStations(i)\sPreis = GetJSONString(GetJSONMember(GetJSONElement(JSONValue(0), i), sFuel))
					stOutStations(i)\iPreis = 1000 * ValF(stOutStations(i)\sPreis)
					If sFuel = #FUEL_SUPER_DE
						stOutStations(i)\sSorte = "Super"
					ElseIf sFuel = #FUEL_SUPERE10_DE
						stOutStations(i)\sSorte = "Super E10"
					ElseIf sFuel = #FUEL_DIESEL_DE
						stOutStations(i)\sSorte = "Diesel"
					EndIf
				Next i
				; Datensätze nach Preis ausfsteigend sortieren
				SortStructuredArray(stOutStations(), #PB_Sort_Ascending, OffsetOf(stations\iPreis), TypeOf(stations\iPreis))
				For i = 0 To iElementCount
					stOutStations(i)\iRang = i + 1
				Next i
			EndIf
			FreeJSON(0)
		Else
			ProcedureReturn 0
		EndIf	
		
		ProcedureReturn i ; ArraySize(stOutStations())
	EndProcedure	
	Procedure.i GetStationsAT(sLatitude.s, sLongitude.s, sFuel.s, Array stOutStations.stations(1))
		; +-----------------------------------------------------------------
		; |Description  : Ermittelt zu einer Geoposition in Österreich die fünf günstigsten Tankstellen im Umkreis
		; |Arguments    : sLatitude    : Breitengrad (mit Dezimalpunkt)
		; |					    : sLongitude   : Längengrad (mit Dezimalpunkt)
		; |					    : sFuel        : Benzinsorte (Kürzel: #FUEL_DIESEL_AT, #FUEL_SUPER_AT)
		; |             : stOutStations: Strukturiertes Array zur Aufnahme der Ergebnis-Einträge
		; |             :                Es wird per ReDim() passend dimensioniert
		; |Results      : Anzahl der in das Array eingefügten Einträge. Bei Fehler = 0
		; |Remarks      : -
		; +-----------------------------------------------------------------
		Protected.s sUrl, sResult, sLastlabel
		Protected.i *ReceiveBuffer, i, iElementCount
		
		; JSON Daten von e-control herunterladen
		sUrl = #URLAT
		sUrl = ReplaceString(sUrl, "#LA#", sLatitude)
		sUrl = ReplaceString(sUrl, "#LO#", sLongitude)
		sUrl = ReplaceString(sUrl, "#FUEL#", sFuel)	
		
		*ReceiveBuffer = ReceiveHTTPMemory(sUrl)
		If *ReceiveBuffer
			sResult = PeekS(*ReceiveBuffer, MemorySize(*ReceiveBuffer), #PB_UTF8|#PB_ByteLength)
			FreeMemory(*ReceiveBuffer)
		Else
			ProcedureReturn 0
		EndIf
		
		; JSON Daten in die Struktur extrahieren
		If ParseJSON(0, sResult, #PB_JSON_NoCase)
			; Das Out-Array passend dimensionieren
			iElementCount = JSONArraySize(JSONValue(0))
			If iElementCount > 0
				iElementCount - 1
				ReDim stOutStations(iElementCount)
				; Datensätze extrahieren
				For i = 0 To iElementCount
					stOutStations(i)\sName = GetJSONString(GetJSONMember(GetJSONElement(JSONValue(0), i), "name"))
					stOutStations(i)\sMarke = stOutStations(i)\sName
					stOutStations(i)\sStrasse = GetJSONString(GetJSONMember(GetJSONMember(GetJSONElement(JSONValue(0), i), "location"), "address"))
					stOutStations(i)\sPLZ = GetJSONString(GetJSONMember(GetJSONMember(GetJSONElement(JSONValue(0), i), "location"), "postalCode"))
					stOutStations(i)\sOrt = GetJSONString(GetJSONMember(GetJSONMember(GetJSONElement(JSONValue(0), i), "location"), "city"))
					If sFuel = #FUEL_SUPER_AT
						stOutStations(i)\sSorte = "Super"
					ElseIf sFuel = #FUEL_DIESEL_AT
						stOutStations(i)\sSorte = "Diesel"
					ElseIf sFuel = #FUEL_CNGGAS_AT
						stOutStations(i)\sSorte = "CNG Gas"
					EndIf
					If JSONArraySize(GetJSONMember(GetJSONElement(JSONValue(0), i), "prices")) > 0
						stOutStations(i)\sPreis = StrF(GetJSONFloat(GetJSONMember(GetJSONElement(GetJSONMember(GetJSONElement(JSONValue(0), i), "prices"), 0), "amount")), 3)
						stOutStations(i)\iPreis = 1000 * ValF(stOutStations(i)\sPreis)
					Else	
						stOutStations(i)\sPreis = "9999"
						stOutStations(i)\iPreis = 9999
					EndIf 
				Next i
				; Datensätze nach Preis ausfsteigend sortieren
				SortStructuredArray(stOutStations(), #PB_Sort_Ascending, OffsetOf(stations\iPreis), TypeOf(stations\iPreis))
				For i = 0 To iElementCount
					stOutStations(i)\iRang = i + 1
				Next i
			EndIf
			FreeJSON(0)
		Else
			ProcedureReturn 0
		EndIf	
		
		ProcedureReturn i
	EndProcedure
		
	;*************************************************************************
	;- Data Section
	;*************************************************************************
	DataSection
		
	EndDataSection
	
EndModule

;-------------------------------------------------------------------------------
;- Main
CompilerIf #PB_Compiler_IsMainFile
	EnableExplicit
	
	Procedure Main()
		Protected.i i, iStationCount
		
		InitNetwork()
		UseModule GasStationsPrices
		
		Protected Dim stStationsDiesel.stations(0)
		Protected Dim stStationsSuper.stations(0)
		Protected Dim stStationsGasE10.stations(0)
		
		Debug "Spritpreise im Umkreis von 5 Km für folgende Adresse: Hauptstraße 4, 10827 Berlin"
		Debug "Diesel"
		iStationCount = GetStationsDE("52.4899871", "13.359534", #FUEL_DIESEL_DE, #UMKREIS_5_DE, stStationsDiesel())
		If iStationCOunt > 5 : iStationCOunt = 5 : EndIf
		For i = 0 To iStationCount - 1
		 	Debug "Platz " + Str(stStationsDiesel(i)\iRang)+ ": € " + stStationsDiesel(i)\sPreis + " |-> " +
		 	      stStationsDiesel(i)\sMarke + ", " + stStationsDiesel(i)\sName + ", " + stStationsDiesel(i)\sStrasse + ", " +
		 	      stStationsDiesel(i)\sPLZ + " " + stStationsDiesel(i)\sOrt
		Next i
		
		Debug ""
		Debug "Super E5"
		iStationCOunt = GetStationsDE("52.4899871", "13.359534", #FUEL_SUPER_DE, #UMKREIS_5_DE, stStationsSuper())
		If iStationCOunt > 5 : iStationCOunt = 5 : EndIf
		For i = 0 To iStationCount - 1
		 	Debug "Platz " + Str(stStationsSuper(i)\iRang)+ ": € " + stStationsSuper(i)\sPreis + " |-> " +
		 	      stStationsSuper(i)\sMarke + ", " + stStationsSuper(i)\sName + ", " + stStationsSuper(i)\sStrasse + ", " +
		 	      stStationsSuper(i)\sPLZ + " " + stStationsSuper(i)\sOrt
		Next i
		
		Debug ""
		Debug "Super E10"
		iStationCOunt = GetStationsDE("52.4899871", "13.359534", #FUEL_SUPERE10_DE, #UMKREIS_5_DE, stStationsGasE10())
		If iStationCOunt > 5 : iStationCOunt = 5 : EndIf
		For i = 0 To iStationCount - 1
		 	Debug "Platz " + Str(stStationsGasE10(i)\iRang)+ ": € " + stStationsGasE10(i)\sPreis + " |-> " +
		 	      stStationsGasE10(i)\sMarke + ", " + stStationsGasE10(i)\sName + ", " + stStationsGasE10(i)\sStrasse + ", " +
		 	      stStationsGasE10(i)\sPLZ + " " + stStationsGasE10(i)\sOrt
		Next i
 		
		Debug "-------------------"
		Debug "Spritpreise der 5 günstigsten Tankstellen im Umkreis für folgende Adresse: Turmstraße 11, 4020 Linz, Österreich"
		Debug "Diesel"
		iStationCount = GetStationsAT("48.2790109", "14.3151684948887", #FUEL_DIESEL_AT, stStationsDiesel())
		If iStationCOunt > 5 : iStationCOunt = 5 : EndIf
		For i = 0 To iStationCount - 1
		 	Debug "Platz " + Str(stStationsDiesel(i)\iRang)+ ": € " + stStationsDiesel(i)\sPreis + " |-> " +
		 	      stStationsDiesel(i)\sMarke + ", " + stStationsDiesel(i)\sName + ", " + stStationsDiesel(i)\sStrasse + ", " +
		 	      stStationsDiesel(i)\sPLZ + " " + stStationsDiesel(i)\sOrt
		Next i
		
		Debug ""
		Debug "Super (es gibt in Österreich nur eine Sorte Super)"
		iStationCOunt = GetStationsAT("48.2790109", "14.3151684948887", #FUEL_SUPER_AT, stStationsSuper())
		If iStationCOunt > 5 : iStationCOunt = 5 : EndIf
		For i = 0 To iStationCount - 1
		 	Debug "Platz " + Str(stStationsSuper(i)\iRang)+ ": € " + stStationsSuper(i)\sPreis + " |-> " +
		 	      stStationsSuper(i)\sMarke + ", " + stStationsSuper(i)\sName + ", " + stStationsSuper(i)\sStrasse + ", " +
		 	      stStationsSuper(i)\sPLZ + " " + stStationsSuper(i)\sOrt
		Next i
		
		Debug ""
		Debug "CNG Gas"
		iStationCOunt = GetStationsAT("48.2790109", "14.3151684948887", #FUEL_CNGGAS_AT, stStationsGasE10())
		If iStationCOunt > 5 : iStationCOunt = 5 : EndIf
		For i = 0 To iStationCount - 1
		 	Debug "Platz " + Str(stStationsGasE10(i)\iRang)+ ": € " + stStationsGasE10(i)\sPreis + " |-> " +
		 	      stStationsGasE10(i)\sMarke + ", " + stStationsGasE10(i)\sName + ", " + stStationsGasE10(i)\sStrasse + ", " +
		 	      stStationsGasE10(i)\sPLZ + " " + stStationsGasE10(i)\sOrt
		 Next i
		 
		 UnuseModule GasStationsPrices
	EndProcedure
	
	Main()
CompilerEndIf
Gruß Kurzer
Zuletzt geändert von Kurzer am 19.04.2019 11:25, insgesamt 2-mal geändert.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Modul: Ermitteln von Tankstellenpreisen im Umkreis DE/AT

Beitrag von Nino »

Kurzer hat geschrieben:Der Moddulcode liegt aus Platzgründen als Base64 kodierte Zip-Datei vor (Originalgröße des Moduls = 21107 Bytes).
Hinweis: Das ist für Codes in durchschnittlicher Größe (wie diesen) nicht nötig:
Seite zum Verfassen einer Nachricht im PB-Forum hat geschrieben:Geben Sie Ihre Nachricht hier ein. Sie darf nicht mehr als 60000 Zeichen enthalten.
Und man hat im Forum ja doch irgendwie mehr davon, wenn man die Codes lesen kann. ;-)
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Modul: Ermitteln von Tankstellenpreisen im Umkreis DE/AT

Beitrag von Mijikai »

Kein Interesse an Code den ich erst lesbar machen muss...
Macht das Forum sinnlos - am besten gleich bei einem Filehoster als Download bereitstellen.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Modul: Ermitteln von Tankstellenpreisen im Umkreis DE/AT

Beitrag von Kurzer »

Kurzer hat geschrieben:Der Moddulcode liegt aus Platzgründen als Base64 kodierte Zip-Datei vor (Originalgröße des Moduls = 21107 Bytes).
Mijikai hat geschrieben:Kein Interesse an Code den ich erst lesbar machen muss...
Macht das Forum sinnlos - am besten gleich bei einem Filehoster als Download bereitstellen.
Okay, die Kritik ist akzeptiert. Bei einem Einzelsourcecode ist eine Kodierung nicht zwingend nötig und ich kann nicht erwarten, dass jeder meinen Hang zum Platzsparen teilt. :)

Ich werde den Code im Ursprungspost wieder unkodiert einfügen. Für Projekte, die aus mehreren Dateien bestehen, würde ich eine kodierte ZIP Datei dennoch bevorzugen, anstatt mehre Einzelsourcecodes im Post zu selektieren und sie in die IDE zu kopieren, um sie dann jeweils unter den entsprechenden Namen in einem Projektverzeichnis zu speichern.

Gruß Kurzer
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Modul: Ermitteln von Tankstellenpreisen im Umkreis DE/AT

Beitrag von Nino »

Kurzer hat geschrieben:Bei einem Einzelsourcecode ist eine Kodierung nicht zwingend nötig
"Zwingend nötig" sowieso nicht ... aber v.a. auch nicht besonders sinnvoll.
Kurzer hat geschrieben:und ich kann nicht erwarten, dass jeder meinen Hang zum Platzsparen teilt. :)
Platzsparen sollte (zumindest in diesem Zusammenhang) kein Selbstzweck sein. Ansonsten wäre dies hier der ultimative platzsparende Code: :lol:
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Modul: Ermitteln von Tankstellenpreisen im Umkreis DE/AT

Beitrag von mk-soft »

Nino hat geschrieben:.... Ansonsten wäre dies hier der ultimative platzsparende Code: :lol:
Mit absoluter Komprimierung 8)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Modul: Ermitteln von Tankstellenpreisen im Umkreis DE/AT

Beitrag von Kurzer »

Ach, das ist ja alles noch viel zu groß.
Die ultimativste Kompressionsrate hat offensichtlich der Post zwischen diesem Post hier und dem Post von mk-soft da oben. :lol:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2023: 56 Jahre.
Antworten