googlemaps-kit 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +228 -27
- package/dist/advanced/http.d.ts +4 -4
- package/dist/advanced/http.d.ts.map +1 -1
- package/dist/advanced/http.js +4 -4
- package/dist/advanced/http.js.map +1 -1
- package/dist/advanced/parsers.d.ts +9 -4
- package/dist/advanced/parsers.d.ts.map +1 -1
- package/dist/advanced/parsers.js +6 -3
- package/dist/advanced/parsers.js.map +1 -1
- package/dist/advanced/rpc.d.ts +12 -12
- package/dist/advanced/rpc.d.ts.map +1 -1
- package/dist/advanced/rpc.js +10 -10
- package/dist/advanced/rpc.js.map +1 -1
- package/dist/advanced/services.d.ts +18 -7
- package/dist/advanced/services.d.ts.map +1 -1
- package/dist/advanced/services.js +18 -7
- package/dist/advanced/services.js.map +1 -1
- package/dist/advanced/utils.d.ts +3 -3
- package/dist/advanced/utils.d.ts.map +1 -1
- package/dist/advanced/utils.js +3 -3
- package/dist/advanced/utils.js.map +1 -1
- package/dist/advanced.d.ts +47 -10
- package/dist/advanced.d.ts.map +1 -1
- package/dist/advanced.js +13 -6
- package/dist/advanced.js.map +1 -1
- package/dist/auth/auth-status.js +2 -2
- package/dist/auth/auth-status.js.map +1 -1
- package/dist/auth/maps-tokens.js +1 -1
- package/dist/auth/session.d.ts.map +1 -1
- package/dist/auth/session.js +17 -2
- package/dist/auth/session.js.map +1 -1
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +24 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +18 -27
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/output.d.ts +19 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +82 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/run.d.ts +55 -3
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +239 -18
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/tui/app.d.ts +7 -2
- package/dist/cli/tui/app.d.ts.map +1 -1
- package/dist/cli/tui/app.js +116 -31
- package/dist/cli/tui/app.js.map +1 -1
- package/dist/cli/tui/styles.d.ts.map +1 -1
- package/dist/cli/tui/styles.js +13 -10
- package/dist/cli/tui/styles.js.map +1 -1
- package/dist/cli.d.ts +1 -10
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +122 -36
- package/dist/cli.js.map +1 -1
- package/dist/client/gmaps-client.d.ts +14 -31
- package/dist/client/gmaps-client.d.ts.map +1 -1
- package/dist/client/gmaps-client.js +52 -130
- package/dist/client/gmaps-client.js.map +1 -1
- package/dist/client/http-client.d.ts.map +1 -1
- package/dist/client/http-client.js +11 -9
- package/dist/client/http-client.js.map +1 -1
- package/dist/client/intent.d.ts +2 -12
- package/dist/client/intent.d.ts.map +1 -1
- package/dist/client/intent.js +39 -18
- package/dist/client/intent.js.map +1 -1
- package/dist/client/maps-tools.d.ts +19 -3
- package/dist/client/maps-tools.d.ts.map +1 -1
- package/dist/client/maps-tools.js +57 -4
- package/dist/client/maps-tools.js.map +1 -1
- package/dist/client/namespaces.d.ts +125 -16
- package/dist/client/namespaces.d.ts.map +1 -1
- package/dist/client/namespaces.js +189 -23
- package/dist/client/namespaces.js.map +1 -1
- package/dist/client/place-enrichment.js +1 -1
- package/dist/client/place-enrichment.js.map +1 -1
- package/dist/client/place-workflows.d.ts +7 -0
- package/dist/client/place-workflows.d.ts.map +1 -0
- package/dist/client/place-workflows.js +113 -0
- package/dist/client/place-workflows.js.map +1 -0
- package/dist/index.d.ts +54 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/known-surfaces.d.ts +173 -5
- package/dist/known-surfaces.d.ts.map +1 -1
- package/dist/known-surfaces.js +173 -5
- package/dist/known-surfaces.js.map +1 -1
- package/dist/parsers/batch-url.d.ts +10 -1
- package/dist/parsers/batch-url.d.ts.map +1 -1
- package/dist/parsers/batch-url.js +30 -2
- package/dist/parsers/batch-url.js.map +1 -1
- package/dist/parsers/boq-reviews.d.ts +8 -1
- package/dist/parsers/boq-reviews.d.ts.map +1 -1
- package/dist/parsers/boq-reviews.js +50 -8
- package/dist/parsers/boq-reviews.js.map +1 -1
- package/dist/parsers/categories.d.ts.map +1 -1
- package/dist/parsers/categories.js +13 -10
- package/dist/parsers/categories.js.map +1 -1
- package/dist/parsers/directions.d.ts +18 -2
- package/dist/parsers/directions.d.ts.map +1 -1
- package/dist/parsers/directions.js +232 -18
- package/dist/parsers/directions.js.map +1 -1
- package/dist/parsers/geocode.d.ts +20 -2
- package/dist/parsers/geocode.d.ts.map +1 -1
- package/dist/parsers/geocode.js +139 -6
- package/dist/parsers/geocode.js.map +1 -1
- package/dist/parsers/knowledge.js +1 -1
- package/dist/parsers/knowledge.js.map +1 -1
- package/dist/parsers/lists.d.ts.map +1 -1
- package/dist/parsers/lists.js +29 -12
- package/dist/parsers/lists.js.map +1 -1
- package/dist/parsers/local-posts.d.ts.map +1 -1
- package/dist/parsers/local-posts.js +97 -12
- package/dist/parsers/local-posts.js.map +1 -1
- package/dist/parsers/mobility.d.ts +42 -0
- package/dist/parsers/mobility.d.ts.map +1 -0
- package/dist/parsers/mobility.js +130 -0
- package/dist/parsers/mobility.js.map +1 -0
- package/dist/parsers/panorama.d.ts +0 -1
- package/dist/parsers/panorama.d.ts.map +1 -1
- package/dist/parsers/panorama.js +117 -14
- package/dist/parsers/panorama.js.map +1 -1
- package/dist/parsers/photos.d.ts.map +1 -1
- package/dist/parsers/photos.js +15 -8
- package/dist/parsers/photos.js.map +1 -1
- package/dist/parsers/place-attributes.d.ts +12 -3
- package/dist/parsers/place-attributes.d.ts.map +1 -1
- package/dist/parsers/place-attributes.js +48 -2
- package/dist/parsers/place-attributes.js.map +1 -1
- package/dist/parsers/place-extended.d.ts +163 -0
- package/dist/parsers/place-extended.d.ts.map +1 -0
- package/dist/parsers/place-extended.js +741 -0
- package/dist/parsers/place-extended.js.map +1 -0
- package/dist/parsers/place.d.ts +15 -1
- package/dist/parsers/place.d.ts.map +1 -1
- package/dist/parsers/place.js +16 -5
- package/dist/parsers/place.js.map +1 -1
- package/dist/parsers/popular-times.d.ts +35 -0
- package/dist/parsers/popular-times.d.ts.map +1 -0
- package/dist/parsers/popular-times.js +149 -0
- package/dist/parsers/popular-times.js.map +1 -0
- package/dist/parsers/reveal.d.ts +1 -1
- package/dist/parsers/reveal.d.ts.map +1 -1
- package/dist/parsers/reveal.js +3 -2
- package/dist/parsers/reveal.js.map +1 -1
- package/dist/parsers/reviews.d.ts +24 -2
- package/dist/parsers/reviews.d.ts.map +1 -1
- package/dist/parsers/reviews.js +110 -1
- package/dist/parsers/reviews.js.map +1 -1
- package/dist/parsers/search.d.ts +17 -2
- package/dist/parsers/search.d.ts.map +1 -1
- package/dist/parsers/search.js +125 -7
- package/dist/parsers/search.js.map +1 -1
- package/dist/parsers/shared.d.ts +4 -0
- package/dist/parsers/shared.d.ts.map +1 -1
- package/dist/parsers/shared.js +10 -2
- package/dist/parsers/shared.js.map +1 -1
- package/dist/parsers/suggest.d.ts.map +1 -1
- package/dist/parsers/suggest.js +45 -6
- package/dist/parsers/suggest.js.map +1 -1
- package/dist/parsers/tiles.d.ts +13 -0
- package/dist/parsers/tiles.d.ts.map +1 -1
- package/dist/parsers/tiles.js +64 -0
- package/dist/parsers/tiles.js.map +1 -1
- package/dist/parsers/traffic.d.ts +9 -1
- package/dist/parsers/traffic.d.ts.map +1 -1
- package/dist/parsers/traffic.js +129 -2
- package/dist/parsers/traffic.js.map +1 -1
- package/dist/parsers/transit.d.ts +4 -2
- package/dist/parsers/transit.d.ts.map +1 -1
- package/dist/parsers/transit.js +385 -3
- package/dist/parsers/transit.js.map +1 -1
- package/dist/parsers/viewport.d.ts +20 -0
- package/dist/parsers/viewport.d.ts.map +1 -0
- package/dist/parsers/viewport.js +139 -0
- package/dist/parsers/viewport.js.map +1 -0
- package/dist/platform/catalog.d.ts +18 -0
- package/dist/platform/catalog.d.ts.map +1 -0
- package/dist/platform/catalog.js +329 -0
- package/dist/platform/catalog.js.map +1 -0
- package/dist/platform/parity.d.ts +12 -0
- package/dist/platform/parity.d.ts.map +1 -0
- package/dist/platform/parity.js +25 -0
- package/dist/platform/parity.js.map +1 -0
- package/dist/rpc/batch-execute.js +3 -3
- package/dist/rpc/batch-execute.js.map +1 -1
- package/dist/rpc/batch-request-builders.d.ts +12 -14
- package/dist/rpc/batch-request-builders.d.ts.map +1 -1
- package/dist/rpc/batch-request-builders.js +49 -17
- package/dist/rpc/batch-request-builders.js.map +1 -1
- package/dist/rpc/batch-rpc.js +1 -1
- package/dist/rpc/batch-services.d.ts +2 -0
- package/dist/rpc/batch-services.d.ts.map +1 -1
- package/dist/rpc/batch-services.js +4 -0
- package/dist/rpc/batch-services.js.map +1 -1
- package/dist/rpc/{descriptor-registry.d.ts → descriptors.d.ts} +29 -4
- package/dist/rpc/descriptors.d.ts.map +1 -0
- package/dist/rpc/{app-options.js → descriptors.js} +89 -5
- package/dist/rpc/descriptors.js.map +1 -0
- package/dist/rpc/earth-rocktree.d.ts +174 -0
- package/dist/rpc/earth-rocktree.d.ts.map +1 -0
- package/dist/rpc/earth-rocktree.js +468 -0
- package/dist/rpc/earth-rocktree.js.map +1 -0
- package/dist/rpc/feature-pb.d.ts +86 -0
- package/dist/rpc/feature-pb.d.ts.map +1 -0
- package/dist/rpc/feature-pb.js +112 -0
- package/dist/rpc/feature-pb.js.map +1 -0
- package/dist/rpc/feature-rpc.d.ts +15 -0
- package/dist/rpc/feature-rpc.d.ts.map +1 -1
- package/dist/rpc/feature-rpc.js +44 -0
- package/dist/rpc/feature-rpc.js.map +1 -1
- package/dist/rpc/maps-runtime.js +1 -1
- package/dist/rpc/panorama-pb.d.ts +3 -0
- package/dist/rpc/panorama-pb.d.ts.map +1 -1
- package/dist/rpc/panorama-pb.js +35 -3
- package/dist/rpc/panorama-pb.js.map +1 -1
- package/dist/rpc/pb-builders.d.ts +21 -1
- package/dist/rpc/pb-builders.d.ts.map +1 -1
- package/dist/rpc/pb-builders.js +62 -4
- package/dist/rpc/pb-builders.js.map +1 -1
- package/dist/rpc/photos-pb.d.ts +28 -1
- package/dist/rpc/photos-pb.d.ts.map +1 -1
- package/dist/rpc/photos-pb.js +96 -0
- package/dist/rpc/photos-pb.js.map +1 -1
- package/dist/rpc/rpc-methods.d.ts +0 -2
- package/dist/rpc/rpc-methods.d.ts.map +1 -1
- package/dist/rpc/rpc-methods.js +0 -38
- package/dist/rpc/rpc-methods.js.map +1 -1
- package/dist/rpc/search-filters.d.ts +0 -12
- package/dist/rpc/search-filters.d.ts.map +1 -1
- package/dist/rpc/search-filters.js +1 -11
- package/dist/rpc/search-filters.js.map +1 -1
- package/dist/rpc/tile-builders.d.ts +136 -0
- package/dist/rpc/tile-builders.d.ts.map +1 -0
- package/dist/rpc/tile-builders.js +172 -0
- package/dist/rpc/tile-builders.js.map +1 -0
- package/dist/rpc/xsrf-bootstrap.d.ts +0 -2
- package/dist/rpc/xsrf-bootstrap.d.ts.map +1 -1
- package/dist/rpc/xsrf-bootstrap.js +2 -2
- package/dist/rpc/xsrf-bootstrap.js.map +1 -1
- package/dist/services/aerial-view.d.ts +22 -0
- package/dist/services/aerial-view.d.ts.map +1 -0
- package/dist/services/aerial-view.js +107 -0
- package/dist/services/aerial-view.js.map +1 -0
- package/dist/services/ask-maps.d.ts +45 -5
- package/dist/services/ask-maps.d.ts.map +1 -1
- package/dist/services/ask-maps.js +148 -21
- package/dist/services/ask-maps.js.map +1 -1
- package/dist/services/directions.d.ts +17 -1
- package/dist/services/directions.d.ts.map +1 -1
- package/dist/services/directions.js +32 -0
- package/dist/services/directions.js.map +1 -1
- package/dist/services/distance-matrix.d.ts +1 -1
- package/dist/services/distance-matrix.d.ts.map +1 -1
- package/dist/services/distance-matrix.js +1 -1
- package/dist/services/distance-matrix.js.map +1 -1
- package/dist/services/elevation.d.ts +7 -5
- package/dist/services/elevation.d.ts.map +1 -1
- package/dist/services/elevation.js +42 -6
- package/dist/services/elevation.js.map +1 -1
- package/dist/services/environment/air-quality.d.ts +39 -0
- package/dist/services/environment/air-quality.d.ts.map +1 -0
- package/dist/services/environment/air-quality.js +86 -0
- package/dist/services/environment/air-quality.js.map +1 -0
- package/dist/services/environment/weather.d.ts +39 -0
- package/dist/services/environment/weather.d.ts.map +1 -0
- package/dist/services/environment/weather.js +54 -0
- package/dist/services/environment/weather.js.map +1 -0
- package/dist/services/geocode.d.ts +21 -1
- package/dist/services/geocode.d.ts.map +1 -1
- package/dist/services/geocode.js +103 -0
- package/dist/services/geocode.js.map +1 -1
- package/dist/services/keyed.d.ts +80 -0
- package/dist/services/keyed.d.ts.map +1 -0
- package/dist/services/keyed.js +152 -0
- package/dist/services/keyed.js.map +1 -0
- package/dist/services/knowledge.d.ts +6 -2
- package/dist/services/knowledge.d.ts.map +1 -1
- package/dist/services/knowledge.js +30 -5
- package/dist/services/knowledge.js.map +1 -1
- package/dist/services/lists.d.ts +7 -1
- package/dist/services/lists.d.ts.map +1 -1
- package/dist/services/lists.js +45 -1
- package/dist/services/lists.js.map +1 -1
- package/dist/services/map-3d.d.ts +66 -0
- package/dist/services/map-3d.d.ts.map +1 -0
- package/dist/services/map-3d.js +658 -0
- package/dist/services/map-3d.js.map +1 -0
- package/dist/services/map-layers.d.ts +33 -0
- package/dist/services/map-layers.d.ts.map +1 -0
- package/dist/services/map-layers.js +207 -0
- package/dist/services/map-layers.js.map +1 -0
- package/dist/services/meta.d.ts +71 -0
- package/dist/services/meta.d.ts.map +1 -0
- package/dist/services/meta.js +132 -0
- package/dist/services/meta.js.map +1 -0
- package/dist/services/mobility.d.ts +79 -0
- package/dist/services/mobility.d.ts.map +1 -0
- package/dist/services/mobility.js +307 -0
- package/dist/services/mobility.js.map +1 -0
- package/dist/services/nearby-search.d.ts +32 -0
- package/dist/services/nearby-search.d.ts.map +1 -0
- package/dist/services/nearby-search.js +85 -0
- package/dist/services/nearby-search.js.map +1 -0
- package/dist/services/panorama.d.ts +19 -1
- package/dist/services/panorama.d.ts.map +1 -1
- package/dist/services/panorama.js +111 -3
- package/dist/services/panorama.js.map +1 -1
- package/dist/services/photos.d.ts.map +1 -1
- package/dist/services/photos.js +12 -6
- package/dist/services/photos.js.map +1 -1
- package/dist/services/place-attributes.d.ts +31 -0
- package/dist/services/place-attributes.d.ts.map +1 -0
- package/dist/services/place-attributes.js +48 -0
- package/dist/services/place-attributes.js.map +1 -0
- package/dist/services/places.d.ts +13 -0
- package/dist/services/places.d.ts.map +1 -1
- package/dist/services/places.js +7 -4
- package/dist/services/places.js.map +1 -1
- package/dist/services/reviews.d.ts +11 -1
- package/dist/services/reviews.d.ts.map +1 -1
- package/dist/services/reviews.js +36 -12
- package/dist/services/reviews.js.map +1 -1
- package/dist/services/search-along-route.d.ts +33 -0
- package/dist/services/search-along-route.d.ts.map +1 -0
- package/dist/services/search-along-route.js +200 -0
- package/dist/services/search-along-route.js.map +1 -0
- package/dist/services/search.d.ts +29 -2
- package/dist/services/search.d.ts.map +1 -1
- package/dist/services/search.js +169 -6
- package/dist/services/search.js.map +1 -1
- package/dist/services/static-map.js +1 -1
- package/dist/services/static-map.js.map +1 -1
- package/dist/services/tiles.d.ts +39 -2
- package/dist/services/tiles.d.ts.map +1 -1
- package/dist/services/tiles.js +172 -13
- package/dist/services/tiles.js.map +1 -1
- package/dist/services/traffic.d.ts +12 -1
- package/dist/services/traffic.d.ts.map +1 -1
- package/dist/services/traffic.js +25 -2
- package/dist/services/traffic.js.map +1 -1
- package/dist/services/transit.d.ts +20 -3
- package/dist/services/transit.d.ts.map +1 -1
- package/dist/services/transit.js +69 -1
- package/dist/services/transit.js.map +1 -1
- package/dist/services/viewport.d.ts +76 -0
- package/dist/services/viewport.d.ts.map +1 -0
- package/dist/services/viewport.js +180 -0
- package/dist/services/viewport.js.map +1 -0
- package/dist/services/waypoint-optimizer.d.ts +31 -0
- package/dist/services/waypoint-optimizer.d.ts.map +1 -0
- package/dist/services/waypoint-optimizer.js +235 -0
- package/dist/services/waypoint-optimizer.js.map +1 -0
- package/dist/types/aerial-view.d.ts +39 -0
- package/dist/types/aerial-view.d.ts.map +1 -0
- package/dist/types/aerial-view.js +2 -0
- package/dist/types/aerial-view.js.map +1 -0
- package/dist/types/batch-url.d.ts +31 -0
- package/dist/types/batch-url.d.ts.map +1 -1
- package/dist/types/categories.d.ts +20 -4
- package/dist/types/categories.d.ts.map +1 -1
- package/dist/types/common.d.ts +192 -24
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types/common.js +1 -1
- package/dist/types/common.js.map +1 -1
- package/dist/types/directions.d.ts +217 -3
- package/dist/types/directions.d.ts.map +1 -1
- package/dist/types/dx.d.ts +69 -11
- package/dist/types/dx.d.ts.map +1 -1
- package/dist/types/geocode.d.ts +61 -3
- package/dist/types/geocode.d.ts.map +1 -1
- package/dist/types/grid-search.d.ts +66 -0
- package/dist/types/grid-search.d.ts.map +1 -0
- package/dist/types/grid-search.js +2 -0
- package/dist/types/grid-search.js.map +1 -0
- package/dist/types/hooks.d.ts +3 -3
- package/dist/types/hooks.d.ts.map +1 -1
- package/dist/types/links.d.ts +3 -6
- package/dist/types/links.d.ts.map +1 -1
- package/dist/types/lists.d.ts +68 -3
- package/dist/types/lists.d.ts.map +1 -1
- package/dist/types/map-3d.d.ts +126 -0
- package/dist/types/map-3d.d.ts.map +1 -0
- package/dist/types/map-3d.js +2 -0
- package/dist/types/map-3d.js.map +1 -0
- package/dist/types/map-earth.d.ts +34 -0
- package/dist/types/map-earth.d.ts.map +1 -0
- package/dist/types/map-earth.js +2 -0
- package/dist/types/map-earth.js.map +1 -0
- package/dist/types/map-layers.d.ts +63 -0
- package/dist/types/map-layers.d.ts.map +1 -0
- package/dist/types/map-layers.js +2 -0
- package/dist/types/map-layers.js.map +1 -0
- package/dist/types/mobility.d.ts +121 -0
- package/dist/types/mobility.d.ts.map +1 -0
- package/dist/types/mobility.js +3 -0
- package/dist/types/mobility.js.map +1 -0
- package/dist/types/panorama.d.ts +123 -0
- package/dist/types/panorama.d.ts.map +1 -1
- package/dist/types/photos.d.ts +12 -0
- package/dist/types/photos.d.ts.map +1 -1
- package/dist/types/photos.js +2 -1
- package/dist/types/photos.js.map +1 -1
- package/dist/types/place-attributes.d.ts +15 -0
- package/dist/types/place-attributes.d.ts.map +1 -0
- package/dist/types/place-attributes.js +2 -0
- package/dist/types/place-attributes.js.map +1 -0
- package/dist/types/place-extended.d.ts +406 -0
- package/dist/types/place-extended.d.ts.map +1 -0
- package/dist/types/place-extended.js +18 -0
- package/dist/types/place-extended.js.map +1 -0
- package/dist/types/protobuf.d.ts +1 -1
- package/dist/types/protobuf.js +1 -1
- package/dist/types/reviews.d.ts +28 -1
- package/dist/types/reviews.d.ts.map +1 -1
- package/dist/types/reviews.js.map +1 -1
- package/dist/types/route-optimization.d.ts +56 -0
- package/dist/types/route-optimization.d.ts.map +1 -0
- package/dist/types/route-optimization.js +2 -0
- package/dist/types/route-optimization.js.map +1 -0
- package/dist/types/search-along-route.d.ts +49 -0
- package/dist/types/search-along-route.d.ts.map +1 -0
- package/dist/types/search-along-route.js +2 -0
- package/dist/types/search-along-route.js.map +1 -0
- package/dist/types/search-filters.d.ts +1 -1
- package/dist/types/search-filters.js +1 -1
- package/dist/types/suggest.d.ts +23 -2
- package/dist/types/suggest.d.ts.map +1 -1
- package/dist/types/tiles.d.ts +40 -0
- package/dist/types/tiles.d.ts.map +1 -1
- package/dist/types/traffic.d.ts +58 -1
- package/dist/types/traffic.d.ts.map +1 -1
- package/dist/types/transit.d.ts +160 -1
- package/dist/types/transit.d.ts.map +1 -1
- package/dist/types/transit.js +0 -1
- package/dist/types/transit.js.map +1 -1
- package/dist/types/viewport.d.ts +159 -0
- package/dist/types/viewport.d.ts.map +1 -0
- package/dist/types/viewport.js +3 -0
- package/dist/types/viewport.js.map +1 -0
- package/dist/utils/async.d.ts +44 -0
- package/dist/utils/async.d.ts.map +1 -0
- package/dist/utils/async.js +132 -0
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/encoded-polyline.d.ts +43 -0
- package/dist/utils/encoded-polyline.d.ts.map +1 -1
- package/dist/utils/encoded-polyline.js +71 -0
- package/dist/utils/encoded-polyline.js.map +1 -1
- package/dist/utils/env.d.ts +6 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/{load-env.js → env.js} +32 -7
- package/dist/utils/env.js.map +1 -0
- package/dist/utils/geo.d.ts +12 -0
- package/dist/utils/geo.d.ts.map +1 -1
- package/dist/utils/geo.js +20 -0
- package/dist/utils/geo.js.map +1 -1
- package/dist/utils/hooks.d.ts +2 -3
- package/dist/utils/hooks.d.ts.map +1 -1
- package/dist/utils/hooks.js +1 -1
- package/dist/utils/hooks.js.map +1 -1
- package/dist/utils/ids.d.ts +1 -0
- package/dist/utils/ids.d.ts.map +1 -1
- package/dist/utils/ids.js +10 -0
- package/dist/utils/ids.js.map +1 -1
- package/dist/utils/net.d.ts +46 -0
- package/dist/utils/net.d.ts.map +1 -0
- package/dist/utils/net.js +150 -0
- package/dist/utils/net.js.map +1 -0
- package/dist/utils/payload.d.ts +22 -0
- package/dist/utils/payload.d.ts.map +1 -0
- package/dist/utils/{chunked-decoder.js → payload.js} +80 -2
- package/dist/utils/payload.js.map +1 -0
- package/dist/utils/place-ref.d.ts +40 -3
- package/dist/utils/place-ref.d.ts.map +1 -1
- package/dist/utils/place-ref.js +94 -2
- package/dist/utils/place-ref.js.map +1 -1
- package/package.json +8 -5
- package/dist/client/product-namespaces.d.ts +0 -30
- package/dist/client/product-namespaces.d.ts.map +0 -1
- package/dist/client/product-namespaces.js +0 -47
- package/dist/client/product-namespaces.js.map +0 -1
- package/dist/parsers/elevation-directions.d.ts +0 -18
- package/dist/parsers/elevation-directions.d.ts.map +0 -1
- package/dist/parsers/elevation-directions.js +0 -102
- package/dist/parsers/elevation-directions.js.map +0 -1
- package/dist/parsers/passiveassist.d.ts +0 -10
- package/dist/parsers/passiveassist.d.ts.map +0 -1
- package/dist/parsers/passiveassist.js +0 -61
- package/dist/parsers/passiveassist.js.map +0 -1
- package/dist/parsers/review-aggregates.d.ts +0 -7
- package/dist/parsers/review-aggregates.d.ts.map +0 -1
- package/dist/parsers/review-aggregates.js +0 -18
- package/dist/parsers/review-aggregates.js.map +0 -1
- package/dist/parsers/review-client-filters.d.ts +0 -8
- package/dist/parsers/review-client-filters.d.ts.map +0 -1
- package/dist/parsers/review-client-filters.js +0 -28
- package/dist/parsers/review-client-filters.js.map +0 -1
- package/dist/parsers/search-client-filters.d.ts +0 -7
- package/dist/parsers/search-client-filters.d.ts.map +0 -1
- package/dist/parsers/search-client-filters.js +0 -44
- package/dist/parsers/search-client-filters.js.map +0 -1
- package/dist/parsers/search-pagination.d.ts +0 -12
- package/dist/parsers/search-pagination.d.ts.map +0 -1
- package/dist/parsers/search-pagination.js +0 -34
- package/dist/parsers/search-pagination.js.map +0 -1
- package/dist/parsers/timezone-geocode.d.ts +0 -20
- package/dist/parsers/timezone-geocode.d.ts.map +0 -1
- package/dist/parsers/timezone-geocode.js +0 -96
- package/dist/parsers/timezone-geocode.js.map +0 -1
- package/dist/parsers/ugc-aggregates.d.ts +0 -9
- package/dist/parsers/ugc-aggregates.d.ts.map +0 -1
- package/dist/parsers/ugc-aggregates.js +0 -23
- package/dist/parsers/ugc-aggregates.js.map +0 -1
- package/dist/rpc/app-options.d.ts +0 -25
- package/dist/rpc/app-options.d.ts.map +0 -1
- package/dist/rpc/app-options.js.map +0 -1
- package/dist/rpc/batchexecute-args.d.ts +0 -30
- package/dist/rpc/batchexecute-args.d.ts.map +0 -1
- package/dist/rpc/batchexecute-args.js +0 -35
- package/dist/rpc/batchexecute-args.js.map +0 -1
- package/dist/rpc/boq-reviews.d.ts +0 -16
- package/dist/rpc/boq-reviews.d.ts.map +0 -1
- package/dist/rpc/boq-reviews.js +0 -45
- package/dist/rpc/boq-reviews.js.map +0 -1
- package/dist/rpc/descriptor-registry.d.ts.map +0 -1
- package/dist/rpc/descriptor-registry.js +0 -47
- package/dist/rpc/descriptor-registry.js.map +0 -1
- package/dist/rpc/lists-pb.d.ts +0 -20
- package/dist/rpc/lists-pb.d.ts.map +0 -1
- package/dist/rpc/lists-pb.js +0 -20
- package/dist/rpc/lists-pb.js.map +0 -1
- package/dist/rpc/nxa.d.ts +0 -13
- package/dist/rpc/nxa.d.ts.map +0 -1
- package/dist/rpc/nxa.js +0 -44
- package/dist/rpc/nxa.js.map +0 -1
- package/dist/rpc/passiveassist-pb.d.ts +0 -21
- package/dist/rpc/passiveassist-pb.d.ts.map +0 -1
- package/dist/rpc/passiveassist-pb.js +0 -24
- package/dist/rpc/passiveassist-pb.js.map +0 -1
- package/dist/rpc/photo-category-tokens.d.ts +0 -29
- package/dist/rpc/photo-category-tokens.d.ts.map +0 -1
- package/dist/rpc/photo-category-tokens.js +0 -97
- package/dist/rpc/photo-category-tokens.js.map +0 -1
- package/dist/rpc/reveal-pb.d.ts +0 -26
- package/dist/rpc/reveal-pb.d.ts.map +0 -1
- package/dist/rpc/reveal-pb.js +0 -32
- package/dist/rpc/reveal-pb.js.map +0 -1
- package/dist/rpc/suggest-pb.d.ts +0 -34
- package/dist/rpc/suggest-pb.d.ts.map +0 -1
- package/dist/rpc/suggest-pb.js +0 -42
- package/dist/rpc/suggest-pb.js.map +0 -1
- package/dist/rpc/tiles-pb.d.ts +0 -45
- package/dist/rpc/tiles-pb.d.ts.map +0 -1
- package/dist/rpc/tiles-pb.js +0 -71
- package/dist/rpc/tiles-pb.js.map +0 -1
- package/dist/services/batch-url.d.ts +0 -18
- package/dist/services/batch-url.d.ts.map +0 -1
- package/dist/services/batch-url.js +0 -30
- package/dist/services/batch-url.js.map +0 -1
- package/dist/services/categories.d.ts +0 -21
- package/dist/services/categories.d.ts.map +0 -1
- package/dist/services/categories.js +0 -43
- package/dist/services/categories.js.map +0 -1
- package/dist/services/passiveassist.d.ts +0 -21
- package/dist/services/passiveassist.d.ts.map +0 -1
- package/dist/services/passiveassist.js +0 -70
- package/dist/services/passiveassist.js.map +0 -1
- package/dist/services/reveal.d.ts +0 -15
- package/dist/services/reveal.d.ts.map +0 -1
- package/dist/services/reveal.js +0 -41
- package/dist/services/reveal.js.map +0 -1
- package/dist/services/suggest.d.ts +0 -12
- package/dist/services/suggest.d.ts.map +0 -1
- package/dist/services/suggest.js +0 -36
- package/dist/services/suggest.js.map +0 -1
- package/dist/services/timezone.d.ts +0 -19
- package/dist/services/timezone.d.ts.map +0 -1
- package/dist/services/timezone.js +0 -91
- package/dist/services/timezone.js.map +0 -1
- package/dist/services/ugc-aggregates.d.ts +0 -17
- package/dist/services/ugc-aggregates.d.ts.map +0 -1
- package/dist/services/ugc-aggregates.js +0 -30
- package/dist/services/ugc-aggregates.js.map +0 -1
- package/dist/types/distance-matrix.d.ts +0 -40
- package/dist/types/distance-matrix.d.ts.map +0 -1
- package/dist/types/distance-matrix.js +0 -2
- package/dist/types/distance-matrix.js.map +0 -1
- package/dist/types/elevation.d.ts +0 -59
- package/dist/types/elevation.d.ts.map +0 -1
- package/dist/types/elevation.js +0 -2
- package/dist/types/elevation.js.map +0 -1
- package/dist/types/passiveassist.d.ts +0 -50
- package/dist/types/passiveassist.d.ts.map +0 -1
- package/dist/types/passiveassist.js +0 -2
- package/dist/types/passiveassist.js.map +0 -1
- package/dist/types/reveal.d.ts +0 -46
- package/dist/types/reveal.d.ts.map +0 -1
- package/dist/types/reveal.js +0 -2
- package/dist/types/reveal.js.map +0 -1
- package/dist/types/timezone.d.ts +0 -36
- package/dist/types/timezone.d.ts.map +0 -1
- package/dist/types/timezone.js +0 -2
- package/dist/types/timezone.js.map +0 -1
- package/dist/types/ugc-aggregates.d.ts +0 -14
- package/dist/types/ugc-aggregates.d.ts.map +0 -1
- package/dist/types/ugc-aggregates.js +0 -2
- package/dist/types/ugc-aggregates.js.map +0 -1
- package/dist/utils/abort.d.ts +0 -7
- package/dist/utils/abort.d.ts.map +0 -1
- package/dist/utils/abort.js +0 -43
- package/dist/utils/abort.js.map +0 -1
- package/dist/utils/chunked-decoder.d.ts +0 -9
- package/dist/utils/chunked-decoder.d.ts.map +0 -1
- package/dist/utils/chunked-decoder.js.map +0 -1
- package/dist/utils/coords.d.ts +0 -24
- package/dist/utils/coords.d.ts.map +0 -1
- package/dist/utils/coords.js +0 -37
- package/dist/utils/coords.js.map +0 -1
- package/dist/utils/feature-id.d.ts +0 -2
- package/dist/utils/feature-id.d.ts.map +0 -1
- package/dist/utils/feature-id.js +0 -11
- package/dist/utils/feature-id.js.map +0 -1
- package/dist/utils/load-env.d.ts +0 -7
- package/dist/utils/load-env.d.ts.map +0 -1
- package/dist/utils/load-env.js.map +0 -1
- package/dist/utils/pooled.d.ts +0 -8
- package/dist/utils/pooled.d.ts.map +0 -1
- package/dist/utils/pooled.js +0 -27
- package/dist/utils/pooled.js.map +0 -1
- package/dist/utils/request-context.d.ts +0 -9
- package/dist/utils/request-context.d.ts.map +0 -1
- package/dist/utils/request-context.js +0 -12
- package/dist/utils/request-context.js.map +0 -1
- package/dist/utils/request-scheduler.d.ts +0 -28
- package/dist/utils/request-scheduler.d.ts.map +0 -1
- package/dist/utils/request-scheduler.js +0 -58
- package/dist/utils/request-scheduler.js.map +0 -1
- package/dist/utils/response-parser.d.ts +0 -7
- package/dist/utils/response-parser.d.ts.map +0 -1
- package/dist/utils/response-parser.js +0 -50
- package/dist/utils/response-parser.js.map +0 -1
- package/dist/utils/retry-backoff.d.ts +0 -5
- package/dist/utils/retry-backoff.d.ts.map +0 -1
- package/dist/utils/retry-backoff.js +0 -23
- package/dist/utils/retry-backoff.js.map +0 -1
- package/dist/utils/safe-get.d.ts +0 -6
- package/dist/utils/safe-get.d.ts.map +0 -1
- package/dist/utils/safe-get.js +0 -29
- package/dist/utils/safe-get.js.map +0 -1
- package/dist/utils/throttle-detection.d.ts +0 -17
- package/dist/utils/throttle-detection.d.ts.map +0 -1
- package/dist/utils/throttle-detection.js +0 -71
- package/dist/utils/throttle-detection.js.map +0 -1
- package/dist/utils/ttl-cache.d.ts +0 -17
- package/dist/utils/ttl-cache.d.ts.map +0 -1
- package/dist/utils/ttl-cache.js +0 -43
- package/dist/utils/ttl-cache.js.map +0 -1
- /package/{assets → .github/assets}/banner.png +0 -0
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { SearchService } from './search.js';
|
|
2
|
+
import { PlacesService } from './places.js';
|
|
3
|
+
import { extractEvChargers, extractParkingAvailability, extractParkingPrice, requireBikeAvailability } from '../parsers/mobility.js';
|
|
4
|
+
import { haversineMeters } from '../utils/geo.js';
|
|
5
|
+
import { GMapsError } from '../types/common.js';
|
|
6
|
+
import { pooledMap } from '../utils/async.js';
|
|
7
|
+
/**
|
|
8
|
+
* Mobility POI services: EV charging, parking and bike-share availability.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Maps has no dedicated parking RPC — parking lots are ordinary places, and the
|
|
12
|
+
* web client finds them with a categorical text search. These queries mirror the
|
|
13
|
+
* category chips the Maps UI uses.
|
|
14
|
+
*/
|
|
15
|
+
const TYPE_QUERIES = {
|
|
16
|
+
surface: 'surface parking lot',
|
|
17
|
+
garage: 'parking garage',
|
|
18
|
+
valet: 'valet parking',
|
|
19
|
+
street: 'street parking',
|
|
20
|
+
lot: 'parking lot',
|
|
21
|
+
};
|
|
22
|
+
/** Category label → ParkingType, matched loosely against Google's category strings. */
|
|
23
|
+
function classify(result) {
|
|
24
|
+
const label = `${result.category ?? ''} ${result.categories?.join(' ') ?? ''} ${result.name}`.toLowerCase();
|
|
25
|
+
if (label.includes('valet'))
|
|
26
|
+
return 'valet';
|
|
27
|
+
if (label.includes('garage') || label.includes('multi-storey') || label.includes('multi storey')) {
|
|
28
|
+
return 'garage';
|
|
29
|
+
}
|
|
30
|
+
if (label.includes('street'))
|
|
31
|
+
return 'street';
|
|
32
|
+
if (label.includes('surface'))
|
|
33
|
+
return 'surface';
|
|
34
|
+
return 'lot';
|
|
35
|
+
}
|
|
36
|
+
export class ParkingService {
|
|
37
|
+
search_;
|
|
38
|
+
places;
|
|
39
|
+
constructor(http, config) {
|
|
40
|
+
this.search_ = new SearchService(http, config);
|
|
41
|
+
this.places = new PlacesService(http, config);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Parking near a point, from a categorical place search.
|
|
45
|
+
*
|
|
46
|
+
* `radiusMeters` filters the returned rows client-side — Maps biases search by
|
|
47
|
+
* viewport rather than accepting a hard radius.
|
|
48
|
+
*/
|
|
49
|
+
async search(options) {
|
|
50
|
+
const queries = options.type?.length
|
|
51
|
+
? options.type.map((t) => TYPE_QUERIES[t])
|
|
52
|
+
: ['parking'];
|
|
53
|
+
const batches = await Promise.all(queries.map((query) => this.search_.searchText({
|
|
54
|
+
query,
|
|
55
|
+
location: options.location,
|
|
56
|
+
limit: 20,
|
|
57
|
+
fieldMask: 'enterprise',
|
|
58
|
+
})));
|
|
59
|
+
const seen = new Set();
|
|
60
|
+
const parkings = [];
|
|
61
|
+
for (const batch of batches) {
|
|
62
|
+
for (const row of batch.places) {
|
|
63
|
+
const id = row.hexId ?? row.placeId;
|
|
64
|
+
const lat = row.lat ?? row.latitude;
|
|
65
|
+
const lng = row.lng ?? row.longitude;
|
|
66
|
+
if (!id || lat == null || lng == null || seen.has(id))
|
|
67
|
+
continue;
|
|
68
|
+
seen.add(id);
|
|
69
|
+
const distanceMeters = haversineMeters(options.location.lat, options.location.lng, lat, lng);
|
|
70
|
+
if (options.radiusMeters != null && distanceMeters > options.radiusMeters)
|
|
71
|
+
continue;
|
|
72
|
+
parkings.push({
|
|
73
|
+
id,
|
|
74
|
+
name: row.name,
|
|
75
|
+
type: classify(row),
|
|
76
|
+
lat,
|
|
77
|
+
lng,
|
|
78
|
+
distanceMeters,
|
|
79
|
+
rating: row.rating,
|
|
80
|
+
reviews: row.reviewCount,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (options.sort === 'price') {
|
|
85
|
+
parkings.sort((a, b) => (a.hourlyRate ?? Infinity) - (b.hourlyRate ?? Infinity));
|
|
86
|
+
}
|
|
87
|
+
else if (options.sort === 'availability') {
|
|
88
|
+
parkings.sort((a, b) => (b.availableSpaces ?? -1) - (a.availableSpaces ?? -1));
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
parkings.sort((a, b) => a.distanceMeters - b.distanceMeters);
|
|
92
|
+
}
|
|
93
|
+
return parkings;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Live space counts for one parking place, read from its place preview.
|
|
97
|
+
*
|
|
98
|
+
* Google only publishes occupancy for a small number of operator-integrated
|
|
99
|
+
* garages; throws {@link GMapsError} when the place carries no counts.
|
|
100
|
+
*/
|
|
101
|
+
async getAvailability(parkingId) {
|
|
102
|
+
const { data } = await this.places.fetchPreview({ hexId: parkingId, mode: 'live' });
|
|
103
|
+
const availability = extractParkingAvailability(data, parkingId);
|
|
104
|
+
if (!availability) {
|
|
105
|
+
throw new GMapsError(`No live availability published for parking ${parkingId} — Google exposes space counts only for operator-integrated garages.`);
|
|
106
|
+
}
|
|
107
|
+
return availability;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Posted rates for one parking place, read from its place preview.
|
|
111
|
+
*
|
|
112
|
+
* Throws {@link GMapsError} when the place carries no pricing block.
|
|
113
|
+
*/
|
|
114
|
+
async getPricing(parkingId) {
|
|
115
|
+
const { data } = await this.places.fetchPreview({ hexId: parkingId, mode: 'live' });
|
|
116
|
+
const price = extractParkingPrice(data, parkingId);
|
|
117
|
+
if (!price) {
|
|
118
|
+
throw new GMapsError(`No pricing published for parking ${parkingId}.`);
|
|
119
|
+
}
|
|
120
|
+
return price;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Maps has no dedicated EV RPC. Charging stations are ordinary places found via
|
|
125
|
+
* categorical text search; connector type, power, and plug count come from each
|
|
126
|
+
* station's place preview.
|
|
127
|
+
*/
|
|
128
|
+
const CONNECTOR_QUERIES = {
|
|
129
|
+
supercharger: 'tesla supercharger',
|
|
130
|
+
tesla: 'tesla charging station',
|
|
131
|
+
ccs: 'ccs ev charging station',
|
|
132
|
+
chademo: 'chademo ev charging station',
|
|
133
|
+
type2: 'type 2 ev charging station',
|
|
134
|
+
ac: 'ac ev charging station',
|
|
135
|
+
};
|
|
136
|
+
const ENRICH_CONCURRENCY = 5;
|
|
137
|
+
export class EvChargingService {
|
|
138
|
+
search_;
|
|
139
|
+
places;
|
|
140
|
+
constructor(http, config) {
|
|
141
|
+
this.search_ = new SearchService(http, config);
|
|
142
|
+
this.places = new PlacesService(http, config);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Charging stations near a point, with their advertised connectors.
|
|
146
|
+
*
|
|
147
|
+
* Runs one place search, then a bounded set of place-preview calls to read the
|
|
148
|
+
* connector block for each hit. `radiusMeters` filters client-side — Maps
|
|
149
|
+
* biases search by viewport rather than accepting a hard radius.
|
|
150
|
+
*/
|
|
151
|
+
async findCharging(options) {
|
|
152
|
+
const queries = options.connectorTypes?.length
|
|
153
|
+
? options.connectorTypes.map((t) => CONNECTOR_QUERIES[t])
|
|
154
|
+
: ['ev charging station'];
|
|
155
|
+
const batches = await Promise.all(queries.map((query) => this.search_.searchText({
|
|
156
|
+
query,
|
|
157
|
+
location: options.location,
|
|
158
|
+
limit: 20,
|
|
159
|
+
fieldMask: 'enterprise',
|
|
160
|
+
})));
|
|
161
|
+
const seen = new Set();
|
|
162
|
+
const candidates = [];
|
|
163
|
+
for (const batch of batches) {
|
|
164
|
+
for (const row of batch.places) {
|
|
165
|
+
const id = row.hexId ?? row.placeId;
|
|
166
|
+
const lat = row.lat ?? row.latitude;
|
|
167
|
+
const lng = row.lng ?? row.longitude;
|
|
168
|
+
if (!id || lat == null || lng == null || seen.has(id))
|
|
169
|
+
continue;
|
|
170
|
+
seen.add(id);
|
|
171
|
+
const distanceMeters = haversineMeters(options.location.lat, options.location.lng, lat, lng);
|
|
172
|
+
if (options.radiusMeters != null && distanceMeters > options.radiusMeters)
|
|
173
|
+
continue;
|
|
174
|
+
candidates.push({
|
|
175
|
+
id,
|
|
176
|
+
name: row.name,
|
|
177
|
+
operator: row.name,
|
|
178
|
+
lat,
|
|
179
|
+
lng,
|
|
180
|
+
distanceMeters,
|
|
181
|
+
chargers: [],
|
|
182
|
+
address: row.address,
|
|
183
|
+
phone: row.internationalPhone ?? row.phone,
|
|
184
|
+
website: row.website,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
const enriched = await pooledMap(candidates, ENRICH_CONCURRENCY, async (station) => {
|
|
189
|
+
try {
|
|
190
|
+
const preview = await this.places.fetchPreview({
|
|
191
|
+
hexId: station.id,
|
|
192
|
+
name: station.name,
|
|
193
|
+
lat: station.lat,
|
|
194
|
+
lng: station.lng,
|
|
195
|
+
mode: 'live',
|
|
196
|
+
});
|
|
197
|
+
let chargers = extractEvChargers(preview.data, station.id);
|
|
198
|
+
if (chargers.length === 0) {
|
|
199
|
+
const rich = await this.places.fetchPreview({
|
|
200
|
+
hexId: station.id,
|
|
201
|
+
name: station.name,
|
|
202
|
+
lat: station.lat,
|
|
203
|
+
lng: station.lng,
|
|
204
|
+
mode: 'rich',
|
|
205
|
+
});
|
|
206
|
+
chargers = extractEvChargers(rich.data, station.id);
|
|
207
|
+
}
|
|
208
|
+
return { ...station, chargers };
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// A preview failure costs connector detail, not the station itself.
|
|
212
|
+
return station;
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
const filtered = options.minPower == null
|
|
216
|
+
? enriched
|
|
217
|
+
: enriched.filter((s) => s.chargers.some((c) => (c.power ?? 0) >= options.minPower));
|
|
218
|
+
if (options.sort === 'availability') {
|
|
219
|
+
filtered.sort((a, b) => totalPlugs(b) - totalPlugs(a));
|
|
220
|
+
}
|
|
221
|
+
else if (options.sort === 'price') {
|
|
222
|
+
// No pricing is published on any Maps surface — fall back to distance.
|
|
223
|
+
filtered.sort((a, b) => a.distanceMeters - b.distanceMeters);
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
filtered.sort((a, b) => a.distanceMeters - b.distanceMeters);
|
|
227
|
+
}
|
|
228
|
+
return filtered;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Not available.
|
|
232
|
+
*
|
|
233
|
+
* Google publishes a per-plug status code in the place preview but documents
|
|
234
|
+
* no mapping to a charging state, and exposes no availability RPC. Use
|
|
235
|
+
* {@link findCharging} for connector type, power, and plug count.
|
|
236
|
+
*
|
|
237
|
+
* @throws {GMapsError} always
|
|
238
|
+
*/
|
|
239
|
+
async getStatus(chargerId) {
|
|
240
|
+
throw new GMapsError(`Live charger availability is not exposed by any public Maps surface (charger ${chargerId}). ` +
|
|
241
|
+
'findCharging() returns connector type, power, and plug count.');
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Not available.
|
|
245
|
+
*
|
|
246
|
+
* Charging tariffs are not carried in Maps place data or any batchexecute
|
|
247
|
+
* service the web client calls.
|
|
248
|
+
*
|
|
249
|
+
* @throws {GMapsError} always
|
|
250
|
+
*/
|
|
251
|
+
async getPricing(stationId) {
|
|
252
|
+
throw new GMapsError(`Charging pricing is not exposed by any public Maps surface (station ${stationId}).`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function totalPlugs(station) {
|
|
256
|
+
return station.chargers.reduce((sum, c) => sum + (c.totalCount ?? 0), 0);
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Bike-share dock availability.
|
|
260
|
+
*
|
|
261
|
+
* Reads the live operator-feed block from the station's place preview
|
|
262
|
+
* (placeData[133][0], verified anonymously across preview modes and
|
|
263
|
+
* operators such as Citi Bike NYC and Santander Cycles London).
|
|
264
|
+
*/
|
|
265
|
+
export class BikeShareService {
|
|
266
|
+
places;
|
|
267
|
+
constructor(http, config = {}) {
|
|
268
|
+
this.places = new PlacesService(http, config);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Live dock availability for one bike-share station.
|
|
272
|
+
* Accepts a hexId (from search hits or `parseMapsUrl`) or name/coords/ftid hints.
|
|
273
|
+
*/
|
|
274
|
+
async getAvailability(options) {
|
|
275
|
+
if (!options.hexId) {
|
|
276
|
+
throw new GMapsError('getAvailability requires a station hexId — resolve the station first via search or parseMapsUrl.');
|
|
277
|
+
}
|
|
278
|
+
const preview = await this.places.fetchPreview({
|
|
279
|
+
hexId: options.hexId,
|
|
280
|
+
name: options.name,
|
|
281
|
+
lat: options.lat,
|
|
282
|
+
lng: options.lng,
|
|
283
|
+
ftid: options.ftid,
|
|
284
|
+
mode: options.mode ?? 'live',
|
|
285
|
+
});
|
|
286
|
+
return requireBikeAvailability(preview.data);
|
|
287
|
+
}
|
|
288
|
+
/** Availability for several stations in parallel (bounded). */
|
|
289
|
+
async getAvailabilityMany(stations, concurrency = 5) {
|
|
290
|
+
const results = new Array(stations.length).fill(null);
|
|
291
|
+
let cursor = 0;
|
|
292
|
+
const runners = Array.from({ length: Math.min(concurrency, stations.length) }, async () => {
|
|
293
|
+
while (cursor < stations.length) {
|
|
294
|
+
const index = cursor++;
|
|
295
|
+
try {
|
|
296
|
+
results[index] = await this.getAvailability(stations[index]);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
results[index] = null;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
await Promise.all(runners);
|
|
304
|
+
return results;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=mobility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mobility.js","sourceRoot":"","sources":["../../src/services/mobility.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { GMapsConfig, LocationRef, SearchResult } from '../types/common.js';
|
|
2
|
+
import { HttpClient } from '../client/http-client.js';
|
|
3
|
+
export interface NearbySearchOptions {
|
|
4
|
+
/** Places API (New) includedTypes — at least one required. */
|
|
5
|
+
includedTypes: string[];
|
|
6
|
+
location: LocationRef;
|
|
7
|
+
/** Search radius in metres (client-side filter after search). */
|
|
8
|
+
radiusMeters?: number;
|
|
9
|
+
maxResultCount?: number;
|
|
10
|
+
hl?: string;
|
|
11
|
+
gl?: string;
|
|
12
|
+
rankPreference?: 'DISTANCE' | 'POPULARITY';
|
|
13
|
+
}
|
|
14
|
+
export interface NearbySearchResult {
|
|
15
|
+
places: SearchResult[];
|
|
16
|
+
/** Mirrors Places API (New) — offset token when more pages exist. */
|
|
17
|
+
nextPageToken?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class NearbySearchService {
|
|
20
|
+
private search;
|
|
21
|
+
private hl;
|
|
22
|
+
private gl;
|
|
23
|
+
constructor(http: HttpClient, config: GMapsConfig);
|
|
24
|
+
/**
|
|
25
|
+
* Nearby Search — categorical place search biased to a point.
|
|
26
|
+
*
|
|
27
|
+
* Consumer Maps has no type-only RPC; this mirrors the UI by running one
|
|
28
|
+
* text search per included type and merging/deduping by place id.
|
|
29
|
+
*/
|
|
30
|
+
searchNearby(options: NearbySearchOptions): Promise<NearbySearchResult>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=nearby-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nearby-search.d.ts","sourceRoot":"","sources":["../../src/services/nearby-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAgCtD,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,EAAE,WAAW,CAAC;IACtB,iEAAiE;IACjE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;gBAEP,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;IAMjD;;;;;OAKG;IACG,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAsD9E"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { SearchService } from './search.js';
|
|
2
|
+
import { haversineMeters } from '../utils/geo.js';
|
|
3
|
+
/** Maps includedTypes values to categorical search queries the consumer uses. */
|
|
4
|
+
const TYPE_QUERY_MAP = {
|
|
5
|
+
restaurant: 'restaurant',
|
|
6
|
+
cafe: 'cafe',
|
|
7
|
+
bar: 'bar',
|
|
8
|
+
bakery: 'bakery',
|
|
9
|
+
hotel: 'hotel',
|
|
10
|
+
gas_station: 'gas station',
|
|
11
|
+
parking: 'parking',
|
|
12
|
+
hospital: 'hospital',
|
|
13
|
+
pharmacy: 'pharmacy',
|
|
14
|
+
school: 'school',
|
|
15
|
+
university: 'university',
|
|
16
|
+
bank: 'bank',
|
|
17
|
+
atm: 'atm',
|
|
18
|
+
supermarket: 'supermarket',
|
|
19
|
+
grocery_store: 'grocery store',
|
|
20
|
+
shopping_mall: 'shopping mall',
|
|
21
|
+
ev_charging_station: 'EV charging station',
|
|
22
|
+
train_station: 'train station',
|
|
23
|
+
bus_station: 'bus station',
|
|
24
|
+
airport: 'airport',
|
|
25
|
+
museum: 'museum',
|
|
26
|
+
park: 'park',
|
|
27
|
+
gym: 'gym',
|
|
28
|
+
dentist: 'dentist',
|
|
29
|
+
doctor: 'doctor',
|
|
30
|
+
};
|
|
31
|
+
export class NearbySearchService {
|
|
32
|
+
search;
|
|
33
|
+
hl;
|
|
34
|
+
gl;
|
|
35
|
+
constructor(http, config) {
|
|
36
|
+
this.search = new SearchService(http, config);
|
|
37
|
+
this.hl = config.hl ?? 'en';
|
|
38
|
+
this.gl = config.gl ?? 'us';
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Nearby Search — categorical place search biased to a point.
|
|
42
|
+
*
|
|
43
|
+
* Consumer Maps has no type-only RPC; this mirrors the UI by running one
|
|
44
|
+
* text search per included type and merging/deduping by place id.
|
|
45
|
+
*/
|
|
46
|
+
async searchNearby(options) {
|
|
47
|
+
if (options.includedTypes.length === 0) {
|
|
48
|
+
return { places: [] };
|
|
49
|
+
}
|
|
50
|
+
const origin = await this.search.resolveBias(options.location);
|
|
51
|
+
const radius = options.radiusMeters ?? 5_000;
|
|
52
|
+
const limit = options.maxResultCount ?? 20;
|
|
53
|
+
const queries = options.includedTypes.map((type) => TYPE_QUERY_MAP[type] ?? type.replace(/_/g, ' '));
|
|
54
|
+
const batches = await Promise.all(queries.map((query) => this.search.searchText({
|
|
55
|
+
query,
|
|
56
|
+
location: origin,
|
|
57
|
+
limit,
|
|
58
|
+
fieldMask: 'enterprise',
|
|
59
|
+
})));
|
|
60
|
+
const seen = new Set();
|
|
61
|
+
const scored = [];
|
|
62
|
+
for (const batch of batches) {
|
|
63
|
+
for (const row of batch.places) {
|
|
64
|
+
const id = row.hexId ?? row.placeId;
|
|
65
|
+
const lat = row.lat ?? row.latitude;
|
|
66
|
+
const lng = row.lng ?? row.longitude;
|
|
67
|
+
if (!id || lat == null || lng == null || seen.has(id))
|
|
68
|
+
continue;
|
|
69
|
+
const distance = haversineMeters(origin.lat, origin.lng, lat, lng);
|
|
70
|
+
if (distance > radius)
|
|
71
|
+
continue;
|
|
72
|
+
seen.add(id);
|
|
73
|
+
scored.push({ place: row, distance });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (options.rankPreference === 'POPULARITY') {
|
|
77
|
+
scored.sort((a, b) => (b.place.reviewCount ?? 0) - (a.place.reviewCount ?? 0));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
scored.sort((a, b) => a.distance - b.distance);
|
|
81
|
+
}
|
|
82
|
+
return { places: scored.slice(0, limit).map((entry) => entry.place) };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=nearby-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nearby-search.js","sourceRoot":"","sources":["../../src/services/nearby-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { HttpClient } from '../client/http-client.js';
|
|
2
2
|
import type { GMapsConfig } from '../types/common.js';
|
|
3
|
-
import type { PanoramaGetOptions, PanoramaImageOptions, PanoramaLocationOptions, PanoramaMetadata, PanoramaRef, PanoramaSearchOptions } from '../types/panorama.js';
|
|
3
|
+
import type { PanoramaGetOptions, PanoramaImageOptions, PanoramaLocationOptions, PanoramaMetadata, PanoramaRef, PanoramaSearchOptions, PanoramaStaticImageLocationOptions, PanoramaStaticImageOptions, PanoramaStaticImageResult, PanoramaTileGrid } from '../types/panorama.js';
|
|
4
4
|
export declare class PanoramaService {
|
|
5
5
|
private http;
|
|
6
6
|
private hl;
|
|
@@ -29,11 +29,29 @@ export declare class PanoramaService {
|
|
|
29
29
|
private rankByDistance;
|
|
30
30
|
/** Fetch full metadata for a panorama id; null when Google returns the stub response. */
|
|
31
31
|
get(panoId: string, options?: PanoramaGetOptions): Promise<PanoramaMetadata | null>;
|
|
32
|
+
private getPhotometaAsBytes;
|
|
32
33
|
/** Resolve the closest panorama near a point, then fetch its full metadata. */
|
|
33
34
|
getByLocation(lat: number, lng: number, options?: PanoramaLocationOptions): Promise<PanoramaMetadata | null>;
|
|
35
|
+
/**
|
|
36
|
+
* Build the full equirectangular tile manifest for a panorama.
|
|
37
|
+
*
|
|
38
|
+
* Street View has no video stream — the web client renders by fetching these
|
|
39
|
+
* tiles, so this grid is the complete imagery contract. Geometry comes from
|
|
40
|
+
* photometa (`tileSizes` count, `maxTileDimensions`, `tileFaceSize`); pass
|
|
41
|
+
* previously fetched metadata to avoid a second request. Without it the
|
|
42
|
+
* observed default pyramid (4 levels, 8192×4096 top, 512px faces) is used.
|
|
43
|
+
*/
|
|
44
|
+
getTileGrid(panoId: string, metadata?: PanoramaMetadata | null): Promise<PanoramaTileGrid>;
|
|
34
45
|
/** Build a Street View thumbnail URL (no network I/O). */
|
|
35
46
|
buildThumbnailUrl(options: PanoramaImageOptions): string;
|
|
36
47
|
/** Build a Street View tile URL (no network I/O). */
|
|
37
48
|
buildTileUrl(options: PanoramaImageOptions): string;
|
|
49
|
+
/**
|
|
50
|
+
* Fetch a static Street View JPEG (Maps Platform "Static Street View").
|
|
51
|
+
* Uses streetviewpixels /thumbnail — not /maps/api/streetview.
|
|
52
|
+
*/
|
|
53
|
+
fetchStaticImage(options: PanoramaStaticImageOptions): Promise<PanoramaStaticImageResult>;
|
|
54
|
+
/** Resolve the nearest panorama, then fetch its static thumbnail JPEG. */
|
|
55
|
+
fetchStaticImageByLocation(lat: number, lng: number, options?: PanoramaStaticImageLocationOptions): Promise<PanoramaStaticImageResult | null>;
|
|
38
56
|
}
|
|
39
57
|
//# sourceMappingURL=panorama.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"panorama.d.ts","sourceRoot":"","sources":["../../src/services/panorama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAatD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,WAAW,EACX,qBAAqB,
|
|
1
|
+
{"version":3,"file":"panorama.d.ts","sourceRoot":"","sources":["../../src/services/panorama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAatD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,kCAAkC,EAClC,0BAA0B,EAC1B,yBAAyB,EACzB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAyB9B,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;gBAEP,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;IAMjD;;;;;;;OAOG;IACG,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAWxE,sFAAsF;YACxE,eAAe;IAgD7B,iEAAiE;YACnD,mBAAmB;IAgCjC;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAoBtB,yFAAyF;IACnF,GAAG,CACP,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAqBrB,mBAAmB;IASjC,+EAA+E;IACzE,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAuBnC;;;;;;;;OAQG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2ChG,0DAA0D;IAC1D,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM;IAUxD,qDAAqD;IACrD,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM;IASnD;;;OAGG;IACG,gBAAgB,CACpB,OAAO,EAAE,0BAA0B,GAClC,OAAO,CAAC,yBAAyB,CAAC;IA2BrC,0EAA0E;IACpE,0BAA0B,CAC9B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,kCAAkC,GAC3C,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC;CAmB7C"}
|
|
@@ -2,9 +2,15 @@ import { extractCoveragePanoramas, extractNearbyPanoramas, extractPanoramaMetada
|
|
|
2
2
|
import { buildCoverageTileUrl, buildListEntityPhotosUrl, buildPhotometaUrl, buildThumbnailUrl, buildTileUrl, } from '../rpc/panorama-pb.js';
|
|
3
3
|
import { GMapsNetworkError, GMapsPhotosBlockedError } from '../types/common.js';
|
|
4
4
|
import { haversineMeters, webMercatorTile } from '../utils/geo.js';
|
|
5
|
+
import { parseGoogleResponse } from '../utils/payload.js';
|
|
5
6
|
const DEFAULT_RADIUS_METERS = 300;
|
|
6
7
|
/** Coverage tiles only answer at zoom 17 — zoom 18 returns HTTP 400. */
|
|
7
8
|
const COVERAGE_ZOOM = 17;
|
|
9
|
+
/** Observed default equirectangular pyramid when photometa omits tile geometry. */
|
|
10
|
+
const DEFAULT_PANO_LEVELS = 4;
|
|
11
|
+
const DEFAULT_PANO_MAX_WIDTH = 8192;
|
|
12
|
+
const DEFAULT_PANO_MAX_HEIGHT = 4096;
|
|
13
|
+
const DEFAULT_PANO_FACE = 512;
|
|
8
14
|
/** A z17 tile spans roughly this far, so wider searches need the neighbouring tiles. */
|
|
9
15
|
const COVERAGE_TILE_SPAN_METERS = 305;
|
|
10
16
|
/** Street View pano ids from listentityphotos — excludes session tokens and numeric photo ids. */
|
|
@@ -122,13 +128,27 @@ export class PanoramaService {
|
|
|
122
128
|
async get(panoId, options) {
|
|
123
129
|
const hl = options?.hl ?? this.hl;
|
|
124
130
|
const gl = options?.gl ?? this.gl;
|
|
125
|
-
const
|
|
126
|
-
const
|
|
131
|
+
const includeDepth = options?.includeDepth ?? false;
|
|
132
|
+
const url = buildPhotometaUrl({ panoId, hl, gl, includeDepth });
|
|
133
|
+
// The depth raster rides inside the JSON as raw bytes, so that response has
|
|
134
|
+
// to be read as latin1; decoding it as UTF-8 replaces every byte above 0x7f
|
|
135
|
+
// and leaves an unreadable WebP.
|
|
136
|
+
const data = includeDepth
|
|
137
|
+
? await this.getPhotometaAsBytes(url)
|
|
138
|
+
: await this.http.get(url, {
|
|
139
|
+
referer: 'https://www.google.com/maps/',
|
|
140
|
+
includeOrigin: true,
|
|
141
|
+
allowShortBody: true,
|
|
142
|
+
});
|
|
143
|
+
return extractPanoramaMetadata(data, { raw: options?.raw });
|
|
144
|
+
}
|
|
145
|
+
async getPhotometaAsBytes(url) {
|
|
146
|
+
const { bytes } = await this.http.getBytes(url, {
|
|
127
147
|
referer: 'https://www.google.com/maps/',
|
|
128
148
|
includeOrigin: true,
|
|
129
149
|
allowShortBody: true,
|
|
130
150
|
});
|
|
131
|
-
return
|
|
151
|
+
return parseGoogleResponse(Buffer.from(bytes).toString('latin1'));
|
|
132
152
|
}
|
|
133
153
|
/** Resolve the closest panorama near a point, then fetch its full metadata. */
|
|
134
154
|
async getByLocation(lat, lng, options) {
|
|
@@ -152,6 +172,46 @@ export class PanoramaService {
|
|
|
152
172
|
}
|
|
153
173
|
return null;
|
|
154
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Build the full equirectangular tile manifest for a panorama.
|
|
177
|
+
*
|
|
178
|
+
* Street View has no video stream — the web client renders by fetching these
|
|
179
|
+
* tiles, so this grid is the complete imagery contract. Geometry comes from
|
|
180
|
+
* photometa (`tileSizes` count, `maxTileDimensions`, `tileFaceSize`); pass
|
|
181
|
+
* previously fetched metadata to avoid a second request. Without it the
|
|
182
|
+
* observed default pyramid (4 levels, 8192×4096 top, 512px faces) is used.
|
|
183
|
+
*/
|
|
184
|
+
async getTileGrid(panoId, metadata) {
|
|
185
|
+
const levelCount = metadata?.tileSizes?.length ?? DEFAULT_PANO_LEVELS;
|
|
186
|
+
const [maxWidth, maxHeight] = metadata?.maxTileDimensions ?? [
|
|
187
|
+
DEFAULT_PANO_MAX_WIDTH,
|
|
188
|
+
DEFAULT_PANO_MAX_HEIGHT,
|
|
189
|
+
];
|
|
190
|
+
const [faceWidth, faceHeight] = metadata?.tileFaceSize ?? [
|
|
191
|
+
DEFAULT_PANO_FACE,
|
|
192
|
+
DEFAULT_PANO_FACE,
|
|
193
|
+
];
|
|
194
|
+
const levels = [];
|
|
195
|
+
const urls = [];
|
|
196
|
+
for (let zoom = 0; zoom < levelCount; zoom++) {
|
|
197
|
+
const divisor = 2 ** (levelCount - 1 - zoom);
|
|
198
|
+
const width = Math.min(maxWidth, Math.max(faceWidth, Math.ceil(maxWidth / divisor)));
|
|
199
|
+
const height = Math.min(maxHeight, Math.max(faceHeight, Math.ceil(maxHeight / divisor)));
|
|
200
|
+
const cols = Math.max(1, Math.ceil(width / faceWidth));
|
|
201
|
+
const rows = Math.max(1, Math.ceil(height / faceHeight));
|
|
202
|
+
levels.push({ zoom, cols, rows, width, height });
|
|
203
|
+
const gridRows = [];
|
|
204
|
+
for (let y = 0; y < rows; y++) {
|
|
205
|
+
const row = [];
|
|
206
|
+
for (let x = 0; x < cols; x++) {
|
|
207
|
+
row.push(buildTileUrl({ panoId, x, y, zoom }));
|
|
208
|
+
}
|
|
209
|
+
gridRows.push(row);
|
|
210
|
+
}
|
|
211
|
+
urls.push(gridRows);
|
|
212
|
+
}
|
|
213
|
+
return { panoId, levels, urls };
|
|
214
|
+
}
|
|
155
215
|
/** Build a Street View thumbnail URL (no network I/O). */
|
|
156
216
|
buildThumbnailUrl(options) {
|
|
157
217
|
return buildThumbnailUrl({
|
|
@@ -171,5 +231,53 @@ export class PanoramaService {
|
|
|
171
231
|
zoom: options.zoom,
|
|
172
232
|
});
|
|
173
233
|
}
|
|
234
|
+
/**
|
|
235
|
+
* Fetch a static Street View JPEG (Maps Platform "Static Street View").
|
|
236
|
+
* Uses streetviewpixels /thumbnail — not /maps/api/streetview.
|
|
237
|
+
*/
|
|
238
|
+
async fetchStaticImage(options) {
|
|
239
|
+
const width = options.width ?? 640;
|
|
240
|
+
const height = options.height ?? 480;
|
|
241
|
+
const url = buildThumbnailUrl({
|
|
242
|
+
panoId: options.panoId,
|
|
243
|
+
width,
|
|
244
|
+
height,
|
|
245
|
+
pitch: options.pitch,
|
|
246
|
+
yaw: options.yaw,
|
|
247
|
+
});
|
|
248
|
+
const { bytes, contentType } = await this.http.getBytes(url, {
|
|
249
|
+
referer: 'https://www.google.com/maps/',
|
|
250
|
+
includeOrigin: true,
|
|
251
|
+
minBytes: 100,
|
|
252
|
+
});
|
|
253
|
+
return {
|
|
254
|
+
bytes,
|
|
255
|
+
contentType,
|
|
256
|
+
width,
|
|
257
|
+
height,
|
|
258
|
+
panoId: options.panoId,
|
|
259
|
+
url,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/** Resolve the nearest panorama, then fetch its static thumbnail JPEG. */
|
|
263
|
+
async fetchStaticImageByLocation(lat, lng, options) {
|
|
264
|
+
const nearby = await this.findNearby({
|
|
265
|
+
lat,
|
|
266
|
+
lng,
|
|
267
|
+
radiusMeters: options?.radiusMeters,
|
|
268
|
+
hl: options?.hl,
|
|
269
|
+
gl: options?.gl,
|
|
270
|
+
});
|
|
271
|
+
const ref = nearby.find((entry) => isLikelyStreetViewPanoId(entry.panoId));
|
|
272
|
+
if (!ref)
|
|
273
|
+
return null;
|
|
274
|
+
return this.fetchStaticImage({
|
|
275
|
+
panoId: ref.panoId,
|
|
276
|
+
width: options?.width,
|
|
277
|
+
height: options?.height,
|
|
278
|
+
pitch: options?.pitch ?? ref.pitch,
|
|
279
|
+
yaw: options?.yaw ?? ref.heading,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
174
282
|
}
|
|
175
283
|
//# sourceMappingURL=panorama.js.map
|