{"id":374,"date":"2025-10-06T13:01:07","date_gmt":"2025-10-06T13:01:07","guid":{"rendered":"https:\/\/aiportcenter.nl\/?page_id=374"},"modified":"2025-11-29T23:12:46","modified_gmt":"2025-11-29T23:12:46","slug":"hinterland-transport","status":"publish","type":"page","link":"https:\/\/aiportcenter.nl\/index.php\/hinterland-transport\/","title":{"rendered":"Hinterland Transport"},"content":{"rendered":"\n<!-- ======= BREADCRUMB (FULL WIDTH MATCH + ADMIN LINK + WP SPACING REMOVED) ======= -->\n\n<style>\n\/* Remove WordPress default spacing ONLY for this breadcrumb block *\/\n.breadcrumb-wrapper.wp-block-html {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n\/* Wrapper that matches .pc-container.polished width *\/\n.breadcrumb-container {\n  max-width: 1200px;\n  margin: -110px auto 0 auto;   \/* negative top only *\/\n  padding: 0 20px;\n  box-sizing: border-box;\n  position: relative;\n  z-index: 10;\n}\n\n\/* Styled breadcrumb bar *\/\n.breadcrumb {\n  font-family: Inter, system-ui, sans-serif;\n  font-size: 0.92rem;\n  color: var(--muted, #5b6570);\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  gap: 6px;\n\n  margin-top: 8px;\n  margin-bottom: 12px;\n\n  padding: 10px 14px;\n  border-radius: 10px;\n  background: linear-gradient(180deg, rgba(10,106,176,0.06), rgba(10,106,176,0.02));\n  box-shadow: 0 2px 6px rgba(10,29,56,0.08);\n  border: 1px solid rgba(10,106,176,0.12);\n}\n\n.breadcrumb a {\n  color: var(--accent, #0a5c94);\n  text-decoration: none;\n  font-weight: 500;\n}\n\n.breadcrumb a:hover {\n  text-decoration: underline;\n}\n\n.breadcrumb .current {\n  color: var(--muted, #5b6570);\n  font-weight: 500;\n}\n<\/style>\n\n<div class=\"breadcrumb-wrapper wp-block-html\">\n<div class=\"breadcrumb-container\">\n  <nav class=\"breadcrumb\">\n\n    <a href=\"https:\/\/aiportcenter.nl\/\">Home<\/a>\n    <span>\u203a<\/span>\n\n    <a href=\"https:\/\/aiportcenter.nl\/index.php\/port-call\/\">Port-Call Data Hub<\/a>\n    <span>\u203a<\/span>\n\n    <a href=\"https:\/\/aiportcenter.nl\/index.php\/port-call\/\">Processes Timeline<\/a>\n    <span>\u203a<\/span>\n\n    <span class=\"current\">Hinterland Transport<\/span>\n\n  <\/nav>\n<\/div>\n<\/div>\n\n<!-- ======= \/END BREADCRUMB ======= -->\n\n\n\n<!-- ========= PORT CALL: HINTERLAND TRANSPORT (ROTTERDAM) \u2014 POLISHED DROP-IN (Datasets as Table) ========= -->\n<div class=\"pc-container polished\" id=\"hinterland-rotterdam\">\n  <header class=\"pc-hero\" role=\"banner\" aria-label=\"Hinterland Transport overview\">\n    <div class=\"pc-hero-bg\" aria-hidden=\"true\"><\/div>\n    <div class=\"pc-hero-inner\">\n      <div class=\"pc-hero-eyebrow\">Port-Call Optimization at the Port of Rotterdam<\/div>\n      <h1>Hinterland Transport<\/h1>\n      <p class=\"lead\">Connects the yard to the consignee by truck, rail, or barge within time windows and capacity limits. Slot bookings, gate moves, and intermodal transfers are planned backward from customs release. Inputs include transport orders, slotting systems, e-CMR or manifests, and terminal availability. The purpose is cost-reliable end-to-end lead time and efficient equipment use. Performance is reflected in avoided missed slots, reduced dwell time, and on-time final delivery. Feedback loops update future berth and yard plans using reliable departure and arrival timestamps.<\/p>\n      <nav class=\"pc-steps-nav\" aria-label=\"Steps\">\n        <a href=\"#step-1\" class=\"chip\" data-step=\"1\"><span class=\"num\">1<\/span> Cargo Pick-up<\/a>\n        <a href=\"#step-2\" class=\"chip\" data-step=\"2\"><span class=\"num\">2<\/span> Intermodal Transfer<\/a>\n        <a href=\"#step-3\" class=\"chip\" data-step=\"3\"><span class=\"num\">3<\/span> Final Delivery<\/a>\n        <a href=\"#research\" class=\"chip\" data-step=\"3\"><span class=\"num\">4<\/span> Research Problems<\/a>\n        <a href=\"#exec\" class=\"chip\" data-step=\"3\"><span class=\"num\">5<\/span> Execution Party<\/a>\n        <a href=\"#plan\" class=\"chip\" data-step=\"3\"><span class=\"num\">6<\/span> Planning Party<\/a>\n        <a href=\"#data\" class=\"chip\" data-step=\"3\"><span class=\"num\">7<\/span> Available Data<\/a>\n      <\/nav>\n    <\/div>\n  <\/header>\n\n  <aside class=\"pc-toc\" aria-label=\"On-page navigation\">\n    <div class=\"pc-toc-inner\">\n      <div class=\"pc-toc-title\">On this page<\/div>\n      <ol>\n        <li><a href=\"#step-1\">Cargo Pick-up<\/a><\/li>\n        <li><a href=\"#step-2\">Intermodal Transfer<\/a><\/li>\n        <li><a href=\"#step-3\">Final Delivery<\/a><\/li>\n        <li><a href=\"#research\">Research Problems<\/a><\/li>\n        <li><a href=\"#exec\">Execution Party<\/a><\/li>\n        <li><a href=\"#plan\">Planning Party<\/a><\/li>\n        <li><a href=\"#data\">Available Data<\/a><\/li>\n      <\/ol>\n    <\/div>\n  <\/aside>\n\n  <main class=\"pc-main\">\n  <!-- Step 1 -->\n  <section class=\"pc-step card\" id=\"step-1\" data-keywords=\"gate slot booking pickup release exceptions turn time\" aria-labelledby=\"title-step-1\">\n    <div class=\"card-accent\" aria-hidden=\"true\"><\/div>\n    <header class=\"card-head\">\n      <h2 id=\"title-step-1\"><span class=\"badge\">Step 1<\/span>Cargo Pick-up<\/h2>\n    <\/header>\n    <p class=\"pc-desc\">Books a slot, verifies release, and matches truck, rail, or barge capacity to the yard location. Gate procedures validate IDs, seals, and dangerous goods status. Turnaround time is reduced through accurate pre-advice and stack selection. Data events confirm custody transfer from the terminal to the carrier. The purpose is fast and clean extraction from the yard. Performance is measured by short turn times and few gate exceptions.<\/p>\n  <\/section>\n\n  <!-- Step 2 -->\n  <section class=\"pc-step card\" id=\"step-2\" data-keywords=\"intermodal transfer barge rail mode switch connection dwell\" aria-labelledby=\"title-step-2\">\n    <div class=\"card-accent\" aria-hidden=\"true\"><\/div>\n    <header class=\"card-head\">\n      <h2 id=\"title-step-2\"><span class=\"badge\">Step 2<\/span>Intermodal Transfer<\/h2>\n    <\/header>\n    <p class=\"pc-desc\">Moves units between modes to optimize cost, time, and emissions. Transfers are sequenced to meet barge and rail departures and road windows. Constraints include crane availability, barge draft limits, and rail pathing. Data links bookings, manifests, and live ETAs. The purpose is resilient and economical flows beyond the quay. Success is measured by tight connection keeping with minimal dwell.<\/p>\n  <\/section>\n\n  <!-- Step 3 -->\n  <section class=\"pc-step card\" id=\"step-3\" data-keywords=\"final delivery door leg e-cmr pod exceptions\" aria-labelledby=\"title-step-3\">\n    <div class=\"card-accent\" aria-hidden=\"true\"><\/div>\n    <header class=\"card-head\">\n      <h2 id=\"title-step-3\"><span class=\"badge\">Step 3<\/span>Final Delivery<\/h2>\n    <\/header>\n    <p class=\"pc-desc\">Completes the final leg to the consignee or distribution center within the delivery window. Access constraints such as time slots, equipment needs, and site rules are managed proactively. Proof of delivery is captured and the transport order is closed. Exceptions including damage or shortages are documented with evidence. The purpose is fulfillment of the commercial promise at destination. The outcome feeds performance analytics for the next port call.<\/p>\n  <\/section>\n\n    <!-- Research Problems -->\n  <section class=\"pc-step card\" id=\"research\" data-keywords=\"research truck yard-vehicle yard-crane\" aria-labelledby=\"title-research\">\n    <div class=\"card-accent\" aria-hidden=\"true\"><\/div>\n    <header class=\"card-head\">\n      <h2 id=\"title-research\">Related Research Problems<\/h2>\n      <div class=\"sub\">Key research problems related to hinterland transport in Rotterdam.<\/div>\n    <\/header>\n\n    <div class=\"pc-research-note\" aria-hidden=\"false\" style=\"margin-top:10px; margin-bottom:6px; display:flex; align-items:center; gap:10px;\">\n      <span class=\"highlight-dot\" aria-hidden=\"true\" style=\"display:inline-block;width:12px;height:12px;border-radius:50%;background:linear-gradient(90deg,#74c9ff,#2aa7e8);box-shadow:0 4px 12px rgba(42,167,232,0.18);animation:pcPulse 2s infinite;\"><\/span>\n      <div class=\"instruction\" style=\"color:var(--muted);font-size:0.95rem;\">Click on a card to open the webpage and data sets for each research problem.<\/div>\n      <style>\n        @keyframes pcPulse { 0%,100%{transform:scale(1)} 50%{transform:scale(1.18)} }\n      <\/style>\n    <\/div>\n\n    <div class=\"pc-grid\">\n      <article class=\"pc-card\" data-url=\"https:\/\/aiportcenter.nl\/index.php\/truck-appointment-scheduling\/\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M2 16h20v2H2v-2Zm2-6h8v4H4v-4Zm10-6h6v10h-6V4Z\"\/><\/svg><\/span>\n          <h3>Truck Appointment Scheduling<\/h3>\n        <\/div>\n        <ul>\n          <li>Scheduling and slotting truck arrivals to reduce gate queues and improve terminal throughput and truck turn times \u2014 directly affects hinterland pickups and delivery reliability.<\/li>\n        <\/ul>\n      <\/article>\n\n      <article class=\"pc-card\" data-url=\"https:\/\/aiportcenter.nl\/index.php\/yard-vehicle-routing\/\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M4 6h16v2H4V6Zm0 5h16v2H4v-2Zm0 5h10v2H4v-2Z\"\/><\/svg><\/span>\n          <h3>Yard-Vehicle Routing<\/h3>\n        <\/div>\n        <ul>\n          <li>Routing yard vehicles (straddles, AGVs, tractors) to reduce travel time, congestion and dwell \u2014 improves speed to dispatch and arrival punctuality.<\/li>\n        <\/ul>\n      <\/article>\n\n      <article class=\"pc-card\" data-url=\"https:\/\/aiportcenter.nl\/index.php\/yard-crane\/\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M3 20h18v2H3v-2Zm2-2h2V8h6v10h2V6h2V4H7V2H5v16Z\"\/><\/svg><\/span>\n          <h3>Yard-Crane Scheduling<\/h3>\n        <\/div>\n        <ul>\n          <li>Schedule yard cranes and lifts to minimise reshuffles and delays that cascade into gate\/dispatch queues and inland connections.<\/li>\n        <\/ul>\n      <\/article>\n    <\/div>\n  <\/section>\n\n  <!-- Execution Party -->\n  <section class=\"pc-step card\" id=\"exec\" data-keywords=\"inland transport trucking rail barge proof of delivery\" aria-labelledby=\"title-exec\">\n    <div class=\"card-accent\" aria-hidden=\"true\"><\/div>\n    <header class=\"card-head\">\n      <h2 id=\"title-exec\">Execution Party<\/h2>\n      <div class=\"sub\">Below, the main companies involved in the execution of hinterland transport operations are listed.<\/div>\n    <\/header>\n\n    <div class=\"pc-grid\">\n      <article class=\"pc-card\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><!-- link icon --><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M3.9 12a5 5 0 0 1 5-5h3v2h-3a3 3 0 1 0 0 6h3v2h-3a5 5 0 0 1-5-5Zm7-3h3a5 5 0 1 1 0 10h-3v-2h3a3 3 0 1 0 0-6h-3V9Z\"\/><\/svg><\/span>\n          <h3>ECT InlandLinks<\/h3>\n        <\/div>\n        <ul>\n          <li>Digital platform linking Rotterdam with inland terminals (rail\/barge\/truck). Facilitates booking, visibility, and efficient routing.<\/li>\n        <\/ul>\n      <\/article>\n\n      <article class=\"pc-card\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><!-- truck icon --><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M3 6h11v8h-1.5a2.5 2.5 0 1 0 0 2H16a2 2 0 0 0 2-2V9h3l1 3v4h-1.5a2.5 2.5 0 1 0 0 2H19a4 4 0 0 1-4-4V6H3Z\"\/><\/svg><\/span>\n          <h3>Kuehne+Nagel<\/h3>\n        <\/div>\n        <ul>\n          <li>Freight forwarding and inland transport (truck\/rail\/barge) from Rotterdam into Europe, via own fleet &#038; partners.<\/li>\n        <\/ul>\n      <\/article>\n\n      <article class=\"pc-card\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><!-- rail\/barge icon --><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"m6 21 2-2h8l2 2H6Zm-1-3h14l-3-8H8l-3 8ZM5 5h14v2H5V5Z\"\/><\/svg><\/span>\n          <h3>DHL Global Forwarding<\/h3>\n        <\/div>\n        <ul>\n          <li>Organises multimodal routes (road\/rail\/barge\/air), executes inland trucking, coordinates cross-border flows.<\/li>\n        <\/ul>\n      <\/article>\n\n      <article class=\"pc-card\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><!-- warehouse\/depots icon --><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M3 10 12 5l9 5v9H3v-9Zm2 2v5h14v-5l-7-4-7 4Z\"\/><\/svg><\/span>\n          <h3>Rhenus Logistics<\/h3>\n        <\/div>\n        <ul>\n          <li>Inland container transport by barge, rail, and truck, operating depots and hubs across Europe.<\/li>\n        <\/ul>\n      <\/article>\n    <\/div>\n  <\/section>\n\n  <!-- Planning Party -->\n  <section class=\"pc-step card\" id=\"plan\" data-keywords=\"mode selection slots buffers emissions connection keeping\" aria-labelledby=\"title-plan\">\n    <div class=\"card-accent\" aria-hidden=\"true\"><\/div>\n    <header class=\"card-head\">\n      <h2 id=\"title-plan\">Planning Party<\/h2>\n      <div class=\"sub\">Below, the main companies involved in planning hinterland transport operations are listed.<\/div>\n    <\/header>\n\n    <div class=\"pc-grid\">\n      <article class=\"pc-card\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><!-- network icon --><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M4 4h16v6H4V4Zm0 8h7v8H4v-8Zm9 0h7v8h-7v-8Z\"\/><\/svg><\/span>\n          <h3>ECT InlandLinks<\/h3>\n        <\/div>\n        <ul>\n          <li>Plans hinterland network capacity, inland connections, and slot allocation for rail\/barge services.<\/li>\n        <\/ul>\n      <\/article>\n\n      <article class=\"pc-card\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><!-- plan icon --><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M7 3h10v2H7V3Zm0 4h10v2H7V7Zm0 4h10v2H7v-2Zm0 4h6v2H7v-2Z\"\/><\/svg><\/span>\n          <h3>Kuehne+Nagel<\/h3>\n        <\/div>\n        <ul>\n          <li>Builds multimodal connections, books terminal\/carrier slots, and optimises end-to-end supply chains.<\/li>\n        <\/ul>\n      <\/article>\n\n      <article class=\"pc-card\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><!-- route icon --><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"M6 19a3 3 0 1 1 0-6h6a2 2 0 0 0 2-2V7H9a3 3 0 1 1 0-2h7a2 2 0 0 1 2 2v4a4 4 0 0 1-4 4H6Z\"\/><\/svg><\/span>\n          <h3>DHL Global Forwarding<\/h3>\n        <\/div>\n        <ul>\n          <li>Coordinates customs, schedules inland modes, and manages cross-border capacity planning.<\/li>\n        <\/ul>\n      <\/article>\n\n      <article class=\"pc-card\">\n        <div class=\"pc-card-head\">\n          <span class=\"pc-icon\" aria-hidden=\"true\"><!-- barge\/rail icon --><svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\"><path d=\"m2 16 3-8h14l3 8H2Zm2 2h16v2H4v-2Z\"\/><\/svg><\/span>\n          <h3>Rhenus Logistics<\/h3>\n        <\/div>\n        <ul>\n          <li>Plans barge\/rail rotations, terminal slot reservations, and last-mile trucking.<\/li>\n        <\/ul>\n      <\/article>\n    <\/div>\n  <\/section>\n\n  <!-- Datasets (TABLE) -->\n  <section class=\"pc-step card\" id=\"data\" data-keywords=\"truck rail barge corridors locks bridges water levels disruptions directories\" aria-labelledby=\"title-data\">\n    <div class=\"card-accent\" aria-hidden=\"true\"><\/div>\n    <header class=\"card-head\">\n      <h2 id=\"title-data\">Available Data<\/h2>\n      <div class=\"sub\">Free, real-time data sources and official guidance used in hinterland transport operations in Rotterdam.<\/div>\n    <\/header>\n\n    <div class=\"pc-table-wrap\">\n      <table class=\"pc-table pc-anim-table\" role=\"table\" aria-label=\"Hinterland datasets\">\n        <thead>\n          <tr>\n            <th scope=\"col\">Data Source<\/th>\n            <th scope=\"col\">Description<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr>\n            <td>\n              <a href=\"https:\/\/opendata.ndw.nu\/\" target=\"_blank\" rel=\"noopener\">NDW Open Data (Road Traffic)<\/a>\n              <div class=\"last-updated\">Last update: <time id=\"ndw-last\"><\/time><\/div>\n            <\/td>\n            <td>Real-time Dutch motorway data (speeds, incidents, travel times) for truck ETA\/corridor planning.\n              <div class=\"version\">Version: Free (public)<\/div>\n            <\/td>\n          <\/tr>\n          <tr>\n            <td>\n              <a href=\"https:\/\/data.europa.eu\/data\/datasets\/9d97b03f-ed6d-4cd3-86a8-2e1b9cbf7a5d?locale=en\" target=\"_blank\" rel=\"noopener\">Bridge Openings &amp; Port Berths API<\/a>\n              <div class=\"last-updated\">Last update: <time id=\"bridge-last\"><\/time><\/div>\n            <\/td>\n            <td>API for bridge openings and available berths (incl. Rotterdam) to support barge scheduling.\n              <div class=\"version\">Version: Free (public)<\/div>\n            <\/td>\n          <\/tr>\n          <tr>\n            <td>\n              <a href=\"https:\/\/rijkswaterstaatdata.nl\/waterdata\/\" target=\"_blank\" rel=\"noopener\">Rijkswaterstaat Waterinfo (Docs &amp; Download)<\/a>\n              <div class=\"last-updated\">Last update: <time id=\"rws-doc-last\"><\/time><\/div>\n            <\/td>\n            <td>Query\/export water levels, flow, waves &amp; forecasts for draft\/UKC planning.\n              <div class=\"version\">Version: Free (public)<\/div>\n            <\/td>\n          <\/tr>\n          <tr>\n            <td>\n              <a href=\"https:\/\/apis.developer.overheid.nl\/apis\/rijkswaterstaat-wm-ws-dl\" target=\"_blank\" rel=\"noopener\">RWS Waterwebservices (API)<\/a>\n              <div class=\"last-updated\">Last update: <time id=\"rws-api-last\"><\/time><\/div>\n            <\/td>\n            <td>Machine access to Waterinfo time series (levels, discharge, waves) for automated routing.\n              <div class=\"version\">Version: Free (public)<\/div>\n            <\/td>\n          <\/tr>\n          <tr>\n            <td>\n              <a href=\"https:\/\/data.overheid.nl\/en\/dataset\/prorail-spoorgeometrie\" target=\"_blank\" rel=\"noopener\">ProRail Rail Geometry (WMS\/WFS)<\/a>\n              <div class=\"last-updated\">Last update: <time id=\"prorail-geom-last\"><\/time><\/div>\n            <\/td>\n            <td>Open rail infrastructure layers (alignment, clearances) supporting rail path feasibility.\n              <div class=\"version\">Version: Free (public)<\/div>\n            <\/td>\n          <\/tr>\n          <tr>\n            <td>\n              <a href=\"https:\/\/data.europa.eu\/data\/datasets\/prorail-basiskaart?locale=en\" target=\"_blank\" rel=\"noopener\">ProRail Basemap<\/a>\n              <div class=\"last-updated\">Last update: <time id=\"prorail-basemap-last\"><\/time><\/div>\n            <\/td>\n            <td>National rail basemap for network context, yards and access points.\n              <div class=\"version\">Version: Free (public)<\/div>\n            <\/td>\n          <\/tr>\n          <tr>\n            <td>\n              <a href=\"https:\/\/waterinfo.rws.nl\/\" target=\"_blank\" rel=\"noopener\">Waterinfo Viewer<\/a>\n              <div class=\"last-updated\">Last update: <time id=\"waterinfo-last\"><\/time><\/div>\n            <\/td>\n            <td>Quick visual check of gauges and forecasts (situational awareness supporting the APIs).\n              <div class=\"version\">Version: Free (public)<\/div>\n            <\/td>\n          <\/tr>\n        <\/tbody>\n      <\/table>\n      \n        <!-- Title placed below the table and left-aligned, just before the legend -->\n        <div class=\"pc-desc-title\">Description of Versions<\/div>\n\n      <\/div>\n        <div class=\"pc-table-legend\" aria-hidden=\"false\">\n          <p><b>Free (public):<\/b> The content is publicly accessible on the website without login or payment.<\/p>\n        <\/div>\n  <\/section>\n  <\/main>\n<\/div>\n\n<style>\n\/* Hide WordPress default page\/post title if present *\/\nh1.entry-title, .entry-title, .page-title { display: none !important; }\n\n\/* ===== Dynamic sticky top: WP admin bar + theme header + extra offset (matches your accepted ~4 cm setting) ===== *\/\n:root{\n  --wp-adminbar: 0px;\n  --site-header: 0px;\n  --extra-offset: 160px; \/* \u22484cm; tweak here if your theme header changes *\/\n  --sticky-offset: calc(var(--wp-adminbar) + var(--site-header) + var(--extra-offset) + 12px);\n  scroll-padding-top: calc(var(--sticky-offset) + 8px);\n}\nbody.admin-bar{ --wp-adminbar: 32px; }\n@media (max-width: 782px){ body.admin-bar{ --wp-adminbar: 46px; } }\n\n\/* ===== Scoping: only style within .pc-container.polished ===== *\/\n.pc-container.polished {\n  --ink: #0b1220;\n  --muted: #5b6570;\n  --bg: #f6f8fb;\n  --card: #ffffff;\n  --accent: #0a5c94;\n  --accent-2: #7ccdf0;\n  --radius: 14px;\n  --shadow: 0 8px 28px rgba(10, 29, 56, 0.09);\n  --gap: 18px;\n  --ring: 0 0 0 3px rgba(43,176,237,.25);\n  position: relative;\n  isolation: isolate;\n  width: 100%;\n  max-width: 1200px;\n  margin: -15px;\n  padding: 20px;\n  box-sizing: border-box;\n  font-family: Inter, system-ui, Segoe UI, Roboto, Arial, sans-serif;\n  color: var(--ink);\n}\n\n\/******** Hero ********\/\n.pc-container.polished .pc-hero {\n  position: relative;\n  overflow: hidden;\n  border-radius: calc(var(--radius) + 4px);\n  padding: 28px 28px 20px;\n  box-shadow: var(--shadow);\n  background: linear-gradient(180deg, rgba(10,106,176,.03), rgba(10,106,176,.005));\n}\n.pc-container.polished .pc-hero-bg::before,\n.pc-container.polished .pc-hero-bg::after{\n  content:\"\"; position:absolute; inset:auto -10% -40% -10%; height:180px;\n  background: radial-gradient(60% 80% at 50% 0%, rgba(43,176,237,.08), transparent 70%);\n  filter: blur(40px); pointer-events:none;\n}\n.pc-container.polished .pc-hero-inner{ position: relative; z-index: 1; }\n.pc-container.polished .pc-hero-eyebrow{\n  font-size:.8rem; letter-spacing:.12em; text-transform:uppercase; color:var(--accent);\n  margin-bottom:6px; font-weight:600;\n}\n.pc-container.polished .pc-hero h1{ margin:.1rem 0 .4rem; font-size: clamp(1.4rem, 2.2vw, 2rem); letter-spacing:-.2px; }\n.pc-container.polished .lead{ margin:0; color: var(--muted); font-size: .98rem; }\n\n.pc-container.polished .pc-steps-nav{ display:flex; gap:10px; flex-wrap:wrap; margin-top:14px; }\n.pc-container.polished .chip{\n  display:inline-flex; align-items:center; gap:.5rem; padding:.48rem .72rem; border-radius:999px;\n  background: #fff; color: var(--ink); box-shadow: var(--shadow); text-decoration:none; transition: transform .2s ease, box-shadow .2s ease;\n}\n.pc-container.polished .chip .num{\n  display:inline-grid; place-items:center; width:24px; height:24px; border-radius:50%; font-size:.9rem; font-weight:700; color:#fff; background: linear-gradient(135deg, var(--accent), var(--accent-2));\n}\n.pc-container.polished .chip:hover{ transform: translateY(-2px); box-shadow: 0 10px 24px rgba(0,0,0,.10); }\n\n\/******** Sticky TOC ********\/\n.pc-container.polished .pc-toc{ position: sticky; top: var(--sticky-offset); margin: 18px 0; z-index: 3; }\n.pc-container.polished .pc-toc-inner{\n  border-radius: var(--radius); background: #ffffff; box-shadow: var(--shadow); padding: 14px 16px; border: 1px solid rgba(10,106,176,.10);\n}\n.pc-container.polished .pc-toc-title{ font-size:.9rem; font-weight:700; margin-bottom:6px; color: var(--accent); }\n.pc-container.polished .pc-toc ol{ list-style:none; padding:0; margin:0; display:grid; gap:6px; }\n.pc-container.polished .pc-toc a{ color: var(--ink); text-decoration:none; padding:6px 8px; border-radius:8px; display:block; }\n.pc-container.polished .pc-toc a:is(:hover,:focus){ background: rgba(43,176,237,.08); box-shadow: var(--ring); outline: none; }\n.pc-container.polished .pc-toc a.active{ background: linear-gradient(180deg, rgba(43,176,237,.12), rgba(43,176,237,.06)); }\n\n\/******** Cards ********\/\n.pc-container.polished .card{\n  position: relative; background: var(--card); border-radius: var(--radius); padding: 18px; margin: 16px 0; box-shadow: var(--shadow);\n}\n.pc-container.polished .card-head h2{ font-size: 1.2rem; margin: 0 0 6px; display:flex; align-items:center; gap:10px; }\n.pc-container.polished .card-head .sub{ color: var(--muted); font-size:.95rem; }\n.pc-container.polished .badge{ display:inline-flex; align-items:center; justify-content:center; height:24px; padding:0 8px; font-size:.75rem; border-radius:6px; background: linear-gradient(135deg, var(--accent), var(--accent-2)); color:#fff; box-shadow: inset 0 -1px 0 rgba(255,255,255,.25); }\n.pc-container.polished .pc-desc{ color: var(--muted); margin: 0 0 10px; }\n\/* Ensure anchor scrolling accounts for sticky bars *\/\n.pc-container.polished .pc-step{ scroll-margin-top: calc(var(--sticky-offset) + 16px); }\n.pc-container.polished .card-accent{\n  position:absolute; inset:0; border-radius: inherit; padding:1px; background: linear-gradient(135deg, rgba(10,106,176,.28), rgba(43,176,237,.28)); -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);\n  -webkit-mask-composite: xor; mask-composite: exclude; pointer-events:none; opacity:.7;\n}\n\n\/******** Grid for org cards ********\/\n.pc-container.polished .pc-grid{ display:grid; grid-template-columns: repeat(12, 1fr); gap: 14px; margin-top: 10px; }\n.pc-container.polished .pc-grid.onecol{ grid-template-columns: repeat(12, 1fr); }\n.pc-container.polished .pc-card{ grid-column: span 6; background:#fff; border:1px solid rgba(10,106,176,.10); border-radius: 12px; padding: 14px; transition: transform .2s ease, box-shadow .2s ease; }\n.pc-container.polished .pc-card:hover{ transform: translateY(-4px); box-shadow: 0 14px 28px rgba(10, 29, 56, .12); }\n.pc-container.polished .pc-card.list{ grid-column: 1 \/ -1; }\n.pc-container.polished .pc-card-head{ display:flex; align-items:center; gap:10px; margin-bottom:6px; }\n.pc-container.polished .pc-card h3{ margin:0; font-size:1.05rem; font-weight:700; }\n.pc-container.polished .pc-card ul{ margin:0; padding-left: 1.15rem; color: var(--muted); }\n.pc-container.polished .pc-icon{ display:inline-grid; place-items:center; width:28px; height:28px; border-radius:8px; background: linear-gradient(135deg, rgba(10,106,176,.15), rgba(43,176,237,.15)); color: var(--accent); flex-shrink:0; }\n.pc-container.polished .pc-icon svg{ display:block; }\n\n\/******** Links ********\/\n.pc-container.polished a{ color: var(--accent); text-decoration: none; }\n.pc-container.polished a:hover{ text-decoration: underline; }\n\n\/******** Layout ********\/\n@media (min-width: 900px){\n  \/* Two-column grid: TOC left (fixed 260px), content right (auto height), no overlap *\/\n  .pc-container.polished{ display:grid; grid-template-columns: 260px 1fr; gap:20px; align-items:start; }\n  .pc-container.polished .pc-hero{ grid-column: 1 \/ -1; }\n  .pc-container.polished .pc-toc{ grid-column: 1; align-self:start; }\n  .pc-container.polished .pc-main{ grid-column: 2; min-width:0; }\n}\n@media (max-width: 899.98px){\n  .pc-container.polished .pc-grid{ grid-template-columns: repeat(6, 1fr); }\n  .pc-container.polished .pc-card{ grid-column: 1 \/ -1; }\n}\n\n\/******** Accessible focus ********\/\n.pc-container.polished :is(a,button,[tabindex]){ outline: none; }\n.pc-container.polished :is(a,button,[tabindex]):focus{ box-shadow: var(--ring); border-radius: 8px; }\n\n\/* ===== Datasets table (sharp corners, full grid, table-only hover) ===== *\/\n.pc-table-wrap{ margin-top: 10px; }\n\n.pc-table{\n  width: 100%;\n  border-collapse: collapse;\n  background: #fff;\n  border: 1px solid rgba(10,106,176,.25);   \/* single outer border *\/\n  border-radius: 0;                          \/* sharp corners *\/\n  table-layout: fixed;\n}\n\n.pc-table th,\n.pc-table td{\n  border: 1px solid rgba(10,106,176,.2);     \/* full grid *\/\n  padding: 10px 12px;\n  vertical-align: top;\n  word-wrap: break-word;\n}\n\n\/* Header: centered black text, light transparent blue background *\/\n.pc-table thead th{\n  background: rgba(215,236,251,0.55);\n  color: #000;\n  font-weight: 700;\n  text-align: center;\n}\n\n\/* Body base *\/\n.pc-table tbody td{ text-align: left; }\n\n\/* Column colors: Data (blue), Description (muted grey) *\/\n.pc-table tbody td:first-child{\n  color: #084EAE;\n}\n.pc-table tbody td:first-child a{\n  color: #084EAE;\n  text-decoration: none;\n}\n.pc-table tbody td:first-child a:hover{\n  text-decoration: underline;\n}\n.pc-table tbody td:nth-child(2){\n  color: var(--muted);\n}\n\n\/* Gentle hover lift on the table (no container\/card movement) *\/\n.pc-anim-table{\n  transition: transform .16s ease, box-shadow .16s ease;\n  will-change: transform;\n}\n.pc-anim-table:hover,\n.pc-anim-table:focus-within{\n  transform: translateY(-3px);\n  box-shadow: 0 10px 24px rgba(10, 29, 56, 0.12);\n}\n\n@media (prefers-reduced-motion: reduce){\n  .pc-anim-table{ transition: none; }\n  .pc-anim-table:hover,\n  .pc-anim-table:focus-within{ transform: none; box-shadow: none; }\n}\n<\/style>\n\n<style>\n\/* Small title when placed below the table *\/\n.pc-desc-title{ color: #000; font-weight:700; font-size: .95rem; text-align: left; margin: 10px 0 6px; }\n\n\/* Legend headings match link blue but render normal weight *\/\n.pc-table-legend{ margin-top: 12px; font-size: .95rem; color: var(--muted); }\n.pc-table-legend b{ color: #084EAE; font-weight: 400; }\n\n\/* Left-column small 'last-updated' text only *\/\n.pc-table tbody td:first-child .last-updated{\n  color: #666;\n  display: block;\n  font-size: .9rem;\n  margin-top: 6px;\n  font-style: italic;\n}\n\n\/* Version text for right-column descriptions *\/\n.pc-table tbody td:nth-child(2) .version{\n  color: var(--muted);\n  display: block;\n  font-size: .92rem;\n  margin-top: 8px;\n  font-style: italic;\n}\n<\/style>\n\n<script>\n  (function () {\n    const rows = Array.from(document.querySelectorAll('.pc-table tbody td:first-child'));\n    if (!rows.length) return;\n\n    function formatDateOnly(d) {\n      try {\n        const day = String(d.getDate()).padStart(2, '0');\n        const month = String(d.getMonth() + 1).padStart(2, '0');\n        const year = d.getFullYear();\n        return `${day}\/${month}\/${year}`;\n      } catch (e) { return d.toISOString().slice(0,10); }\n    }\n\n    async function fetchLastModified(url) {\n      try {\n        let resp;\n        try { resp = await fetch(url, { method: 'HEAD', mode: 'cors', cache: 'no-cache' }); } catch (e) { resp = null; }\n        let last = resp && resp.ok ? resp.headers.get('last-modified') : null;\n\n        if (!last) {\n          try { resp = await fetch(url, { method: 'GET', mode: 'cors', cache: 'no-cache' }); } catch (e) { resp = null; }\n          if (resp && resp.ok) {\n            last = resp.headers.get('last-modified');\n            if (!last) {\n              try {\n                const txt = await resp.text();\n                const m = txt.match(\/(?:Last updated|Last update|Updated on|Updated:)\\s*([A-Za-z0-9,\\-:\\.\\s]+)\/i);\n                if (m && m[1]) last = m[1].trim();\n              } catch (e) { \/* ignore *\/ }\n            }\n          }\n        }\n\n        return last || null;\n      } catch (err) { return null; }\n    }\n\n    rows.forEach(async (td) => {\n      const a = td.querySelector('a[href]');\n      const timeEl = td.querySelector('time');\n      if (!a || !timeEl) return;\n      const url = a.href;\n\n      const last = await fetchLastModified(url);\n      if (!last) {\n        const dLocal = new Date(document.lastModified);\n        timeEl.dateTime = dLocal.toISOString();\n        timeEl.textContent = formatDateOnly(dLocal);\n        return;\n      }\n\n      const d = new Date(last);\n      if (!isNaN(d)) {\n        timeEl.dateTime = d.toISOString();\n        timeEl.textContent = formatDateOnly(d);\n      } else {\n        timeEl.textContent = last.split('\\n')[0].trim();\n      }\n    });\n  })();\n<\/script>\n<script>\n\/* Make Research Problems cards clickable (data-url priority, plus mapping) *\/\n(function(){\n  const researchLinks = [\n    { title: 'Truck Appointment Scheduling', url: 'https:\/\/aiportcenter.nl\/index.php\/truck-appointment-scheduling\/' },\n    { title: 'Yard-Vehicle Routing', url: 'https:\/\/aiportcenter.nl\/index.php\/yard-vehicle-routing\/' },\n    { title: 'Yard-Crane Scheduling', url: 'https:\/\/aiportcenter.nl\/index.php\/yard-crane\/' }\n  ];\n  const linksByIndex = [];\n  const section = document.getElementById('research');\n  if(!section) return;\n  const cards = Array.from(section.querySelectorAll('.pc-card'));\n  cards.forEach((card, idx) => {\n    const h3 = card.querySelector('h3');\n    const title = h3 ? h3.textContent.trim() : null;\n    const dataUrl = card.dataset && (card.dataset.url || card.dataset.href || card.dataset.link);\n    let mapping = null;\n    if(dataUrl) mapping = { url: dataUrl };\n    if(!mapping) mapping = researchLinks.find(r => r.title === title && r.url);\n    if(!mapping && linksByIndex[idx]) mapping = { url: linksByIndex[idx] };\n    if(mapping && mapping.url){\n      card.tabIndex = 0; card.setAttribute('role','link'); card.style.cursor = 'pointer';\n      card.addEventListener('click', ()=> window.open(mapping.url, '_blank'));\n      card.addEventListener('keydown', (ev)=> { if(ev.key === 'Enter' || ev.key === ' '){ ev.preventDefault(); window.open(mapping.url, '_blank'); } });\n      const anchor = document.createElement('a'); anchor.href = mapping.url; anchor.target = '_blank'; anchor.rel = 'noopener noreferrer';\n      anchor.setAttribute('aria-hidden','true'); anchor.style.position = 'absolute'; anchor.style.inset = '0'; anchor.style.zIndex = '2'; anchor.style.background = 'transparent'; anchor.style.textDecoration = 'none';\n      const pos = getComputedStyle(card).position; if(!pos || pos === 'static') card.style.position = 'relative'; card.appendChild(anchor);\n    }\n  });\n  const toc = document.querySelector('#hinterland-rotterdam .pc-toc ol');\n  if(toc){ const existing = toc.querySelector('a[href=\"#research\"]'); if(!existing){ const li = document.createElement('li'); const a = document.createElement('a'); a.href = '#research'; a.textContent = 'Research Problems'; li.appendChild(a); const execItem = toc.querySelector('a[href=\"#exec\"]'); if(execItem && execItem.parentNode) toc.insertBefore(li, execItem.parentNode); else toc.appendChild(li); } else { existing.textContent = 'Research Problems'; } }\n})();\n<\/script>\n\n<script>\n\/\/ ===== Smooth scroll + active TOC highlighting + header height detection =====\n(function(){\n  \/\/ Detect fixed\/sticky site header height and set --site-header\n  try{\n    const root = document.documentElement;\n    const detect = () => {\n      const nodes = Array.from(document.querySelectorAll(\n        'header, .site-header, #masthead, .navbar, .header, [data-fixed-header], ' +\n        '.sticky-header, .header-wrapper, .elementor-location-header, ' +\n        '.fl-page-header, .fusion-header, .kadence-header, .ast-primary-header-bar, ' +\n        '.generatepress-header, .blocksy-header'\n      ));\n      const fixedLike = nodes.filter(el => {\n        const cs = getComputedStyle(el);\n        const pos = cs.position;\n        const top = Math.round(el.getBoundingClientRect().top);\n        return (pos==='fixed' || pos==='sticky') && top <= 0 &#038;&#038; el.offsetHeight > 0;\n      });\n      const h = fixedLike.reduce((m,el)=> Math.max(m, el.offsetHeight||0), 0);\n      root.style.setProperty('--site-header', h + 'px');\n    };\n    ['load','resize','scroll'].forEach(ev=> window.addEventListener(ev, detect, { passive:true }));\n    detect();\n  }catch(e){}\n\n  const tocLinks = Array.from(document.querySelectorAll('#hinterland-rotterdam .pc-toc a'));\n  const sections = tocLinks.map(a => document.querySelector(a.getAttribute('href'))).filter(Boolean);\n\n  tocLinks.forEach(a=>a.addEventListener('click', e=>{\n    e.preventDefault();\n    document.querySelector(a.getAttribute('href')).scrollIntoView({behavior:'smooth', block:'start'});\n  }));\n\n  const io = new IntersectionObserver((entries)=>{\n    entries.forEach(entry=>{\n      const id = '#' + entry.target.id;\n      const link = tocLinks.find(l=>l.getAttribute('href')===id);\n      if(link && entry.isIntersecting){\n        tocLinks.forEach(l=>l.classList.remove('active'));\n        link.classList.add('active');\n      }\n    })\n  },{ rootMargin: 'calc(var(--sticky-offset) * -1) 0px -60% 0px', threshold: 0.01 });\n  sections.forEach(sec=> io.observe(sec));\n})();\n<\/script>\n<!-- ========= \/END HINTERLAND TRANSPORT (POLISHED) ========= -->\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Home \u203a Port-Call Data Hub \u203a Processes Timeline \u203a Hinterland Transport Port-Call Optimization at the Port of Rotterdam Hinterland Transport Connects the yard to the consignee by truck, rail, or barge within time windows and capacity limits. Slot bookings, gate moves, and intermodal transfers are planned backward from customs release. Inputs include transport orders, slotting [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_uag_custom_page_level_css":"","footnotes":""},"class_list":["post-374","page","type-page","status-publish","hentry"],"blocksy_meta":[],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":"peterwenzel","author_link":"https:\/\/aiportcenter.nl\/index.php\/author\/peterwenzel\/"},"uagb_comment_info":0,"uagb_excerpt":"Home \u203a Port-Call Data Hub \u203a Processes Timeline \u203a Hinterland Transport Port-Call Optimization at the Port of Rotterdam Hinterland Transport Connects the yard to the consignee by truck, rail, or barge within time windows and capacity limits. Slot bookings, gate moves, and intermodal transfers are planned backward from customs release. Inputs include transport orders, slotting&hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/aiportcenter.nl\/index.php\/wp-json\/wp\/v2\/pages\/374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aiportcenter.nl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aiportcenter.nl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aiportcenter.nl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/aiportcenter.nl\/index.php\/wp-json\/wp\/v2\/comments?post=374"}],"version-history":[{"count":27,"href":"https:\/\/aiportcenter.nl\/index.php\/wp-json\/wp\/v2\/pages\/374\/revisions"}],"predecessor-version":[{"id":1660,"href":"https:\/\/aiportcenter.nl\/index.php\/wp-json\/wp\/v2\/pages\/374\/revisions\/1660"}],"wp:attachment":[{"href":"https:\/\/aiportcenter.nl\/index.php\/wp-json\/wp\/v2\/media?parent=374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}