Βοηθεια σε Geocoding Project

Αγαπητη ομαδα του openstreetmap greece καλημερα σας. Θα ηθελα την βοηθεια σας, εχω ενα eshop και για να βγαλω κοστη παραγγελιας χρησιμοποιω δεδομενα απο το openstreetmap.
Πιο αναλυτικα βαζοντας ο καταναλωτης τον τκ εγω επιστρεφω την
αποκεντρωμενη διοικηση. Ολα λειτουργουν καλα αλλα εχω προβλημα με την υποστηριξη της καλαματας.

Αναλυτικοτερα, βαζοντας καποιος τον ΤΚ 24150 (ΚΑΛΑΜΑΤΑ), παιρνω πως ανοικει στην αποκεντρωμενη διοικηση αττικης. Αναζητοντας τον ιδιο ΤΚ μεσα απο το γραφικο περιβαλλον του open street map, ολα λειτουργουν μια χαρα. Θα ηθελα σας παρακαλω να με βοηθησετε μηπως ο κωδικας μου προκαλει το
προβλημα αυτο.

Σας ευχαριστω πολυ

Ο υπευθυνος κωδικας

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Geocoder\Query\GeocodeQuery;

use Http\Adapter\Guzzle7\Client as GuzzleAdapter;
use Geocoder\Provider\Nominatim\Nominatim;
use Geocoder\Provider\LocationIQ\LocationIQ;

use Geocoder\StatefulGeocoder;

class GeocodingController extends Controller
{

    public function getRegionFromPostalCode(Request $request)
    {

        $request->validate([
            'postal_code' => 'required|string|max:10',
        ]);

        $postalCode = $request->input('postal_code');

        $adminLevel1 = null;
        $inAttica    = false;

        $httpClient = new GuzzleAdapter();
        $query      = $postalCode . ' , Greece';

        try {

            // === Provider 1: Nominatim (OpenStreetMap)
            $userAgent = 'myshop-eshop/1.0 (dimitrisliolios2023@gmail.com)';
            $nominatim = new Nominatim(
                $httpClient,
                'https://nominatim.openstreetmap.org',
                $userAgent
            );


            $geocoder    = new StatefulGeocoder($nominatim, 'el');
            $queryObject = GeocodeQuery::create($query)->withData('countrycodes', 'gr');
            $result      = $geocoder->geocodeQuery($queryObject);

            // Αν αποτύχει, δοκίμασε fallback query
            if ($result->count() === 0 && is_numeric($postalCode)) {
                $fallbackQuery = 'Ελλάδα ' . $postalCode;
                $queryObject   = GeocodeQuery::create($fallbackQuery)->withData('countrycodes', 'gr');
                $result        = $geocoder->geocodeQuery($queryObject);
            }

            if ($result->count() > 0) {
                $firstResult = $result->first();
                $levels      = $firstResult->getAdminLevels();

                Log::info('--- Start Admin Levels Debug (Nominatim) ---');
                foreach ($levels as $level) {
                    Log::info('Admin level ' . $level->getLevel() . ': ' . $level->getName());
                }
                Log::info('--- End Admin Levels Debug ---');

                if ($levels && $levels->has(1)) {
                    $adminLevel1 = $levels->get(1)->getName();
                }
            }


            // === Provider 2: LocationIQ (fallback)
            if (!$adminLevel1) {
                Log::info('Using LocationIQ for fallback');
                $locationiq = new LocationIQ($httpClient, env('LOCATIONIQ_API_KEY'));
                $geocoder   = new StatefulGeocoder($locationiq, 'el');

                $queryWithCountry = $query;

                $result = $geocoder->geocodeQuery(
                    GeocodeQuery::create($queryWithCountry)
                );

                if ($result->count() > 0) {
                    $levels = $result->first()->getAdminLevels();
                    if ($levels->has(1)) {
                        $adminLevel1 = $levels->get(1)->getName();
                        Log::info('LocationIQ Admin Level 1: ' . $adminLevel1);
                    }
                }
            }

            // === Provider 3: Poleismas (fallback)
            if (!$adminLevel1) {
                Log::info('Using Poleismas for fallback');
                $poleismasKey = env('POLEISMAS_API_KEY');
                $poleismasApp = env('POLEISMAS_APP_ID');

                $client = new \GuzzleHttp\Client();
                $response = $client->post("https://{$poleismasApp}-c.sigmie.app/v1/search/poleismas", [
                    'headers' => [
                        'content-type'         => 'application/json',
                        'x-sigmie-api-key'     => $poleismasKey,
                        'x-sigmie-application' => $poleismasApp,
                    ],
                    'json' => [
                        'query'    => $postalCode,
                        'per_page' => 1,
                        'filters'  => '',
                        'facets'   => '',
                        'page'     => 1,
                        'sort'     => '_score'
                    ]
                ]);

                $body = json_decode($response->getBody(), true);
                if (!empty($body['hits'][0]['region_gr'])) {
                    $adminLevel1 = $body['hits'][0]['region_gr'];
                    Log::info('Poleismas Region: ' . $adminLevel1);
                }
            }

            // === Extra: flag για έλεγχο αν είναι Αττική
            if ($adminLevel1) {
                $inAttica = (mb_stripos($adminLevel1, 'Αττική') !== false);
            }
        } catch (\Exception $e) {
            Log::error('Geocoding failed', ['error' => $e->getMessage()]);
        }

        return response()->json([
            'area'          => $adminLevel1,
            'in_attica'     => $inAttica,
            'shipping_cost' => $inAttica ? 0 : 100 // Τιμή εκτός Αττικής
        ]);
    }
}


Να θέσω για αρχή ότι δεν σκαμπάζω πολλά από κώδικα, οπότε δεν ξέρω τι κάνει query επακριβώς εδώ στο Nominatim. Προσωπικά όταν ψάχνω στο osm.org, δεν μου βγάζει τίποτα στην Ελλάδα με τον ΤΚ 24150. Ψάχνοντας στο overpass με τα συνήθη tag, πάλι δεν μου βγάζει κάτι. Εσύ που έψαξες;

Γενικά η χαρτογράφηση ΤΚ στην Ελληνική επικράτεια στα δεδομένα του OSM είναι με πάρα πάρα πολλά κενά και δεν μπορεί να θεωρηθεί πλήρες σύνολο. Έχω υπόνοια ότι το πρόγραμμα βγάζει αυτό το bug από κάποια από τα fallback options λοιπόν.

1 Like

Σας ευχαριστω παρα πολυ για την απαντηση σας. Ψαχνοντας στον συνδεσμο που μου στειλατε (osm.org) → 24150,GREECE. Ειδα πως σαν πρωτη επιλογη εμφανιζεται η Τραπεζα της Ελλαδος ενω εχει ΤΚ 10561. Αρα το προβλημα που αντιμετοπιζω για την Καλαματα προερχεται απο εκει. Ξερετε μηπως που θα μπορουσα να απευθυνθω για το προβλημα αυτο?

Αυτό, το fallback για την έλλειψη των χαρτογραφημένων ΤΚ (όπως ισχύει και σε όλο τον κόσμο), είναι από δεδομένα που δεν γίνονται host από το OSM, οπότε δεν μπορούμε να ξέρουμε με σιγουριά από που ακριβώς είναι τα συγκεκριμένα δεδομένα, για την Ελλάδα τουλάχιστον. Θα το ψάξω σε μερικές μέρες μήπως βρω αναφορά για το dataset που χρησιμοποιεί το Nominatim.
Είχα κάνει σύγκριση με κάποιες περιοχές στο Google maps και είδα ότι δεν υπάρχουν μεγάλες διαφορές. Μπορεί να μην είναι απευθείας από τα ΕΛΤΑ τα δεδομένα και για αυτό να υπάρχει σύγχιση σε μερικές περιοχές της χώρας.

Σας ευχαριστω για την παρατηρηση. Απλα επειδη και εγω ενδιαφερομαι να ενταξω μια geocoding υπηρεσια στο eshop μου (εχω δοκιμαστει της google αλλα δεν εκανε πολλα), για να βγαζω κοστη μεταφορας.

Η αληθεια ειναι πως το συστημα αποκεντρωμενης διοικησης με βολεψε μιας και η Ελλαδα ειναι ηδη χωρισμενη (Αποκεντρωμένες Διοικήσεις της Ελλάδας - Βικιπαίδεια). Θα ηθελα να σας ρωτησω εαν ξερετε καποιο api που μπορω να βασιστω για τα δεδομενα μου.

Συγνωμη για την ελληψη τονων αλλα εχω προβλημα στο πληκτρολογιο.

Δεν ξέρω γιατί αυτή η αναζήτηση βγάζει αυτά τα αποτελέσματα, δεν υπάρχει πουθενά αναφορά αυτού του αριθμού, αλλά υποψιάζομαι έβγαλε την Τράπεζα της Ελλάδος λόγω του “Greece” κι όχι λόγω του “24150”.
Το πως γίνεται η αναζήτηση στο osm.org είναι όντως κάπως γιατί είναι αρκετά αυστηρή στο string που δίνεται και δεν είναι τόσο δυναμική όπως άλλα εργαλεία. Το άτομο που συντηρεί το Nominatim προσπαθεί να το βελτιώνει συνεχώς.
Νομίζω υπάρχουν κι άλλα εργαλεία αναζήτησης για το OSM, αλλά δεν μπορώ να τα ψάξω τώρα.

Αγαπητέ Godgrfear, δεν νομίζω πως θα βγάλεις άκρη χρησιμοποιώντας το OSM για να κάνεις τέτοιου είδους αναζήτηση.
Δεν υπάρχει ομάδα που ανανεώνει τους Τ.Κ στον χάρτη όλης της Ελλάδας με κάθε αλλαγή που γίνεται και όσοι έχουν περάσει αυτά τα δεδομένα έχουν απλωθεί σε διάρκεια χρόνων.
Χωρίς να γνωρίζω την εγκυρότητα των παρακάτω, με μια απλή αναζήτηση φαίνεται πως υπάρχει σύγχιση με τους Τ.Κ., τουλάχιστον γι’ αυτόν που ανέφερες ή τουλάχιστον έχουν μείνει στο διαδύκτιο σκάρτα δεδομένα τα οποία σίγουρα μπερδεύουν τον κόσμο που τα αναζητεί.

Προσπάθησε να ψάξεις τον αντίθετο όρο από αυτόν που φαίνεται στην κάθε web διεύθυνση στα δύο site

Υπάρχει και μια αναφορά με εξήγηση σε αυτό

Μάλλον χρειάζεσαι κάποια έτοιμη (επίσημη;) λίστα ή ένα site σαν τα παραπάνω που να σου επιτρέπει να τρέχεις κάποιο απομακρυσμένο query για να βρίσκεις την περιοχή με τον Τ.Κ. και να χρησιμοποιείς τα στοιχεία που θα σου γυρίζει π.χ. όνομα πόλης/χωριού, για να κάνεις μια σύνδεση με το OSM για όποιο σκοπό το χρειάζεσαι.

Θα ήθελα να σας ευχαριστήσω παρα πολυ για τον χρόνο και την απάντηση σας. Η αλήθεια είναι πως είχα αυτό το μπέρδεμα σε Καλαμάτα και κάποιες άλλες περιοχες. Μετά από λίγη αναζήτηση στα API που υπάρχουν κατέληξα πως το ιδανικό για εμενα είναι το here API. Δεν θέλω να παρακινησω κανέναν να μην χρησιμοποιει openstreetmap απλά μιας και εγώ βασίζομαι στο API για να βγάλει κόστη αποστολής ήθελα κάτι αξιόπιστο, δηλαδή ανάλογα με την περιφερεια που θα λάβω βάση του ΤΚ υπολογίζω τα κόστη. Τωρα δεν πιστευω οτι τα δεδομένα του here απαιτουνται τα φιλτραρονται από openstreetmap. Για όποιον ενδιαφέρεται το here έως 30.000 μηνιαία request (για το geocoding API είναι free)

Νομίζω τα δύο site που αναφέρεις παίρνουν τα δεδομένα από το site των ΕΛΤΑ, απλά με πιο απλή και εύκολη αναζήτηση σε αντίθεση με τα ίδια τα ΕΛΤΑ ( https://postalcodes.elta.gr/ ).

Περίεργο, χθες που το είδα το site δεν μου δούλευε.

Όσον αφορά την απάντησή μου, μία γρήγορη αναζήτηση έκανα και φαίνεται πως υπάρχουν διάφορες αναφορές Τ.Κ. για τα ίδια μέρη, που σημαίνει πως το ίδιο θα συμβαίνει και στα δεδομένα του OSM. Προφανώς θέλει κάποιο ψάξιμο αλλά να στηριχτεί κάποιος για να κάνει την δουλειά του με τα δεδομένα του χάρτη (τουλάχιστον για τους Τ.Κ) φαίνεται πως δεν είναι και η καλύτερη λύση (προς το παρόν).

Φαίνεται πως πολλά σημεία place=* έχουν περασμένο τον Τ.Κ. εκεί αλλά δεν ισχύει για όλα (και δεν ξέρω αν είναι καλή πρακτική ή αν ακολουθείται αλλού).

Ίσως αν το query ψάχνει / επιστρέφει μόνο postcode από place=* τότε μπορεί να γίνει ένας γενικός έλεγχος και συμμάζεμα στα δεδομένα του OSM μέσω κάποιας επίσημης λίστας / site όπως το παραπάνω. Με την προϋπόθεση πως σε κάποια key:place είναι αποδεκτό να γίνεται εισαγωγή πολλαπλών τιμών (“´”) στο postcode π.χ. περιοχές της Αθήνας.

Δεν μπορώ να κοιτάξω το wiki τώρα, αλλά γενικά στα place δεν μπαίνει postal code, για διάφορους λόγους, όπως ότι ο ίδιος ΤΚ μπορεί να πιάνει κι άλλες περιοχές, ή το ίδιο place να έχει πολλαπλούς ΤΚ, συχνό φαινόμενο ιδίως για μεγάλες πόλεις όπως Αθήνα. Πιο εύκολο είναι να παίρνεις τον ΤΚ από το εκάστοτε PoI, όπου ούτως ή άλλως είναι κάτι που σχεδόν πάντα βλέπεις στις διευθύνσεις. Άλλο το ότι στο OSM δεν καλύπτονται όλοι οι ΤΚ, δηλαδή δεν υπάρχει PoI με ΤΚ σε ολόκληρη περιοχή ενός ΤΚ.

Το αρχικό θέμα πάντως αφορά το geocoding που δεν αφορά μόνο τον ΤΚ, αλλά και το σε ποιες διοικητικές οντότητες βρίσκεται, όπου φαίνεται του αρκεί μόνο η αποκεντρωμένη διοίκηση (θα πρότεινα περιφέρεια ως καταλληλότερη κατηγοριοποίηση, καθώς είναι η μεγαλύτερου βαθμού κανονική αυτοδιοίκηση, αλλά οκ).