<!DOCTYPE html>

<html lang="de">

	<head>

		<meta http-equiv="content-type" content="text/html" charset="UTF-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" >

		<link rel="profile" href="http://gmpg.org/xfn/11">

		<title>geocoding &#8211; Allround-Blog</title>
<meta name='robots' content='max-image-preview:large' />
	<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
	<link rel='dns-prefetch' href='//stats.wp.com' />
<link rel='dns-prefetch' href='//www.googletagmanager.com' />
<link rel="alternate" type="application/rss+xml" title="Allround-Blog &raquo; Feed" href="https://allround-blog.de/feed/" />
<link rel="alternate" type="application/rss+xml" title="Allround-Blog &raquo; Kommentar-Feed" href="https://allround-blog.de/comments/feed/" />
<link rel="alternate" type="application/rss+xml" title="Allround-Blog &raquo; geocoding Schlagwort-Feed" href="https://allround-blog.de/tag/geocoding/feed/" />
<script type="text/javascript">
/* <![CDATA[ */
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.1.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/15.1.0\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/allround-blog.de\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.8"}};
/*! This file is auto-generated */
!function(i,n){var o,s,e;function c(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function p(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data),r=(e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0),new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data));return t.every(function(e,t){return e===r[t]})}function u(e,t,n){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\uddfa\ud83c\uddf3","\ud83c\uddfa\u200b\ud83c\uddf3")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!n(e,"\ud83d\udc26\u200d\ud83d\udd25","\ud83d\udc26\u200b\ud83d\udd25")}return!1}function f(e,t,n){var r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):i.createElement("canvas"),a=r.getContext("2d",{willReadFrequently:!0}),o=(a.textBaseline="top",a.font="600 32px Arial",{});return e.forEach(function(e){o[e]=t(a,e,n)}),o}function t(e){var t=i.createElement("script");t.src=e,t.defer=!0,i.head.appendChild(t)}"undefined"!=typeof Promise&&(o="wpEmojiSettingsSupports",s=["flag","emoji"],n.supports={everything:!0,everythingExceptFlag:!0},e=new Promise(function(e){i.addEventListener("DOMContentLoaded",e,{once:!0})}),new Promise(function(t){var n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"}),a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=function(e){c(n=e.data),a.terminate(),t(n)})}catch(e){}c(n=f(s,u,p))}t(n)}).then(function(e){for(var t in e)n.supports[t]=e[t],n.supports.everything=n.supports.everything&&n.supports[t],"flag"!==t&&(n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&n.supports[t]);n.supports.everythingExceptFlag=n.supports.everythingExceptFlag&&!n.supports.flag,n.DOMReady=!1,n.readyCallback=function(){n.DOMReady=!0}}).then(function(){return e}).then(function(){var e;n.supports.everything||(n.readyCallback(),(e=n.source||{}).concatemoji?t(e.concatemoji):e.wpemoji&&e.twemoji&&(t(e.twemoji),t(e.wpemoji)))}))}((window,document),window._wpemojiSettings);
/* ]]> */
</script>
<style id='wp-emoji-styles-inline-css' type='text/css'>

	img.wp-smiley, img.emoji {
		display: inline !important;
		border: none !important;
		box-shadow: none !important;
		height: 1em !important;
		width: 1em !important;
		margin: 0 0.07em !important;
		vertical-align: -0.1em !important;
		background: none !important;
		padding: 0 !important;
	}
</style>
<link rel='stylesheet' id='wp-block-library-css' href='https://allround-blog.de/wp-content/plugins/gutenberg/build/styles/block-library/style.min.css?ver=23.2.2' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
.wp-block-button__link{background-color:#32373c;border-radius:9999px;box-shadow:none;color:#fff;font-size:1.125em;padding:calc(.667em + 2px) calc(1.333em + 2px);text-decoration:none}.wp-block-file__button{background:#32373c;color:#fff}.wp-block-accordion-heading{margin:0}.wp-block-accordion-heading__toggle{background-color:inherit!important;color:inherit!important}.wp-block-accordion-heading__toggle:not(:focus-visible){outline:none}.wp-block-accordion-heading__toggle:focus,.wp-block-accordion-heading__toggle:hover{background-color:inherit!important;border:none;box-shadow:none;color:inherit;padding:var(--wp--preset--spacing--20,1em) 0;text-decoration:none}.wp-block-accordion-heading__toggle:focus-visible{outline:auto;outline-offset:0}.wp-block-tab:not(.has-text-color){color:inherit!important}.wp-block-tab:not(.has-background){background-color:inherit!important}.wp-block-tab:focus,.wp-block-tab:hover{text-decoration:none}.wp-block-tab:focus-visible{outline:auto;outline-offset:0}
</style>
<link rel='stylesheet' id='jetpack-forms-layout-css' href='https://allround-blog.de/wp-content/plugins/jetpack/jetpack_vendor/automattic/jetpack-forms/src/../dist/contact-form/css/jetpack-forms-layout.css?ver=15.8' type='text/css' media='all' />
<link rel='stylesheet' id='mediaelement-css' href='https://allround-blog.de/wp-includes/js/mediaelement/mediaelementplayer-legacy.min.css?ver=4.2.17' type='text/css' media='all' />
<link rel='stylesheet' id='wp-mediaelement-css' href='https://allround-blog.de/wp-includes/js/mediaelement/wp-mediaelement.min.css?ver=6.8' type='text/css' media='all' />
<style id='jetpack-sharing-buttons-style-inline-css' type='text/css'>
.jetpack-sharing-buttons__services-list{display:flex;flex-direction:row;flex-wrap:wrap;gap:0;list-style-type:none;margin:5px;padding:0}.jetpack-sharing-buttons__services-list.has-small-icon-size{font-size:12px}.jetpack-sharing-buttons__services-list.has-normal-icon-size{font-size:16px}.jetpack-sharing-buttons__services-list.has-large-icon-size{font-size:24px}.jetpack-sharing-buttons__services-list.has-huge-icon-size{font-size:36px}@media print{.jetpack-sharing-buttons__services-list{display:none!important}}.editor-styles-wrapper .wp-block-jetpack-sharing-buttons{gap:0;padding-inline-start:0}ul.jetpack-sharing-buttons__services-list.has-background{padding:1.25em 2.375em}
</style>
<style id='global-styles-inline-css' type='text/css'>
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #fff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--color--accent: #1abc9c;--wp--preset--color--dark-gray: #444;--wp--preset--color--medium-gray: #666;--wp--preset--color--light-gray: #888;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,0) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 16px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 24px;--wp--preset--font-size--x-large: 42px;--wp--preset--font-size--regular: 19px;--wp--preset--font-size--larger: 32px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-accent-color{color: var(--wp--preset--color--accent) !important;}.has-dark-gray-color{color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-color{color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-color{color: var(--wp--preset--color--light-gray) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-accent-background-color{background-color: var(--wp--preset--color--accent) !important;}.has-dark-gray-background-color{background-color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-background-color{background-color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-background-color{background-color: var(--wp--preset--color--light-gray) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-accent-border-color{border-color: var(--wp--preset--color--accent) !important;}.has-dark-gray-border-color{border-color: var(--wp--preset--color--dark-gray) !important;}.has-medium-gray-border-color{border-color: var(--wp--preset--color--medium-gray) !important;}.has-light-gray-border-color{border-color: var(--wp--preset--color--light-gray) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}.has-regular-font-size{font-size: var(--wp--preset--font-size--regular) !important;}.has-larger-font-size{font-size: var(--wp--preset--font-size--larger) !important;}
:root :where(.wp-block-icon svg){width: 24px;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-term-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-term-template.is-layout-grid){gap: 1.25em;}
</style>
<link rel='stylesheet' id='enlighterjs-css' href='https://allround-blog.de/wp-content/plugins/enlighter/cache/enlighterjs.min.css?ver=fn+b0MXDe0j/NUW' type='text/css' media='all' />
<link rel='stylesheet' id='hemingway_googleFonts-css' href='https://allround-blog.de/wp-content/themes/hemingway/assets/css/fonts.css' type='text/css' media='all' />
<link rel='stylesheet' id='hemingway_style-css' href='https://allround-blog.de/wp-content/themes/hemingway/style.css?ver=2.3.2' type='text/css' media='all' />
<script type="text/javascript" src="https://allround-blog.de/wp-content/plugins/strato-assistant/js/cookies.js?ver=1728459796" id="strato-assistant-wp-cookies-js"></script>
<script type="text/javascript" src="https://allround-blog.de/wp-includes/js/jquery/jquery.min.js?ver=3.7.1" id="jquery-core-js"></script>
<script type="text/javascript" src="https://allround-blog.de/wp-includes/js/jquery/jquery-migrate.min.js?ver=3.4.1" id="jquery-migrate-js"></script>
<link rel="https://api.w.org/" href="https://allround-blog.de/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://allround-blog.de/wp-json/wp/v2/tags/32" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://allround-blog.de/xmlrpc.php?rsd" />
<meta name="generator" content="WordPress 6.8" />
<meta name="generator" content="Site Kit by Google 1.179.0" />	<style>img#wpstats{display:none}</style>
		<style type="text/css" id="custom-background-css">
body.custom-background { background-image: url("https://allround-blog.de/wp-content/uploads/2024/10/background1.png"); background-position: center top; background-size: auto; background-repeat: no-repeat; background-attachment: fixed; }
</style>
	<link rel="icon" href="https://allround-blog.de/wp-content/uploads/2024/10/cropped-sprechblasen-favicon-32x32.webp" sizes="32x32" />
<link rel="icon" href="https://allround-blog.de/wp-content/uploads/2024/10/cropped-sprechblasen-favicon-192x192.webp" sizes="192x192" />
<link rel="apple-touch-icon" href="https://allround-blog.de/wp-content/uploads/2024/10/cropped-sprechblasen-favicon-180x180.webp" />
<meta name="msapplication-TileImage" content="https://allround-blog.de/wp-content/uploads/2024/10/cropped-sprechblasen-favicon-270x270.webp" />

	</head>
	
	<body class="archive tag tag-geocoding tag-32 custom-background wp-theme-hemingway show-sidebar-on-mobile">

		
		<a class="skip-link button" href="#site-content">Zum Inhalt springen</a>
	
		<div class="big-wrapper">
	
			<div class="header-cover section bg-dark-light no-padding">

						
				<div class="header section" style="background-image: url( https://allround-blog.de/wp-content/uploads/2024/10/cropped-20230701_052808-scaled-1.jpg );">
							
					<div class="header-inner section-inner">
					
											
							<div class="blog-info">
							
																	<div class="blog-title">
										<a href="https://allround-blog.de" rel="home">Allround-Blog</a>
									</div>
																
																	<p class="blog-description">ein buntes Themenspektrum</p>
															
							</div><!-- .blog-info -->
							
															
					</div><!-- .header-inner -->
								
				</div><!-- .header -->
			
			</div><!-- .bg-dark -->
			
			<div class="navigation section no-padding bg-dark">
			
				<div class="navigation-inner section-inner group">
				
					<div class="toggle-container section-inner hidden">
			
						<button type="button" class="nav-toggle toggle">
							<div class="bar"></div>
							<div class="bar"></div>
							<div class="bar"></div>
							<span class="screen-reader-text">Mobile-Menü ein-/ausblenden</span>
						</button>
						
						<button type="button" class="search-toggle toggle">
							<div class="metal"></div>
							<div class="glass"></div>
							<div class="handle"></div>
							<span class="screen-reader-text">Suchfeld ein-/ausblenden</span>
						</button>
											
					</div><!-- .toggle-container -->
					
					<div class="blog-search hidden">
						<form role="search" method="get" class="search-form" action="https://allround-blog.de/">
				<label>
					<span class="screen-reader-text">Suche nach:</span>
					<input type="search" class="search-field" placeholder="Suchen …" value="" name="s" />
				</label>
				<input type="submit" class="search-submit" value="Suchen" />
			</form>					</div><!-- .blog-search -->
				
					<ul class="blog-menu">
						<li class="page_item page-item-3"><a href="https://allround-blog.de/privacy-policy/">Impressum</a></li>
					 </ul><!-- .blog-menu -->
					 
					 <ul class="mobile-menu">
					
						<li class="page_item page-item-3"><a href="https://allround-blog.de/privacy-policy/">Impressum</a></li>
						
					 </ul><!-- .mobile-menu -->
				 
				</div><!-- .navigation-inner -->
				
			</div><!-- .navigation -->
<main class="wrapper section-inner group" id="site-content">

	<div class="content left">
		
		<div class="posts">

			
				<header class="archive-header">

											<h1 class="archive-title">Schlagwort: <span>geocoding</span></h1>
					
										
				</header><!-- .archive-header -->

				<article id="post-267" class="post-267 post type-post status-publish format-standard hentry category-software category-wetter category-wetter-app-entwicklung tag-android tag-geocoding post-preview">

	<div class="post-header">

		
					
				<h2 class="post-title entry-title">
											<a href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/" rel="bookmark">Deine Flutter Wetter-App: Schritt für Schritt – Teil 4</a>
									</h2>

							
			<div class="post-meta">
			
				<span class="post-date"><a href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/">06.05.2025</a></span>
				
				<span class="date-sep"> / </span>
					
				<span class="post-author"><a href="https://allround-blog.de/author/hschewe/" title="Beiträge von Heinrich Schewe" rel="author">Heinrich Schewe</a></span>

				
					<span class="date-sep"> / </span>
				
					<a href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/#comments">1 Kommentar</a>
								
														
			</div><!-- .post-meta -->

					
	</div><!-- .post-header -->
																					
	<div class="post-content entry-content">
	
		
<h3 class="wp-block-heading"><strong>Teil 4: Mehr Orte, mehr Möglichkeiten – Adresssuche hinzufügen</strong></h3>



<p class="wp-block-paragraph">Hallo und willkommen zurück zu unserer Flutter-Wetter-App-Serie!</p>



<p class="wp-block-paragraph">Im <a href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-3/">letzten Teil</a> haben wir einen riesigen Schritt gemacht: Wir haben die Standard-Demo-App durch unsere eigene ersetzt, eine solide Architektur aufgebaut und die aktuelle Temperatur für unseren GPS-Standort angezeigt. Dabei haben wir viel über eine saubere Architektur, State Management mit Riverpod und Fehlerbehandlung gelernt.</p>



<p class="wp-block-paragraph">Doch eine Wetter-App ist erst richtig nützlich, wenn wir das Wetter für <em>beliebige</em> Orte nachschlagen können. Genau das packen wir heute an! Wir erweitern unsere App um eine <strong>Adresssuche</strong>.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="958" height="530" data-attachment-id="284" data-permalink="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/attachment/grafik/" data-orig-file="https://allround-blog.de/wp-content/uploads/2025/04/grafik.png" data-orig-size="958,530" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="App Teil 4" data-image-description="" data-image-caption="" data-large-file="https://allround-blog.de/wp-content/uploads/2025/04/grafik.png" src="https://allround-blog.de/wp-content/uploads/2025/04/grafik.png" alt="" class="wp-image-284" srcset="https://allround-blog.de/wp-content/uploads/2025/04/grafik.png 958w, https://allround-blog.de/wp-content/uploads/2025/04/grafik-300x166.png 300w, https://allround-blog.de/wp-content/uploads/2025/04/grafik-768x425.png 768w, https://allround-blog.de/wp-content/uploads/2025/04/grafik-676x374.png 676w" sizes="(max-width: 958px) 100vw, 958px" /></figure>



<p class="wp-block-paragraph"><strong>Das Ziel für heute:</strong></p>



<ul class="wp-block-list">
<li>Wir untersuchen den Code für Teil 4 aus unserem Repository.</li>



<li>Wir verstehen, wie das <strong>Suchfeld</strong> zur Benutzeroberfläche hinzugefügt wurde.</li>



<li>Wir lernen <strong>Geocoding</strong>: Wie eine Adresse (&#8222;München&#8220;) in Koordinaten (Latitude/Longitude) umgewandelt wird.</li>



<li>Wir verfolgen, wie die <strong>App-Logik und Datenbeschaffung</strong> angepasst wurden, um Wetterdaten für gesuchte Orte abzurufen.</li>



<li>Wir sehen, wie <strong>Fehler bei der Suche</strong> (z.B. &#8222;Adresse nicht gefunden&#8220;) behandelt werden.</li>
</ul>



<p class="wp-block-paragraph"><strong>Warum dieser Schritt wichtig ist:</strong></p>



<p class="wp-block-paragraph">Dieser Teil zeigt, wie eine gut geplante Architektur Früchte trägt. Wir müssen nicht alles neu erfinden, sondern können auf unserem bestehenden Fundament aufbauen und gezielt Erweiterungen hinzufügen. Außerdem lernen wir eine weitere wichtige Funktion vieler Apps kennen: die Verarbeitung von Benutzereingaben und die Umwandlung von Text in geografische Daten.</p>



<h3 class="wp-block-heading"><strong>Schritt 1: Den Code für Teil 4 holen</strong></h3>



<p class="wp-block-paragraph">Der gesamte Code für diesen Beitrag ist wieder im Git-Repository vorbereitet.</p>



<p class="wp-block-paragraph">1. <strong>Öffne ein Terminal</strong> in deinem Projektordner (<code>flutter_weather_app_blog</code>).</p>



<p class="wp-block-paragraph">2. <strong>Stelle sicher, dass du keine lokalen Änderungen hast, die du behalten willst</strong> (ggf. <code>git stash</code>).</p>



<p class="wp-block-paragraph">3. <strong>Wechsle zum <code>main</code>-Branch</strong> (um sicher vom letzten stabilen Punkt auszugehen):</p>


<pre data-enlighter-language="bash" class="EnlighterJSRAW">
git checkout main
git pull origin main
</pre>



<p class="wp-block-paragraph">4. <strong>Checke den Code-Stand für Teil 4 aus:</strong> </p>


<pre data-enlighter-language="bash" class="EnlighterJSRAW">
git checkout part4-address-search
</pre>



<p class="wp-block-paragraph"><em>(Zur Erinnerung: Die &#8218;detached HEAD&#8216;-Meldung ist normal und bedeutet, dass du einen spezifischen Punkt in der Projekthistorie betrachtest.)</em></p>



<p class="wp-block-paragraph">5. <strong>Ganz wichtig: Abhängigkeiten holen &amp; Code generieren:</strong> Wir haben eine neue Bibliothek hinzugefügt und Code geändert, der generiert werden muss. Führe diese beiden Befehle aus:</p>


<pre data-enlighter-language="bash" class="EnlighterJSRAW">
flutter pub get
dart run build_runner build --delete-conflicting-outputs
</pre>



<p class="wp-block-paragraph">Öffne das Projekt jetzt in VS Code. Lass uns die Neuerungen erkunden!</p>



<h3 class="wp-block-heading"><strong>Schritt 2: Was ist neu? Der Überblick</strong></h3>



<p class="wp-block-paragraph">Wenn du die App jetzt startest (<code>F5</code> in VS Code), wirst du sofort die Änderungen sehen:</p>



<ul class="wp-block-list">
<li>Ein <strong>Suchfeld</strong> ist oben erschienen.</li>



<li>Ein <strong>&#8222;Mein Standort&#8220;-Button</strong> (ein kleines Fadenkreuz-Icon) befindet sich nun oben rechts in der AppBar.</li>
</ul>



<p class="wp-block-paragraph">Unter der Oberfläche sind die wesentlichen Anpassungen:</p>



<ul class="wp-block-list">
<li><strong>Neues Paket:</strong> Wir nutzen das <code>geocoding</code>-Paket.</li>



<li><strong>UI-Anpassungen:</strong> Der Hauptbildschirm (<code>WeatherScreen</code>) wurde umgebaut, um das Suchfeld und den neuen Button zu integrieren. Ein neues Widget (<code>SearchBarWidget</code>) wurde erstellt.</li>



<li><strong>Geocoding-Logik:</strong> Neue Funktionen im <code>LocationService</code> und <code>WeatherRepository</code> wandeln Adressen in Koordinaten um.</li>



<li><strong>State Management Update:</strong> Der <code>WeatherNotifier</code> kann nun Suchanfragen verarbeiten.</li>



<li><strong>Intelligentere Refresh-Funktion:</strong> Aktualisiert jetzt immer den zuletzt angezeigten Ort.</li>



<li><strong>Erweiterte Fehlerbehandlung:</strong> Erkennt und meldet Fehler bei der Adresssuche.</li>
</ul>



<h3 class="wp-block-heading"><strong>Schritt 3: Die neue Zutat – Das <code>geocoding</code>-Paket</strong></h3>



<p class="wp-block-paragraph">Wie wird aus dem Text &#8222;Hamburg&#8220; ein Paar von Koordinaten (Breitengrad, Längengrad), das unsere Wetter-API versteht? Durch <strong>Geocoding</strong>.</p>



<ul class="wp-block-list">
<li><strong><code>pubspec.yaml</code>:</strong> In dieser Datei (dem &#8222;Rezeptbuch&#8220; unserer App) haben wir eine neue Zutat hinzugefügt:</li>
</ul>


<pre data-enlighter-language="yaml" class="EnlighterJSRAW">
dependencies:
# … andere Pakete …
geocoding: ^3.0.0 # Version prüfen
</pre>



<p class="wp-block-paragraph">Dieses Paket erlaubt uns, die eingebauten Geocoding-Funktionen von Android zu verwenden. Der Befehl <code>flutter pub get</code> hat dieses Paket heruntergeladen und für unser Projekt verfügbar gemacht.</p>



<h3 class="wp-block-heading"><strong>Schritt 4: Die Benutzeroberfläche (<code>presentation</code>) – Ein Platz für die Suche</strong></h3>



<p class="wp-block-paragraph">Schauen wir uns an, wie die Benutzeroberfläche in <code>lib/src/features/weather/presentation/</code> angepasst wurde.</p>



<p class="wp-block-paragraph"><strong><code>widgets/search_bar.dart</code> (NEU):</strong></p>



<p class="wp-block-paragraph">Um den Code aufgeräumt zu halten, haben wir ein eigenes Widget für die Suchleiste erstellt. Es ist ein einfaches <code>TextField</code>, aber schön verpackt mit einem Such-Icon (<code>prefixIcon</code>), einem Senden-Icon (<code>suffixIcon</code>) und abgerundeten Ecken (<code>InputDecoration</code>).</p>



<p class="wp-block-paragraph"><strong>Wichtige Parameter:</strong></p>



<ul class="wp-block-list">
<li><code>controller</code>: Ein <code>TextEditingController</code>, um den Text im Feld zu steuern.</li>



<li><code>onSearch</code>: Eine Funktion, die aufgerufen wird, wenn der Nutzer auf das Senden-Icon tippt oder auf der Tastatur &#8222;Suchen&#8220; auswählt.</li>



<li><code>isLoading</code>: Ein <code>bool</code>, um das Feld und den Button zu deaktivieren, während die App Daten lädt.</li>
</ul>


<pre data-enlighter-language="dart" class="EnlighterJSRAW">
// lib/src/features/weather/presentation/widgets/search_bar.dart
import &#039;package:flutter/material.dart&#039;;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
class SearchBarWidget extends StatelessWidget {
final TextEditingController controller;
final Function(String) onSearch;
final bool isLoading;
final String hintText;

const SearchBarWidget({ /* … Konstruktor … */ });

@override
Widget build(BuildContext context) {
return TextField(
controller: controller,
enabled: !isLoading, // Deaktivieren bei Ladevorgang
decoration: InputDecoration(
hintText: hintText,
prefixIcon: const Icon(Icons.search),
// … weitere Styling-Details …
suffixIcon: isLoading
? /* Ladeindikator */
: IconButton(
icon: const Icon(Icons.send),
onPressed: isLoading ? null : () =&gt; onSearch(controller.text),
),
),
textInputAction: TextInputAction.search,
onSubmitted: isLoading ? null : onSearch, // Suche auch bei Enter
);
}
}
</pre>



<p class="wp-block-paragraph"><strong><code>screens/weather_screen.dart</code>:</strong> Hier passieren mehrere Dinge:</p>



<ul class="wp-block-list">
<li>C<strong>ontroller Management:</strong> Im <code>_WeatherScreenState</code> wird ein <code>TextEditingController</code> erstellt:</li>
</ul>


<pre data-enlighter-language="dart" class="EnlighterJSRAW">
final TextEditingController _searchController = TextEditingController();
</pre>



<ul class="wp-block-list">
<li><strong>Ganz wichtig:</strong> Controller speichern Ressourcen und müssen freigegeben werden, wenn das Widget zerstört wird. Das geschieht in der <code>dispose</code>-Methode:</li>
</ul>


<pre data-enlighter-language="dart" class="EnlighterJSRAW">
@override
void dispose() {
_searchController.dispose(); // Controller aufräumen!
super.dispose();
}
</pre>



<ul class="wp-block-list">
<li><strong>Layout Anpassung:</strong> Die <code>build</code>-Methode des Screens enthält jetzt eine <code>Column</code>. Das erste Kind dieser <code>Column</code> ist ein <code>Padding</code>, das unser neues <code>SearchBarWidget</code> enthält. Darunter folgen der <code>LocationHeader</code> und der <code>Expanded</code>-Bereich für den Hauptinhalt (Wetteranzeige oder Fehler).</li>
</ul>


<pre data-enlighter-language="dart" class="EnlighterJSRAW">
// lib/src/features/weather/presentation/screens/weather_screen.dart (Ausschnitt build)
@override
Widget build(BuildContext context) {
final weatherState = ref.watch(weatherNotifierProvider);
final weatherNotifier = ref.read(weatherNotifierProvider.notifier);

return Scaffold(
appBar: AppBar( /* … mit Buttons … &lt;em&gt;/ ),
body: Column( // NEU: Column für vertikale Anordnung
children: [
// Suchleiste oben
Padding(
padding: const EdgeInsets.all(12.0),
child: SearchBarWidget(
controller: _searchController,
isLoading: weatherState.status == WeatherStatus.loading,
onSearch: (query) { // Was passiert bei Suche?
if (query.trim().isNotEmpty) {
_log.info(&#039;Screen: Suche ausgelöst für &quot;$query&quot;&#039;);
FocusScope.of(context).unfocus(); // Tastatur weg
// Aktion im Notifier auslösen!
weatherNotifier.fetchWeatherForAddress(query);
} else {
_showSnackbar(&quot;Bitte einen Ort oder eine Adresse eingeben.&quot;);
}
},
),
),
// Ort anzeigen
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 4.0),
child: LocationHeader( /&lt;/em&gt; … &lt;em&gt;/ ),
),
// Restlicher Inhalt (nimmt verfügbaren Platz ein)
Expanded(
child: RefreshIndicator( /&lt;/em&gt; … */ ),
),
],
),
);
}
</pre>



<ul class="wp-block-list">
<li><strong>Neue AppBar-Aktion:</strong> Der &#8222;Mein Standort&#8220;-Button (<code>IconButton</code> mit <code>Icons.my_location</code>) wurde zur <code>AppBar</code> hinzugefügt. Sein <code>onPressed</code> ruft einfach <code>weatherNotifier.fetchWeatherForCurrentLocation()</code>, die Methode, die wir schon aus Teil 3 kennen.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Fehlerbehandlung:</strong> Das <code>_buildErrorWidget</code> wurde angepasst. Es prüft nun zusätzlich, ob der <code>failure</code> vom Typ <code>GeocodingFailure</code> ist. Wenn ja, zeigt es eine spezifische Meldung (z.B. &#8222;Adresse &#8218;XYZ&#8216; konnte nicht gefunden werden.&#8220;) und ein passendes Icon (<code>Icons.wrong_location_outlined</code>). Da der Nutzer in diesem Fall eine neue, korrekte Suche starten muss, gibt es hier keinen &#8222;Erneut versuchen&#8220;-Button.</li>
</ul>



<h3 class="wp-block-heading"><strong>Schritt 5: Die Datenbeschaffung (<code>core</code>, <code>data</code>, <code>domain</code>) – Adresse zu Koordinaten</strong></h3>



<p class="wp-block-paragraph">Das ist das technische Herzstück der neuen Funktion. Wie kommen wir von &#8222;Paris&#8220; zu Längen- und Breitengrad?</p>



<ol class="wp-block-list">
<li><strong><code>LocationService</code> (<code>lib/src/core/location/location_service.dart</code>):</strong>
<ul class="wp-block-list">
<li>Dieser Service ist nun der Experte für <em>alle</em> Standort-bezogenen Aufgaben. Er hat die neue Methode <code>getCoordinatesFromAddress</code> bekommen.</li>



<li><strong>Wie sie funktioniert:</strong> Sie nutzt intern die Funktion <code>locationFromAddress</code> aus dem <code>geocoding</code>-Paket. Dieses Paket kommuniziert mit den nativen Diensten von Android, um die Koordinaten zu ermitteln.</li>



<li><strong>Fehlerbehandlung:</strong> Wenn das <code>geocoding</code>-Paket die Adresse nicht kennt, wirft es eine <code>NoResultFoundException</code>. Unser <code>LocationService</code> fängt diesen spezifischen Fehler und wirft stattdessen unsere eigene, definierte <code>GeocodingException</code>. Das ist wichtig, damit der Rest unserer App nicht die Interna des <code>geocoding</code>-Pakets kennen muss. Andere Fehler (z.B. Netzwerkprobleme während des Geocodings) werden ebenfalls als <code>GeocodingException</code> gefangen.</li>



<li><strong>Reverse Geocoding:</strong> Die Methode <code>getAddressFromCoordinates</code>, die wir in Teil 3 nur als Platzhalter hatten, ist jetzt <em>auch</em> implementiert. Sie nutzt <code>placemarkFromCoordinates</code> aus dem <code>geocoding</code>-Paket, um aus Koordinaten wieder eine lesbare Adresse zu machen. Das wird genutzt, um den Anzeigenamen im <code>LocationHeader</code> potenziell zu verbessern (z.B. aus Koordinaten wird &#8222;Berlin, Deutschland&#8220;).</li>
</ul>
</li>



<li><strong>Fehlerklassen (<code>lib/src/core/error/</code>)</strong>:
<ul class="wp-block-list">
<li>Wir haben <code>GeocodingException</code> (für technische Geocoding-Fehler) und <code>GeocodingFailure</code> (die abstraktere Form für unsere App-Logik) hinzugefügt.</li>
</ul>
</li>



<li><strong><code>WeatherRepository</code> (Interface &amp; Implementierung):</strong>
<ul class="wp-block-list">
<li>Das Interface (<code>domain/repositories/weather_repository.dart</code>) wurde um die Methode <code>getCoordinatesForAddress</code> erweitert – unser Repository muss diese Fähigkeit nun anbieten.</li>



<li>Die Implementierung (<code>data/repositories/weather_repository_impl.dart</code>) erfüllt diesen Vertrag:
<ul class="wp-block-list">
<li>Die <code>getCoordinatesForAddress</code>-Methode ruft <code>_locationService.getCoordinatesFromAddress</code> auf.</li>



<li>Sie fängt die <code>GeocodingException</code> vom Service.</li>



<li>Sie gibt das Ergebnis als <code>Either</code> zurück: <code>Left(GeocodingFailure(...))</code> im Fehlerfall oder <code>Right(LocationInfo(...))</code> bei Erfolg.</li>



<li><strong>Wichtig:</strong> Bei Erfolg versucht sie noch, den <code>displayName</code> des <code>LocationInfo</code>-Objekts durch einen Aufruf von <code>getLocationDisplayName</code> (also Reverse Geocoding) zu verfeinern, bevor sie das Ergebnis zurückgibt.</li>
</ul>
</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading"><strong>Schritt 6: Die Logik (<code>application</code>) – Suche und Wetter verknüpfen</strong></h3>



<p class="wp-block-paragraph">Der <code>WeatherNotifier</code> (<code>lib/src/features/weather/application/weather_notifier.dart</code>) dirigiert das Zusammenspiel.</p>



<ul class="wp-block-list">
<li><strong>Neue Methode <code>fetchWeatherForAddress</code>:</strong>
<ul class="wp-block-list">
<li>Das ist die Reaktion auf die Nutzereingabe im Suchfeld.</li>



<li>Sie prüft, ob überhaupt etwas eingegeben wurde und ob gerade schon geladen wird.</li>



<li>Sie setzt den <code>state</code> auf <code>loading</code>.</li>



<li><strong>Kernschritt 1:</strong> Sie ruft <code>_weatherRepository.getCoordinatesForAddress(address)</code> auf.</li>



<li><strong>Kernschritt 2:</strong> Sie wertet das zurückgegebene <code>Either</code> aus:
<ul class="wp-block-list">
<li>Bei <code>Left(failure)</code> (z.B. <code>GeocodingFailure</code>): Der <code>state</code> wird auf <code>failure</code> gesetzt, die UI zeigt den Fehler.</li>



<li>Bei <code>Right(locationInfo)</code> (Koordinaten erfolgreich gefunden): Jetzt kommt der Clou! Sie ruft die <strong>bereits vorhandene Methode <code>_fetchWeatherDataAndUpdateState(locationInfo)</code></strong> auf. Diese Methode weiß, wie man Wetterdaten für ein <code>LocationInfo</code>-Objekt holt – egal, ob dieses vom GPS oder vom Geocoding kam. <strong>Das ist Wiederverwendung dank guter Architektur!</strong></li>
</ul>
</li>
</ul>
</li>



<li><strong>Angepasste Methode <code>refreshWeatherData</code>:</strong>
<ul class="wp-block-list">
<li>Diese Methode wurde intelligenter. Zuvor hat sie einfach immer den GPS-Standort neu geladen.</li>



<li><strong>Jetzt:</strong> Sie schaut sich den <code>state.selectedLocation</code> an (der ja nach einer erfolgreichen Suche den gesuchten Ort enthält). Sie ruft dann <code>_fetchWeatherDataAndUpdateState</code> für genau diesen gespeicherten Ort auf. Damit funktioniert der Refresh-Button und Pull-to-Refresh immer für den Ort, den der Nutzer gerade sieht.</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><strong>Schritt 7: Der Datenfluss bei der Suche (Zusammenfassung)</strong></h3>



<p class="wp-block-paragraph">Lass uns den Weg einer Suche nachvollziehen:</p>



<ol class="wp-block-list">
<li><strong>Eingabe:</strong> Nutzer tippt &#8222;Rom&#8220; ein und drückt Senden (<code>WeatherScreen</code>).</li>



<li><strong>Aktion:</strong> <code>onSearch</code> ruft <code>notifier.fetchWeatherForAddress("Rom")</code>.</li>



<li><strong>Laden:</strong> Notifier setzt <code>state</code> auf <code>loading</code> (UI zeigt Ladekreis).</li>



<li><strong>Koordinaten holen:</strong> Notifier ruft <code>repo.getCoordinatesForAddress("Rom")</code>.</li>



<li><strong>Geocoding:</strong> Repo ruft <code>service.getCoordinatesFromAddress("Rom")</code>. Service ruft <code>geocoding</code>-Paket, bekommt Koordinaten für Rom.</li>



<li><strong>Reverse Geocoding:</strong> Repo ruft <code>service.getAddressFromCoordinates(...)</code>, bekommt vielleicht &#8222;Rom, Latium, Italien&#8220; zurück.</li>



<li><strong>Erfolg (Koordinaten):</strong> Repo gibt <code>Right(LocationInfo(..., displayName: "Rom, Latium, Italien"))</code> an Notifier zurück.</li>



<li><strong>Wetter holen:</strong> Notifier erhält <code>locationInfo_Rom</code> und ruft <code>_fetchWeatherDataAndUpdateState(locationInfo_Rom)</code>.</li>



<li><strong>API-Anfrage:</strong> Notifier ruft <code>repo.getWeatherForLocation(locationInfo_Rom)</code>. Repo ruft <code>apiService.getCurrentWeather(...)</code> mit Rom-Koordinaten.</li>



<li><strong>API-Antwort:</strong> ApiService holt Daten von Open-Meteo, parst sie.</li>



<li><strong>Erfolg (Wetter):</strong> Repo gibt <code>Right(weatherData_Rom)</code> an Notifier zurück.</li>



<li><strong>Finaler State:</strong> Notifier setzt <code>state</code> auf <code>success</code> mit <code>weatherData_Rom</code> und <code>locationInfo_Rom</code>.</li>



<li><strong>Anzeige:</strong> <code>WeatherScreen</code> wird neu gebaut und zeigt &#8222;Rom, Latium, Italien&#8220; und die aktuelle Temperatur für Rom an.</li>
</ol>



<h3 class="wp-block-heading"><strong>Schritt 8: Ausführen und Experimentieren!</strong></h3>



<p class="wp-block-paragraph">Starte die App (<code>F5</code>) und spiele damit herum:</p>



<ul class="wp-block-list">
<li>Suche verschiedene Städte, Länder, Sehenswürdigkeiten.</li>



<li>Suche nach ungültigen Adressen.</li>



<li>Wechsle zwischen Suchergebnissen und deinem GPS-Standort über den &#8222;Mein Standort&#8220;-Button.</li>



<li>Teste die Refresh-Funktion für gesuchte Orte.</li>



<li>Beobachte die Log-Ausgaben in der &#8222;DEBUG CONSOLE&#8220; in VS Code, um den Fluss nachzuvollziehen.</li>
</ul>



<p class="wp-block-paragraph"><strong>Fazit und Ausblick</strong></p>



<p class="wp-block-paragraph">Wir haben unserer App eine wichtige Funktion hinzugefügt und dabei gesehen, wie unsere Architektur uns geholfen hat, Code wiederzuverwenden und die Änderungen sauber zu integrieren. Du hast gelernt:</p>



<ul class="wp-block-list">
<li>Wie man eine neue Bibliothek (<code>geocoding</code>) einbindet und nutzt.</li>



<li>Wie der Prozess von der Adresseingabe bis zur Koordinate funktioniert (Geocoding).</li>



<li>Wie man die App-Logik im Notifier erweitert, um neue Benutzeraktionen zu behandeln.</li>



<li>Wie man bestehende Komponenten (wie die Wetterabfrage) für neue Szenarien wiederverwendet.</li>



<li>Wie man die Refresh-Logik an den aktuellen App-Zustand anpasst.</li>
</ul>



<p class="wp-block-paragraph">Unsere App ist jetzt deutlich flexibler. Aber reine Zahlen und Texte sind oft nicht genug, um Wettertrends zu erfassen. Im <strong>nächsten Teil (Teil 5)</strong> wird es grafisch: Wir holen uns <strong>stündliche Temperaturdaten</strong> von der API und visualisieren den <strong>Verlauf der letzten 7 Tage und die Prognose für die nächsten 7 Tage</strong> in einem interaktiven <strong>Liniendiagramm</strong>!</p>



<p class="wp-block-paragraph">Das wird die App optisch aufwerten und noch informativer machen. Bleib neugierig!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Weiterführende Ressourcen &amp; Vertiefung (für Teil 4)</strong></p>



<p class="wp-block-paragraph">In diesem Teil haben wir die App interaktiver gemacht und Geocoding eingeführt.</p>



<ol class="wp-block-list">
<li><strong>Geocoding:</strong>
<ul class="wp-block-list">
<li><strong><code>geocoding</code> Paket:</strong> <a href="https://pub.dev/packages/geocoding">https://pub.dev/packages/geocoding</a> &#8211; Die Dokumentation zum verwendeten Paket.</li>



<li><strong>Konzept Geocoding/Reverse Geocoding (Allgemein):</strong> Suche online nach diesen Begriffen, um das grundlegende Konzept besser zu verstehen (z.B. auf Wikipedia oder GIS-Seiten).</li>
</ul>
</li>



<li><strong>Flutter UI &#8211; Eingabefelder:</strong>
<ul class="wp-block-list">
<li><strong><code>TextField</code> Widget:</strong> <a href="https://api.flutter.dev/flutter/material/TextField-class.html">https://api.flutter.dev/flutter/material/TextField-class.html</a> &#8211; Die offizielle API-Dokumentation für das Text-Eingabefeld.</li>



<li><strong><code>TextEditingController</code>:</strong> <a href="https://api.flutter.dev/flutter/widgets/TextEditingController-class.html">https://api.flutter.dev/flutter/widgets/TextEditingController-class.html</a> &#8211; Wichtig zur Steuerung des Textes in einem <code>TextField</code>. Denke an <code>dispose()</code>!</li>



<li><strong>Formulareingaben verarbeiten (Flutter Kochbuch):</strong> <a href="https://docs.flutter.dev/cookbook/forms/retrieve-input">https://docs.flutter.dev/cookbook/forms/retrieve-input</a> &#8211; Zeigt verschiedene Wege, auf Benutzereingaben zu reagieren.</li>



<li><strong>Fokus Management (<code>FocusScope</code>):</strong> <a href="https://api.flutter.dev/flutter/widgets/FocusScope-class.html">https://api.flutter.dev/flutter/widgets/FocusScope-class.html</a> &#8211; Nützlich, um z.B. die Tastatur nach der Eingabe zu schließen.</li>
</ul>
</li>



<li><strong>Architektur &amp; Refactoring:</strong>
<ul class="wp-block-list">
<li><em>(Die Links aus Teil 3 zur Architektur sind weiterhin relevant)</em> &#8211; Betrachte, wie die bestehende Struktur das Hinzufügen der Suchfunktion erleichtert hat, ohne große Umbauten an der Wetterabfrage selbst vornehmen zu müssen.</li>
</ul>
</li>
</ol>
							
	</div><!-- .post-content -->
				
	
</article><!-- .post -->
		</div><!-- .posts -->
		
					
	</div><!-- .content.left -->
		
	
	<div class="sidebar right" role="complementary">
		<div id="block-2" class="widget widget_block widget_search"><div class="widget-content"><form role="search" method="get" action="https://allround-blog.de/" class="wp-block-search__button-outside wp-block-search__text-button wp-block-search"    ><label class="wp-block-search__label" for="wp-block-search__input-1" >Suchen</label><div class="wp-block-search__inside-wrapper" ><input class="wp-block-search__input" id="wp-block-search__input-1" placeholder="" value="" type="search" name="s" required /><button aria-label="Suchen" class="wp-block-search__button wp-element-button" type="submit" >Suchen</button></div></form></div></div><div id="block-3" class="widget widget_block"><div class="widget-content">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h2 class="wp-block-heading">Neueste Beiträge</h2>


<ul class="wp-block-latest-posts__list wp-block-latest-posts"><li><a class="wp-block-latest-posts__post-title" href="https://allround-blog.de/gesundheit/haferflocken-und-gesundheit-3/">Haferflocken und Gesundheit: Vorteile, Nährstoffe &amp; Tipps</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-6/">Deine Flutter Wetter-App: Schritt für Schritt – Teil 6</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-5/">Deine Flutter Wetter-App: Schritt für Schritt – Teil 5</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/">Deine Flutter Wetter-App: Schritt für Schritt – Teil 4</a></li>
<li><a class="wp-block-latest-posts__post-title" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-3/">Deine Flutter Wetter-App: Schritt für Schritt – Teil 3</a></li>
</ul></div></div>
</div></div><div id="block-4" class="widget widget_block"><div class="widget-content">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h2 class="wp-block-heading">Neueste Kommentare</h2>


<ol class="wp-block-latest-comments"><li class="wp-block-latest-comments__comment"><article><footer class="wp-block-latest-comments__comment-meta"><a class="wp-block-latest-comments__comment-author" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-6/">Deine Flutter Wetter-App: Schritt für Schritt – Teil 6 &#8211; Allround-Blog</a> zu <a class="wp-block-latest-comments__comment-link" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-5/#comment-17">Deine Flutter Wetter-App: Schritt für Schritt – Teil 5</a></footer></article></li><li class="wp-block-latest-comments__comment"><article><footer class="wp-block-latest-comments__comment-meta"><a class="wp-block-latest-comments__comment-author" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-5/">Deine Flutter Wetter-App: Schritt für Schritt – Teil 5 &#8211; Allround-Blog</a> zu <a class="wp-block-latest-comments__comment-link" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/#comment-16">Deine Flutter Wetter-App: Schritt für Schritt – Teil 4</a></footer></article></li><li class="wp-block-latest-comments__comment"><article><footer class="wp-block-latest-comments__comment-meta"><a class="wp-block-latest-comments__comment-author" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-4/">Deine Flutter Wetter-App: Schritt für Schritt – Teil 4 &#8211; Allround-Blog</a> zu <a class="wp-block-latest-comments__comment-link" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-3/#comment-15">Deine Flutter Wetter-App: Schritt für Schritt – Teil 3</a></footer></article></li><li class="wp-block-latest-comments__comment"><article><footer class="wp-block-latest-comments__comment-meta"><a class="wp-block-latest-comments__comment-author" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt-teil-2/">Deine Flutter Wetter-App: Schritt für Schritt – Teil 2 &#8211; Allround-Blog</a> zu <a class="wp-block-latest-comments__comment-link" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt/#comment-14">Deine Flutter Wetter-App: Schritt für Schritt: Teil 1</a></footer></article></li><li class="wp-block-latest-comments__comment"><article><footer class="wp-block-latest-comments__comment-meta"><a class="wp-block-latest-comments__comment-author" href="https://allround-blog.de/software/deine-flutter-wetter-app-schritt-fuer-schritt/">Deine Flutter Wetter-App: Schritt für Schritt &#8211; Allround-Blog</a> zu <a class="wp-block-latest-comments__comment-link" href="https://allround-blog.de/imkerei/gruenlandtemperatursumme-und-ihre-bedeutung-fuer-die-imkerei/#comment-13">Frühling auf der Alb: Die Grünlandtemperatursumme als Kompass für Imker</a></footer></article></li></ol></div></div>
</div></div><div id="block-5" class="widget widget_block"><div class="widget-content">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h2 class="wp-block-heading">Archiv</h2>


<ul class="wp-block-archives-list wp-block-archives">	<li><a href='https://allround-blog.de/2026/03/'>März 2026</a></li>
	<li><a href='https://allround-blog.de/2025/06/'>Juni 2025</a></li>
	<li><a href='https://allround-blog.de/2025/05/'>Mai 2025</a></li>
	<li><a href='https://allround-blog.de/2025/04/'>April 2025</a></li>
	<li><a href='https://allround-blog.de/2025/03/'>März 2025</a></li>
	<li><a href='https://allround-blog.de/2024/11/'>November 2024</a></li>
	<li><a href='https://allround-blog.de/2024/10/'>Oktober 2024</a></li>
</ul></div></div>
</div></div><div id="block-6" class="widget widget_block"><div class="widget-content">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h2 class="wp-block-heading">Kategorien</h2>


<ul class="wp-block-categories-list wp-block-categories-taxonomy-category wp-block-categories">	<li class="cat-item cat-item-2"><a href="https://allround-blog.de/category/blogging/">Blogging</a>
</li>
	<li class="cat-item cat-item-8"><a href="https://allround-blog.de/category/dms/">DMS</a>
</li>
	<li class="cat-item cat-item-15"><a href="https://allround-blog.de/category/gesundheit/">Gesundheit</a>
</li>
	<li class="cat-item cat-item-14"><a href="https://allround-blog.de/category/imkerei/">Imkerei</a>
</li>
	<li class="cat-item cat-item-6"><a href="https://allround-blog.de/category/karten/">Karten</a>
</li>
	<li class="cat-item cat-item-3"><a href="https://allround-blog.de/category/software/">Software</a>
</li>
	<li class="cat-item cat-item-7"><a href="https://allround-blog.de/category/vermessung/">Vermessung</a>
</li>
	<li class="cat-item cat-item-25"><a href="https://allround-blog.de/category/wetter/">Wetter</a>
</li>
	<li class="cat-item cat-item-26"><a href="https://allround-blog.de/category/wetter-app-entwicklung/">Wetter-App Entwicklung</a>
</li>
	<li class="cat-item cat-item-16"><a href="https://allround-blog.de/category/wohlbefinden/">Wohlbefinden</a>
</li>
	<li class="cat-item cat-item-4"><a href="https://allround-blog.de/category/wordpress/">WordPress</a>
</li>
</ul></div></div>
</div></div>	</div><!-- .sidebar -->
	
	
</main><!-- .wrapper -->
	              	        
<!--WPFC_FOOTER_START-->	<div class="footer section large-padding bg-dark">
		
		<div class="footer-inner section-inner group">
		
			<!-- .footer-a -->
				
			<!-- .footer-b -->
								
			<!-- .footer-c -->
					
		</div><!-- .footer-inner -->
	
	</div><!-- .footer -->
	
	<div class="credits section bg-dark no-padding">
	
		<div class="credits-inner section-inner group">
	
			<p class="credits-left">
				&copy; 2026 <a href="https://allround-blog.de">Allround-Blog</a>
			</p>
			
			<p class="credits-right">
				<span>Theme von <a href="https://andersnoren.se">Anders Norén</a></span> &mdash; <a title="Nach oben" class="tothetop">Hoch &uarr;</a>
			</p>
					
		</div><!-- .credits-inner -->
		
	</div><!-- .credits -->

</div><!-- .big-wrapper -->

<script type="speculationrules">
{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/hemingway\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
</script>
		<div id="jp-carousel-loading-overlay">
			<div id="jp-carousel-loading-wrapper">
				<span id="jp-carousel-library-loading"><svg class="jetpack-spinner" width="40" height="40" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/></path></svg></span>
			</div>
		</div>
		<div class="jp-carousel-overlay" style="display: none;">

		<div class="jp-carousel-container">
			<!-- The Carousel Swiper -->
			<div
				class="jp-carousel-wrap swiper jp-carousel-swiper-container jp-carousel-transitions"
				itemscope
				itemtype="https://schema.org/ImageGallery">
				<div class="jp-carousel swiper-wrapper"></div>
				<div class="jp-swiper-button-prev swiper-button-prev">
					<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
						<mask id="maskPrev" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="9" height="12">
							<path d="M16.2072 16.59L11.6496 12L16.2072 7.41L14.8041 6L8.8335 12L14.8041 18L16.2072 16.59Z" fill="white"/>
						</mask>
						<g mask="url(#maskPrev)">
							<rect x="0.579102" width="23.8823" height="24" fill="#FFFFFF"/>
						</g>
					</svg>
				</div>
				<div class="jp-swiper-button-next swiper-button-next">
					<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
						<mask id="maskNext" mask-type="alpha" maskUnits="userSpaceOnUse" x="8" y="6" width="8" height="12">
							<path d="M8.59814 16.59L13.1557 12L8.59814 7.41L10.0012 6L15.9718 12L10.0012 18L8.59814 16.59Z" fill="white"/>
						</mask>
						<g mask="url(#maskNext)">
							<rect x="0.34375" width="23.8822" height="24" fill="#FFFFFF"/>
						</g>
					</svg>
				</div>
			</div>
			<!-- The main close buton -->
			<div class="jp-carousel-close-hint">
				<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
					<mask id="maskClose" mask-type="alpha" maskUnits="userSpaceOnUse" x="5" y="5" width="15" height="14">
						<path d="M19.3166 6.41L17.9135 5L12.3509 10.59L6.78834 5L5.38525 6.41L10.9478 12L5.38525 17.59L6.78834 19L12.3509 13.41L17.9135 19L19.3166 17.59L13.754 12L19.3166 6.41Z" fill="white"/>
					</mask>
					<g mask="url(#maskClose)">
						<rect x="0.409668" width="23.8823" height="24" fill="#FFFFFF"/>
					</g>
				</svg>
			</div>
			<!-- Image info, comments and meta -->
			<div class="jp-carousel-info">
				<div class="jp-carousel-info-footer">
					<div class="jp-carousel-pagination-container">
						<div class="jp-swiper-pagination swiper-pagination"></div>
						<div class="jp-carousel-pagination"></div>
					</div>
					<div class="jp-carousel-photo-title-container">
						<h2 class="jp-carousel-photo-caption"></h2>
					</div>
					<div class="jp-carousel-photo-icons-container">
						<a href="#" class="jp-carousel-icon-btn jp-carousel-icon-info" aria-label="Sichtbarkeit von Fotometadaten ändern">
							<span class="jp-carousel-icon">
								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
									<mask id="maskInfo" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20">
										<path fill-rule="evenodd" clip-rule="evenodd" d="M12.7537 2C7.26076 2 2.80273 6.48 2.80273 12C2.80273 17.52 7.26076 22 12.7537 22C18.2466 22 22.7046 17.52 22.7046 12C22.7046 6.48 18.2466 2 12.7537 2ZM11.7586 7V9H13.7488V7H11.7586ZM11.7586 11V17H13.7488V11H11.7586ZM4.79292 12C4.79292 16.41 8.36531 20 12.7537 20C17.142 20 20.7144 16.41 20.7144 12C20.7144 7.59 17.142 4 12.7537 4C8.36531 4 4.79292 7.59 4.79292 12Z" fill="white"/>
									</mask>
									<g mask="url(#maskInfo)">
										<rect x="0.8125" width="23.8823" height="24" fill="#FFFFFF"/>
									</g>
								</svg>
							</span>
						</a>
												<a href="#" class="jp-carousel-icon-btn jp-carousel-icon-comments" aria-label="Sichtbarkeit von Fotokommentaren ändern">
							<span class="jp-carousel-icon">
								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
									<mask id="maskComments" mask-type="alpha" maskUnits="userSpaceOnUse" x="2" y="2" width="21" height="20">
										<path fill-rule="evenodd" clip-rule="evenodd" d="M4.3271 2H20.2486C21.3432 2 22.2388 2.9 22.2388 4V16C22.2388 17.1 21.3432 18 20.2486 18H6.31729L2.33691 22V4C2.33691 2.9 3.2325 2 4.3271 2ZM6.31729 16H20.2486V4H4.3271V18L6.31729 16Z" fill="white"/>
									</mask>
									<g mask="url(#maskComments)">
										<rect x="0.34668" width="23.8823" height="24" fill="#FFFFFF"/>
									</g>
								</svg>

								<span class="jp-carousel-has-comments-indicator" aria-label="Dieses Bild verfügt über Kommentare."></span>
							</span>
						</a>
											</div>
				</div>
				<div class="jp-carousel-info-extra">
					<div class="jp-carousel-info-content-wrapper">
						<div class="jp-carousel-photo-title-container">
							<h2 class="jp-carousel-photo-title"></h2>
						</div>
						<div class="jp-carousel-comments-wrapper">
															<div id="jp-carousel-comments-loading">
									<span>Kommentare werden geladen …</span>
								</div>
								<div class="jp-carousel-comments"></div>
								<div id="jp-carousel-comment-form-container">
									<span id="jp-carousel-comment-form-spinner"><svg class="jetpack-spinner" width="20" height="20" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><circle cx="50" cy="50" r="46" fill="none" stroke="#ddd" stroke-width="8"/><path d="M 50 4 A 46 46 0 0 1 96 50" fill="none" stroke="currentColor" stroke-width="8" stroke-linecap="round"><animateTransform attributeName="transform" type="rotate" dur="1.4s" from="0 50 50" to="360 50 50" repeatCount="indefinite"/></path></svg></span>
									<div id="jp-carousel-comment-post-results"></div>
																														<form id="jp-carousel-comment-form">
												<label for="jp-carousel-comment-form-comment-field" class="screen-reader-text">Verfasse einen Kommentar&#160;&hellip;</label>
												<textarea
													name="comment"
													class="jp-carousel-comment-form-field jp-carousel-comment-form-textarea"
													id="jp-carousel-comment-form-comment-field"
													placeholder="Verfasse einen Kommentar&#160;&hellip;"
												></textarea>
												<div id="jp-carousel-comment-form-submit-and-info-wrapper">
													<div id="jp-carousel-comment-form-commenting-as">
																													<fieldset>
																<label for="jp-carousel-comment-form-email-field">E-Mail (Erforderlich)</label>
																<input type="text" name="email" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-email-field" />
															</fieldset>
															<fieldset>
																<label for="jp-carousel-comment-form-author-field">Name (Erforderlich)</label>
																<input type="text" name="author" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-author-field" />
															</fieldset>
															<fieldset>
																<label for="jp-carousel-comment-form-url-field">Website</label>
																<input type="text" name="url" class="jp-carousel-comment-form-field jp-carousel-comment-form-text-field" id="jp-carousel-comment-form-url-field" />
															</fieldset>
																											</div>
													<input
														type="submit"
														name="submit"
														class="jp-carousel-comment-form-button"
														id="jp-carousel-comment-form-button-submit"
														value="Kommentar absenden" />
												</div>
											</form>
																											</div>
													</div>
						<div class="jp-carousel-image-meta">
							<div class="jp-carousel-title-and-caption">
								<div class="jp-carousel-photo-info">
									<h3 class="jp-carousel-caption" itemprop="caption description"></h3>
								</div>

								<div class="jp-carousel-photo-description"></div>
							</div>
							<ul class="jp-carousel-image-exif" style="display: none;"></ul>
							<a class="jp-carousel-image-download" href="#" target="_blank" style="display: none;">
								<svg width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg">
									<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="3" y="3" width="19" height="18">
										<path fill-rule="evenodd" clip-rule="evenodd" d="M5.84615 5V19H19.7775V12H21.7677V19C21.7677 20.1 20.8721 21 19.7775 21H5.84615C4.74159 21 3.85596 20.1 3.85596 19V5C3.85596 3.9 4.74159 3 5.84615 3H12.8118V5H5.84615ZM14.802 5V3H21.7677V10H19.7775V6.41L9.99569 16.24L8.59261 14.83L18.3744 5H14.802Z" fill="white"/>
									</mask>
									<g mask="url(#mask0)">
										<rect x="0.870605" width="23.8823" height="24" fill="#FFFFFF"/>
									</g>
								</svg>
								<span class="jp-carousel-download-text"></span>
							</a>
							<div class="jp-carousel-image-map" style="display: none;"></div>
						</div>
					</div>
				</div>
			</div>
		</div>

		</div>
		<link rel='stylesheet' id='jetpack-swiper-library-css' href='https://allround-blog.de/wp-content/plugins/jetpack/_inc/blocks/swiper.css?ver=15.8' type='text/css' media='all' />
<link rel='stylesheet' id='jetpack-carousel-css' href='https://allround-blog.de/wp-content/plugins/jetpack/modules/carousel/jetpack-carousel.css?ver=15.8' type='text/css' media='all' />
<script type="text/javascript" src="https://allround-blog.de/wp-content/themes/hemingway/assets/js/global.js?ver=2.3.2" id="hemingway_global-js"></script>
<script type="text/javascript" src="https://allround-blog.de/wp-content/plugins/enlighter/cache/enlighterjs.min.js?ver=fn+b0MXDe0j/NUW" id="enlighterjs-js"></script>
<script type="text/javascript" id="enlighterjs-js-after">
/* <![CDATA[ */
!function(e,n){if("undefined"!=typeof EnlighterJS){var o={"selectors":{"block":"pre.EnlighterJSRAW","inline":"code.EnlighterJSRAW"},"options":{"indent":2,"ampersandCleanup":true,"linehover":true,"rawcodeDbclick":false,"textOverflow":"scroll","linenumbers":false,"theme":"enlighter","language":"generic","retainCssClasses":false,"collapse":false,"toolbarOuter":"","toolbarTop":"{BTN_RAW}{BTN_COPY}{BTN_WINDOW}{BTN_WEBSITE}","toolbarBottom":""}};(e.EnlighterJSINIT=function(){EnlighterJS.init(o.selectors.block,o.selectors.inline,o.options)})()}else{(n&&(n.error||n.log)||function(){})("Error: EnlighterJS resources not loaded yet!")}}(window,console);
/* ]]> */
</script>
<script type="text/javascript" id="jetpack-stats-js-before">
/* <![CDATA[ */
_stq = window._stq || [];
_stq.push([ "view", {"v":"ext","blog":"244281421","post":"0","tz":"0","srv":"allround-blog.de","arch_tag":"geocoding","arch_results":"1","j":"1:15.8"} ]);
_stq.push([ "clickTrackerInit", "244281421", "0" ]);
/* ]]> */
</script>
<script type="text/javascript" src="https://stats.wp.com/e-202623.js" id="jetpack-stats-js" defer="defer" data-wp-strategy="defer"></script>
<script type="text/javascript" id="jetpack-carousel-js-extra">
/* <![CDATA[ */
var jetpackSwiperLibraryPath = {"url":"https:\/\/allround-blog.de\/wp-content\/plugins\/jetpack\/_inc\/blocks\/swiper.js"};
var jetpackCarouselStrings = {"widths":[370,700,1000,1200,1400,2000],"is_logged_in":"","lang":"de","ajaxurl":"https:\/\/allround-blog.de\/wp-admin\/admin-ajax.php","nonce":"5d02ff83d9","display_exif":"1","display_comments":"1","single_image_gallery":"1","single_image_gallery_media_file":"","background_color":"black","comment":"Kommentar","post_comment":"Kommentar absenden","write_comment":"Verfasse einen Kommentar\u00a0\u2026","loading_comments":"Kommentare werden geladen\u00a0\u2026","image_label":"Bild im Vollbildmodus \u00f6ffnen.","download_original":"Bild in Originalgr\u00f6\u00dfe anschauen <span class=\"photo-size\">{0}<span class=\"photo-size-times\">\u00d7<\/span>{1}<\/span>","no_comment_text":"Stelle bitte sicher, das du mit deinem Kommentar ein bisschen Text \u00fcbermittelst.","no_comment_email":"Bitte eine E-Mail-Adresse angeben, um zu kommentieren.","no_comment_author":"Bitte deinen Namen angeben, um zu kommentieren.","comment_post_error":"Dein Kommentar konnte leider nicht abgeschickt werden. Bitte versuche es sp\u00e4ter erneut.","comment_approved":"Dein Kommentar wurde freigegeben.","comment_unapproved":"Dein Kommentar wartet auf Freischaltung.","camera":"Kamera","aperture":"Blende","shutter_speed":"Verschlusszeit","focal_length":"Brennweite","copyright":"Copyright","comment_registration":"0","require_name_email":"1","login_url":"https:\/\/allround-blog.de\/wp-login.php?redirect_to=https%3A%2F%2Fallround-blog.de%2Fsoftware%2Fdeine-flutter-wetter-app-schritt-fuer-schritt-teil-4%2F","blog_id":"1","meta_data":["camera","aperture","shutter_speed","focal_length","copyright"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://allround-blog.de/wp-content/plugins/jetpack/_inc/build/carousel/jetpack-carousel.min.js?ver=15.8" id="jetpack-carousel-js"></script>
<error>
    <code>internal_server_error</code>
    <title><![CDATA[WordPress &amp;rsaquo; Fehler]]></title>
    <message><![CDATA[&lt;p&gt;Es gab einen kritischen Fehler auf deiner Website.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://wordpress.org/documentation/article/faq-troubleshooting/&quot;&gt;Erfahre mehr über die Problembehandlung in WordPress.&lt;/a&gt;&lt;/p&gt;]]></message>
    <data>
        <status>500</status>
    </data>
</error>
