googlemaps-kit 0.3.1 → 0.5.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 +231 -26
- 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 +46 -9
- 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 +21 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +97 -0
- package/dist/cli/args.js.map +1 -0
- 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 +131 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +384 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/tui/app.d.ts +48 -0
- package/dist/cli/tui/app.d.ts.map +1 -0
- package/dist/cli/tui/app.js +461 -0
- package/dist/cli/tui/app.js.map +1 -0
- package/dist/cli/tui/styles.d.ts +11 -0
- package/dist/cli/tui/styles.d.ts.map +1 -0
- package/dist/cli/tui/styles.js +17 -0
- package/dist/cli/tui/styles.js.map +1 -0
- package/dist/cli.d.ts +1 -10
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +196 -206
- package/dist/cli.js.map +1 -1
- package/dist/client/gmaps-client.d.ts +8 -3
- package/dist/client/gmaps-client.d.ts.map +1 -1
- package/dist/client/gmaps-client.js +43 -5
- 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 +1 -1
- package/dist/client/intent.d.ts.map +1 -1
- package/dist/client/intent.js +22 -5
- package/dist/client/intent.js.map +1 -1
- package/dist/client/maps-tools.d.ts +13 -1
- package/dist/client/maps-tools.d.ts.map +1 -1
- package/dist/client/maps-tools.js +44 -0
- package/dist/client/maps-tools.js.map +1 -1
- package/dist/client/namespaces.d.ts +84 -10
- package/dist/client/namespaces.d.ts.map +1 -1
- package/dist/client/namespaces.js +119 -11
- 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/index.d.ts +46 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/known-surfaces.d.ts +134 -2
- package/dist/known-surfaces.d.ts.map +1 -1
- package/dist/known-surfaces.js +134 -2
- 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 +110 -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 +17 -2
- package/dist/parsers/reviews.d.ts.map +1 -1
- package/dist/parsers/reviews.js +73 -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/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/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 +1 -1
- package/dist/services/elevation.d.ts.map +1 -1
- package/dist/services/elevation.js +3 -2
- package/dist/services/elevation.js.map +1 -1
- package/dist/services/geocode.d.ts +16 -0
- package/dist/services/geocode.d.ts.map +1 -1
- package/dist/services/geocode.js +90 -0
- package/dist/services/geocode.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 +296 -0
- package/dist/services/mobility.js.map +1 -0
- package/dist/services/panorama.d.ts +12 -1
- package/dist/services/panorama.d.ts.map +1 -1
- package/dist/services/panorama.js +63 -3
- package/dist/services/panorama.js.map +1 -1
- package/dist/services/photos.d.ts.map +1 -1
- package/dist/services/photos.js +3 -4
- 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 +6 -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 +23 -1
- package/dist/services/search.d.ts.map +1 -1
- package/dist/services/search.js +147 -3
- 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/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 +162 -22
- 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 +48 -3
- 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 +104 -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 -0
- 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 +25 -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 +27 -0
- package/dist/utils/place-ref.d.ts.map +1 -1
- package/dist/utils/place-ref.js +45 -1
- package/dist/utils/place-ref.js.map +1 -1
- package/package.json +16 -7
- 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,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Earth "rocktree" protocol — the photorealistic 3D octree behind
|
|
3
|
+
* `kh.google.com/rt/earth`.
|
|
4
|
+
*
|
|
5
|
+
* Reverse-engineered from the Maps web client. The renderer never parses the
|
|
6
|
+
* octree on the main thread: Maps ships a Web Worker as an escaped string
|
|
7
|
+
* literal inside its `f0N97d`/mapcore modules, and that worker holds the
|
|
8
|
+
* BulkMetadata reader (`obbCenters` / `obbExtents` / `obbRotations`) this file
|
|
9
|
+
* reimplements. Three endpoints, all anonymous, all `application/x-protobuffer`:
|
|
10
|
+
*
|
|
11
|
+
* GET /rt/{planet}/PlanetoidMetadata
|
|
12
|
+
* GET /rt/{planet}/BulkMetadata/pb=!1m2!1s{path}!2u{epoch}
|
|
13
|
+
* GET /rt/{planet}/NodeData/pb=!1m2!1s{path}!2u{epoch}!2e{texture}!3u{imagery}!4b0
|
|
14
|
+
*
|
|
15
|
+
* Nodes are addressed by an octant path (digits 0-7, one per level). A bulk
|
|
16
|
+
* covers four levels below its head node, so bulk paths are always a multiple
|
|
17
|
+
* of four digits long.
|
|
18
|
+
*/
|
|
19
|
+
/** Mean planet radius the Earth rocktree is quantised against. */
|
|
20
|
+
export declare const EARTH_RADIUS_METERS = 6371010;
|
|
21
|
+
/**
|
|
22
|
+
* Planets Google serves through the rocktree octree.
|
|
23
|
+
*
|
|
24
|
+
* `mars` and `moon` answer live with their own epochs, radii and octrees —
|
|
25
|
+
* the same three-endpoint protocol as earth. Any other planet name gets a
|
|
26
|
+
* clean HTTP 400 INVALID_ARGUMENT from the server.
|
|
27
|
+
*/
|
|
28
|
+
export type RocktreePlanet = 'earth' | 'mars' | 'moon';
|
|
29
|
+
export declare const ROCKTREE_PLANETS: readonly RocktreePlanet[];
|
|
30
|
+
/** Per-planet rocktree host segment. Throws on unsupported planet names. */
|
|
31
|
+
export declare function rocktreeBase(planet?: RocktreePlanet): string;
|
|
32
|
+
/** Node flag bits decoded out of `path_and_flags`. */
|
|
33
|
+
export declare const NODE_FLAGS: {
|
|
34
|
+
/** Node publishes no NodeData — metadata only. */
|
|
35
|
+
readonly NO_DATA: 8;
|
|
36
|
+
/** NodeData must carry `!3u{imageryEpoch}` or the server answers 404. */
|
|
37
|
+
readonly USE_IMAGERY_EPOCH: 16;
|
|
38
|
+
};
|
|
39
|
+
export type PbField = [number, number | Uint8Array];
|
|
40
|
+
/** Split one protobuf message into `[fieldNumber, value]` pairs (no schema). */
|
|
41
|
+
export declare function readFields(bytes: Uint8Array): PbField[];
|
|
42
|
+
export type Vec3 = [number, number, number];
|
|
43
|
+
/** Geodetic (spherical) lat/lng/alt to planet-centred metres. */
|
|
44
|
+
export declare function latLngToEcef(lat: number, lng: number, alt?: number, radius?: number): Vec3;
|
|
45
|
+
/** Planet-centred metres back to lat/lng plus height above the reference sphere. */
|
|
46
|
+
export declare function ecefToLatLng(p: Vec3, radius?: number): {
|
|
47
|
+
lat: number;
|
|
48
|
+
lng: number;
|
|
49
|
+
alt: number;
|
|
50
|
+
};
|
|
51
|
+
export interface PlanetoidMetadata {
|
|
52
|
+
/** Epoch to seed the root BulkMetadata request with. */
|
|
53
|
+
rootEpoch: number;
|
|
54
|
+
radius: number;
|
|
55
|
+
}
|
|
56
|
+
export declare function parsePlanetoidMetadata(bytes: Uint8Array, planet?: RocktreePlanet): PlanetoidMetadata;
|
|
57
|
+
export declare function planetoidMetadataUrl(base?: string): string;
|
|
58
|
+
export interface RocktreeNode {
|
|
59
|
+
/** Octant path relative to the bulk head node (1-4 digits). */
|
|
60
|
+
path: string;
|
|
61
|
+
/** Depth below the bulk head node (1-4). */
|
|
62
|
+
level: number;
|
|
63
|
+
flags: number;
|
|
64
|
+
/** Epoch for this node's NodeData request. */
|
|
65
|
+
epoch: number;
|
|
66
|
+
/** Epoch for the child BulkMetadata request rooted at this node. */
|
|
67
|
+
bulkMetadataEpoch: number;
|
|
68
|
+
imageryEpoch: number;
|
|
69
|
+
textureFormat: number;
|
|
70
|
+
/** Ground sampling distance of this node's texture, in metres. */
|
|
71
|
+
metersPerTexel: number;
|
|
72
|
+
/** Oriented bounding box centre, earth-centred metres. */
|
|
73
|
+
center: Vec3 | null;
|
|
74
|
+
/** Oriented bounding box half-extents along its own axes, metres. */
|
|
75
|
+
extents: Vec3 | null;
|
|
76
|
+
/** Row-major 3x3; column i is OBB axis i. */
|
|
77
|
+
rotation: number[] | null;
|
|
78
|
+
/** True when the node publishes no mesh. */
|
|
79
|
+
hasData: boolean;
|
|
80
|
+
}
|
|
81
|
+
export interface BulkMetadata {
|
|
82
|
+
headPath: string;
|
|
83
|
+
headEpoch: number;
|
|
84
|
+
nodes: RocktreeNode[];
|
|
85
|
+
}
|
|
86
|
+
export declare function bulkMetadataUrl(path: string, epoch: number, base?: string): string;
|
|
87
|
+
/**
|
|
88
|
+
* Decode a BulkMetadata payload.
|
|
89
|
+
*
|
|
90
|
+
* Field layout (from the Maps octree worker):
|
|
91
|
+
* 1 repeated NodeMetadata 3 head node centre (3 doubles)
|
|
92
|
+
* 2 head node key 4 metres-per-texel per level (4 floats)
|
|
93
|
+
* 5 default imagery epoch 6 default texture format
|
|
94
|
+
*
|
|
95
|
+
* NodeMetadata: 1 path_and_flags, 2 epoch, 3 packed OBB, 4 metres-per-texel,
|
|
96
|
+
* 5 child bulk epoch, 7 imagery epoch, 8 texture format.
|
|
97
|
+
*/
|
|
98
|
+
export declare function parseBulkMetadata(bytes: Uint8Array): BulkMetadata;
|
|
99
|
+
/** True when the point falls inside the node's oriented bounding box. */
|
|
100
|
+
export declare function obbContains(node: RocktreeNode, p: Vec3): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* How deep inside its OBB a point sits. Sibling octants overlap because the
|
|
103
|
+
* boxes hug the terrain shell rather than tiling space, so descent picks the
|
|
104
|
+
* most central candidate rather than the first hit.
|
|
105
|
+
*/
|
|
106
|
+
export declare function obbCentrality(node: RocktreeNode, p: Vec3): number;
|
|
107
|
+
/**
|
|
108
|
+
* Slab test of the segment `a`→`b` against a node's box.
|
|
109
|
+
*
|
|
110
|
+
* Deep nodes are thin shells wrapped around the actual ground, so testing a
|
|
111
|
+
* single point at sea level walks straight past any city that is not at sea
|
|
112
|
+
* level. Testing the vertical line through a location instead keeps the
|
|
113
|
+
* descent alive whatever the terrain height, and returns the parameter of the
|
|
114
|
+
* segment's midpoint inside the box for the centrality tie-break.
|
|
115
|
+
*
|
|
116
|
+
* `tMin`/`tMax` bound the part of the segment inside the box, which lets a
|
|
117
|
+
* descent narrow its probe to the altitude band the geometry actually occupies.
|
|
118
|
+
*/
|
|
119
|
+
export declare function obbIntersectsSegment(node: RocktreeNode, a: Vec3, b: Vec3): {
|
|
120
|
+
hit: boolean;
|
|
121
|
+
t: number;
|
|
122
|
+
tMin: number;
|
|
123
|
+
tMax: number;
|
|
124
|
+
};
|
|
125
|
+
export interface RocktreeTexture {
|
|
126
|
+
/** Encoded image bytes — JPEG when `format` is 1. */
|
|
127
|
+
data: Uint8Array;
|
|
128
|
+
format: number;
|
|
129
|
+
width: number;
|
|
130
|
+
height: number;
|
|
131
|
+
}
|
|
132
|
+
export interface RocktreeMesh {
|
|
133
|
+
/** Vertex positions in earth-centred metres. */
|
|
134
|
+
positions: Vec3[];
|
|
135
|
+
/** Triangle-strip vertex indices. */
|
|
136
|
+
strip: number[];
|
|
137
|
+
/** Per-vertex texture coordinates in [0,1], parallel to `positions`. */
|
|
138
|
+
uvs: Array<[number, number]> | null;
|
|
139
|
+
texture: RocktreeTexture | null;
|
|
140
|
+
}
|
|
141
|
+
export interface NodeData {
|
|
142
|
+
/** Column-major 4x4 mesh-space to earth-centred-metres transform. */
|
|
143
|
+
matrixGlobeFromMesh: number[];
|
|
144
|
+
meshes: RocktreeMesh[];
|
|
145
|
+
copyrightIds: number[];
|
|
146
|
+
}
|
|
147
|
+
export declare function nodeDataUrl(params: {
|
|
148
|
+
path: string;
|
|
149
|
+
epoch: number;
|
|
150
|
+
textureFormat?: number;
|
|
151
|
+
imageryEpoch?: number;
|
|
152
|
+
}, base?: string): string;
|
|
153
|
+
/**
|
|
154
|
+
* Decode a NodeData payload.
|
|
155
|
+
*
|
|
156
|
+
* Field layout: 1 globe-from-mesh matrix (16 doubles), 2 repeated Mesh,
|
|
157
|
+
* 3 repeated copyright id. Mesh: 1 vertices, 3 indices, 6 texture,
|
|
158
|
+
* 7 texture coordinates.
|
|
159
|
+
*/
|
|
160
|
+
export declare function parseNodeData(bytes: Uint8Array): NodeData;
|
|
161
|
+
/**
|
|
162
|
+
* Pixel dimensions from a JPEG's SOF marker.
|
|
163
|
+
*
|
|
164
|
+
* Node textures sometimes omit a dimension on the wire, and the image itself
|
|
165
|
+
* is the authority — a square 512 texture that reports only its height would
|
|
166
|
+
* otherwise be read as 256 wide.
|
|
167
|
+
*/
|
|
168
|
+
export declare function readJpegSize(bytes: Uint8Array): {
|
|
169
|
+
width: number;
|
|
170
|
+
height: number;
|
|
171
|
+
} | undefined;
|
|
172
|
+
/** Expand a triangle strip into independent triangles, dropping degenerates. */
|
|
173
|
+
export declare function stripToTriangles(strip: number[]): Array<[number, number, number]>;
|
|
174
|
+
//# sourceMappingURL=earth-rocktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"earth-rocktree.d.ts","sourceRoot":"","sources":["../../src/rpc/earth-rocktree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,UAAY,CAAC;AAI7C;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEvD,eAAO,MAAM,gBAAgB,EAAE,SAAS,cAAc,EAA8B,CAAC;AASrF,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,GAAE,cAAwB,GAAG,MAAM,CAOrE;AAED,sDAAsD;AACtD,eAAO,MAAM,UAAU;IACrB,kDAAkD;;IAElD,yEAAyE;;CAEjE,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;AAgBpD,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,EAAE,CA6BvD;AAoBD,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,SAAI,EAAE,MAAM,SAAsB,GAAG,IAAI,CAKlG;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAC1B,CAAC,EAAE,IAAI,EACP,MAAM,SAAsB,GAC3B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAO3C;AAED,MAAM,WAAW,iBAAiB;IAChC,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,UAAU,EACjB,MAAM,GAAE,cAAwB,GAC/B,iBAAiB,CAKnB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,SAAgB,GAAG,MAAM,CAEjE;AAED,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,cAAc,EAAE,MAAM,CAAC;IACvB,0DAA0D;IAC1D,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,qEAAqE;IACrE,OAAO,EAAE,IAAI,GAAG,IAAI,CAAC;IACrB,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1B,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,SAAgB,GAAG,MAAM,CAEzF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CA2FjE;AAmBD,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAGhE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAIjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,YAAY,EAClB,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,IAAI,GACN;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsBzD;AAED,MAAM,WAAW,eAAe;IAC9B,qDAAqD;IACrD,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,SAAS,EAAE,IAAI,EAAE,CAAC;IAClB,qCAAqC;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,wEAAwE;IACxE,GAAG,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IACpC,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,QAAQ;IACvB,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,EACtF,IAAI,SAAgB,GACnB,MAAM,CAIR;AA4DD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,CAoDzD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CA0B7F;AAED,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAUjF"}
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Earth "rocktree" protocol — the photorealistic 3D octree behind
|
|
3
|
+
* `kh.google.com/rt/earth`.
|
|
4
|
+
*
|
|
5
|
+
* Reverse-engineered from the Maps web client. The renderer never parses the
|
|
6
|
+
* octree on the main thread: Maps ships a Web Worker as an escaped string
|
|
7
|
+
* literal inside its `f0N97d`/mapcore modules, and that worker holds the
|
|
8
|
+
* BulkMetadata reader (`obbCenters` / `obbExtents` / `obbRotations`) this file
|
|
9
|
+
* reimplements. Three endpoints, all anonymous, all `application/x-protobuffer`:
|
|
10
|
+
*
|
|
11
|
+
* GET /rt/{planet}/PlanetoidMetadata
|
|
12
|
+
* GET /rt/{planet}/BulkMetadata/pb=!1m2!1s{path}!2u{epoch}
|
|
13
|
+
* GET /rt/{planet}/NodeData/pb=!1m2!1s{path}!2u{epoch}!2e{texture}!3u{imagery}!4b0
|
|
14
|
+
*
|
|
15
|
+
* Nodes are addressed by an octant path (digits 0-7, one per level). A bulk
|
|
16
|
+
* covers four levels below its head node, so bulk paths are always a multiple
|
|
17
|
+
* of four digits long.
|
|
18
|
+
*/
|
|
19
|
+
import { GMapsError } from '../types/common.js';
|
|
20
|
+
/** Mean planet radius the Earth rocktree is quantised against. */
|
|
21
|
+
export const EARTH_RADIUS_METERS = 6_371_010;
|
|
22
|
+
const ROCKTREE_BASE = 'https://kh.google.com/rt/earth';
|
|
23
|
+
export const ROCKTREE_PLANETS = ['earth', 'mars', 'moon'];
|
|
24
|
+
/** Mean radii used when a PlanetoidMetadata payload omits its radius field. */
|
|
25
|
+
const PLANET_FALLBACK_RADII = {
|
|
26
|
+
earth: EARTH_RADIUS_METERS,
|
|
27
|
+
mars: 3_389_500,
|
|
28
|
+
moon: 1_737_400,
|
|
29
|
+
};
|
|
30
|
+
/** Per-planet rocktree host segment. Throws on unsupported planet names. */
|
|
31
|
+
export function rocktreeBase(planet = 'earth') {
|
|
32
|
+
if (!ROCKTREE_PLANETS.includes(planet)) {
|
|
33
|
+
throw new GMapsError(`Unsupported rocktree planet "${planet}". Google serves: ${ROCKTREE_PLANETS.join(', ')}.`);
|
|
34
|
+
}
|
|
35
|
+
return planet === 'earth' ? ROCKTREE_BASE : `https://kh.google.com/rt/${planet}`;
|
|
36
|
+
}
|
|
37
|
+
/** Node flag bits decoded out of `path_and_flags`. */
|
|
38
|
+
export const NODE_FLAGS = {
|
|
39
|
+
/** Node publishes no NodeData — metadata only. */
|
|
40
|
+
NO_DATA: 8,
|
|
41
|
+
/** NodeData must carry `!3u{imageryEpoch}` or the server answers 404. */
|
|
42
|
+
USE_IMAGERY_EPOCH: 16,
|
|
43
|
+
};
|
|
44
|
+
function readVarint(bytes, offset) {
|
|
45
|
+
let result = 0;
|
|
46
|
+
let scale = 1;
|
|
47
|
+
let i = offset;
|
|
48
|
+
for (;;) {
|
|
49
|
+
const byte = bytes[i++];
|
|
50
|
+
if (byte === undefined)
|
|
51
|
+
throw new Error('rocktree: truncated varint');
|
|
52
|
+
result += (byte & 0x7f) * scale;
|
|
53
|
+
scale *= 128;
|
|
54
|
+
if ((byte & 0x80) === 0)
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
return [result, i];
|
|
58
|
+
}
|
|
59
|
+
/** Split one protobuf message into `[fieldNumber, value]` pairs (no schema). */
|
|
60
|
+
export function readFields(bytes) {
|
|
61
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
62
|
+
const out = [];
|
|
63
|
+
let i = 0;
|
|
64
|
+
while (i < bytes.length) {
|
|
65
|
+
const [tag, next] = readVarint(bytes, i);
|
|
66
|
+
i = next;
|
|
67
|
+
const field = tag >> 3;
|
|
68
|
+
const wire = tag & 7;
|
|
69
|
+
if (wire === 0) {
|
|
70
|
+
const [value, n] = readVarint(bytes, i);
|
|
71
|
+
i = n;
|
|
72
|
+
out.push([field, value]);
|
|
73
|
+
}
|
|
74
|
+
else if (wire === 5) {
|
|
75
|
+
out.push([field, view.getFloat32(i, true)]);
|
|
76
|
+
i += 4;
|
|
77
|
+
}
|
|
78
|
+
else if (wire === 1) {
|
|
79
|
+
out.push([field, view.getFloat64(i, true)]);
|
|
80
|
+
i += 8;
|
|
81
|
+
}
|
|
82
|
+
else if (wire === 2) {
|
|
83
|
+
const [len, n] = readVarint(bytes, i);
|
|
84
|
+
i = n;
|
|
85
|
+
out.push([field, bytes.subarray(n, n + len)]);
|
|
86
|
+
i = n + len;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
94
|
+
function num(fields, field) {
|
|
95
|
+
const hit = fields.find((f) => f[0] === field);
|
|
96
|
+
return typeof hit?.[1] === 'number' ? hit[1] : undefined;
|
|
97
|
+
}
|
|
98
|
+
function bin(fields, field) {
|
|
99
|
+
const hit = fields.find((f) => f[0] === field);
|
|
100
|
+
return hit && hit[1] instanceof Uint8Array ? hit[1] : undefined;
|
|
101
|
+
}
|
|
102
|
+
function allBin(fields, field) {
|
|
103
|
+
return fields.filter((f) => f[0] === field && f[1] instanceof Uint8Array).map((f) => f[1]);
|
|
104
|
+
}
|
|
105
|
+
function viewOf(bytes) {
|
|
106
|
+
return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
107
|
+
}
|
|
108
|
+
/** Geodetic (spherical) lat/lng/alt to planet-centred metres. */
|
|
109
|
+
export function latLngToEcef(lat, lng, alt = 0, radius = EARTH_RADIUS_METERS) {
|
|
110
|
+
const phi = (lat * Math.PI) / 180;
|
|
111
|
+
const lambda = (lng * Math.PI) / 180;
|
|
112
|
+
const r = radius + alt;
|
|
113
|
+
return [r * Math.cos(phi) * Math.cos(lambda), r * Math.cos(phi) * Math.sin(lambda), r * Math.sin(phi)];
|
|
114
|
+
}
|
|
115
|
+
/** Planet-centred metres back to lat/lng plus height above the reference sphere. */
|
|
116
|
+
export function ecefToLatLng(p, radius = EARTH_RADIUS_METERS) {
|
|
117
|
+
const r = Math.hypot(p[0], p[1], p[2]);
|
|
118
|
+
return {
|
|
119
|
+
lat: (Math.asin(p[2] / r) * 180) / Math.PI,
|
|
120
|
+
lng: (Math.atan2(p[1], p[0]) * 180) / Math.PI,
|
|
121
|
+
alt: r - radius,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
export function parsePlanetoidMetadata(bytes, planet = 'earth') {
|
|
125
|
+
const top = readFields(bytes);
|
|
126
|
+
const key = bin(top, 1);
|
|
127
|
+
const rootEpoch = key ? (num(readFields(key), 2) ?? 0) : 0;
|
|
128
|
+
return { rootEpoch, radius: num(top, 2) ?? PLANET_FALLBACK_RADII[planet] };
|
|
129
|
+
}
|
|
130
|
+
export function planetoidMetadataUrl(base = ROCKTREE_BASE) {
|
|
131
|
+
return `${base}/PlanetoidMetadata`;
|
|
132
|
+
}
|
|
133
|
+
export function bulkMetadataUrl(path, epoch, base = ROCKTREE_BASE) {
|
|
134
|
+
return `${base}/BulkMetadata/pb=!1m2!1s${path}!2u${epoch}`;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Decode a BulkMetadata payload.
|
|
138
|
+
*
|
|
139
|
+
* Field layout (from the Maps octree worker):
|
|
140
|
+
* 1 repeated NodeMetadata 3 head node centre (3 doubles)
|
|
141
|
+
* 2 head node key 4 metres-per-texel per level (4 floats)
|
|
142
|
+
* 5 default imagery epoch 6 default texture format
|
|
143
|
+
*
|
|
144
|
+
* NodeMetadata: 1 path_and_flags, 2 epoch, 3 packed OBB, 4 metres-per-texel,
|
|
145
|
+
* 5 child bulk epoch, 7 imagery epoch, 8 texture format.
|
|
146
|
+
*/
|
|
147
|
+
export function parseBulkMetadata(bytes) {
|
|
148
|
+
const top = readFields(bytes);
|
|
149
|
+
const headCenterBytes = bin(top, 3);
|
|
150
|
+
const headCenter = headCenterBytes
|
|
151
|
+
? [
|
|
152
|
+
viewOf(headCenterBytes).getFloat64(0, true),
|
|
153
|
+
viewOf(headCenterBytes).getFloat64(8, true),
|
|
154
|
+
viewOf(headCenterBytes).getFloat64(16, true),
|
|
155
|
+
]
|
|
156
|
+
: [0, 0, 0];
|
|
157
|
+
const mptBytes = bin(top, 4);
|
|
158
|
+
const levelMetersPerTexel = mptBytes
|
|
159
|
+
? [0, 1, 2, 3].map((i) => viewOf(mptBytes).getFloat32(i * 4, true))
|
|
160
|
+
: [0, 0, 0, 0];
|
|
161
|
+
const keyBytes = bin(top, 2);
|
|
162
|
+
const keyFields = keyBytes ? readFields(keyBytes) : [];
|
|
163
|
+
const headPathBytes = bin(keyFields, 1);
|
|
164
|
+
const headPath = headPathBytes ? Buffer.from(headPathBytes).toString('utf8') : '';
|
|
165
|
+
const headEpoch = num(keyFields, 2) ?? 0;
|
|
166
|
+
const defaultImageryEpoch = num(top, 5) ?? 0;
|
|
167
|
+
const defaultTextureFormat = num(top, 6) ?? 6;
|
|
168
|
+
const nodes = allBin(top, 1).map((nodeBytes) => {
|
|
169
|
+
const f = readFields(nodeBytes);
|
|
170
|
+
const packed = num(f, 1) ?? 0;
|
|
171
|
+
const level = (packed & 3) + 1;
|
|
172
|
+
const pathBits = (packed >> 2) & ((1 << (3 * level)) - 1);
|
|
173
|
+
let path = '';
|
|
174
|
+
for (let i = 0; i < level; i++)
|
|
175
|
+
path += String((pathBits >> (3 * i)) & 7);
|
|
176
|
+
const flags = packed >> (2 + 3 * level);
|
|
177
|
+
let metersPerTexel = num(f, 4) ?? 0;
|
|
178
|
+
if (!metersPerTexel)
|
|
179
|
+
metersPerTexel = levelMetersPerTexel[level - 1] ?? 0;
|
|
180
|
+
const obb = bin(f, 3);
|
|
181
|
+
let center = null;
|
|
182
|
+
let extents = null;
|
|
183
|
+
let rotation = null;
|
|
184
|
+
if (obb && obb.length >= 15) {
|
|
185
|
+
const dv = viewOf(obb);
|
|
186
|
+
center = [
|
|
187
|
+
dv.getInt16(0, true) * metersPerTexel + headCenter[0],
|
|
188
|
+
dv.getInt16(2, true) * metersPerTexel + headCenter[1],
|
|
189
|
+
dv.getInt16(4, true) * metersPerTexel + headCenter[2],
|
|
190
|
+
];
|
|
191
|
+
extents = [obb[6] * metersPerTexel, obb[7] * metersPerTexel, obb[8] * metersPerTexel];
|
|
192
|
+
// Three quantised Euler angles, not a quaternion — note the differing scales.
|
|
193
|
+
const yaw = (dv.getUint16(9, true) * Math.PI) / 32768;
|
|
194
|
+
const pitch = (dv.getUint16(11, true) * Math.PI) / 65536;
|
|
195
|
+
const roll = (dv.getUint16(13, true) * Math.PI) / 32768;
|
|
196
|
+
const c0 = Math.cos(yaw);
|
|
197
|
+
const s0 = Math.sin(yaw);
|
|
198
|
+
const c1 = Math.cos(pitch);
|
|
199
|
+
const s1 = Math.sin(pitch);
|
|
200
|
+
const c2 = Math.cos(roll);
|
|
201
|
+
const s2 = Math.sin(roll);
|
|
202
|
+
const m = [
|
|
203
|
+
c0 * c2 - c1 * s0 * s2,
|
|
204
|
+
c1 * c0 * s2 + c2 * s0,
|
|
205
|
+
s2 * s1,
|
|
206
|
+
-c0 * s2 - c2 * c1 * s0,
|
|
207
|
+
c0 * c1 * c2 - s0 * s2,
|
|
208
|
+
c2 * s1,
|
|
209
|
+
s1 * s0,
|
|
210
|
+
-c0 * s1,
|
|
211
|
+
c1,
|
|
212
|
+
];
|
|
213
|
+
rotation = [m[0], m[3], m[6], m[1], m[4], m[7], m[2], m[5], m[8]];
|
|
214
|
+
}
|
|
215
|
+
return {
|
|
216
|
+
path,
|
|
217
|
+
level,
|
|
218
|
+
flags,
|
|
219
|
+
epoch: num(f, 2) ?? headEpoch,
|
|
220
|
+
bulkMetadataEpoch: num(f, 5) ?? headEpoch,
|
|
221
|
+
imageryEpoch: num(f, 7) ?? defaultImageryEpoch,
|
|
222
|
+
textureFormat: num(f, 8) ?? defaultTextureFormat,
|
|
223
|
+
metersPerTexel,
|
|
224
|
+
center,
|
|
225
|
+
extents,
|
|
226
|
+
rotation,
|
|
227
|
+
hasData: (flags & NODE_FLAGS.NO_DATA) === 0,
|
|
228
|
+
};
|
|
229
|
+
});
|
|
230
|
+
return { headPath, headEpoch, nodes };
|
|
231
|
+
}
|
|
232
|
+
/** Point coordinates in a node's own OBB frame, normalised to its half-extents. */
|
|
233
|
+
function obbNormalizedOffset(node, p) {
|
|
234
|
+
if (!node.center || !node.extents || !node.rotation)
|
|
235
|
+
return null;
|
|
236
|
+
const d = [p[0] - node.center[0], p[1] - node.center[1], p[2] - node.center[2]];
|
|
237
|
+
const r = node.rotation;
|
|
238
|
+
const local = [
|
|
239
|
+
d[0] * r[0] + d[1] * r[3] + d[2] * r[6],
|
|
240
|
+
d[0] * r[1] + d[1] * r[4] + d[2] * r[7],
|
|
241
|
+
d[0] * r[2] + d[1] * r[5] + d[2] * r[8],
|
|
242
|
+
];
|
|
243
|
+
return [
|
|
244
|
+
node.extents[0] === 0 ? Infinity : local[0] / node.extents[0],
|
|
245
|
+
node.extents[1] === 0 ? Infinity : local[1] / node.extents[1],
|
|
246
|
+
node.extents[2] === 0 ? Infinity : local[2] / node.extents[2],
|
|
247
|
+
];
|
|
248
|
+
}
|
|
249
|
+
/** True when the point falls inside the node's oriented bounding box. */
|
|
250
|
+
export function obbContains(node, p) {
|
|
251
|
+
const n = obbNormalizedOffset(node, p);
|
|
252
|
+
return n !== null && Math.abs(n[0]) <= 1 && Math.abs(n[1]) <= 1 && Math.abs(n[2]) <= 1;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* How deep inside its OBB a point sits. Sibling octants overlap because the
|
|
256
|
+
* boxes hug the terrain shell rather than tiling space, so descent picks the
|
|
257
|
+
* most central candidate rather than the first hit.
|
|
258
|
+
*/
|
|
259
|
+
export function obbCentrality(node, p) {
|
|
260
|
+
const n = obbNormalizedOffset(node, p);
|
|
261
|
+
if (!n)
|
|
262
|
+
return Infinity;
|
|
263
|
+
return Math.max(Math.abs(n[0]), Math.abs(n[1]), Math.abs(n[2]));
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Slab test of the segment `a`→`b` against a node's box.
|
|
267
|
+
*
|
|
268
|
+
* Deep nodes are thin shells wrapped around the actual ground, so testing a
|
|
269
|
+
* single point at sea level walks straight past any city that is not at sea
|
|
270
|
+
* level. Testing the vertical line through a location instead keeps the
|
|
271
|
+
* descent alive whatever the terrain height, and returns the parameter of the
|
|
272
|
+
* segment's midpoint inside the box for the centrality tie-break.
|
|
273
|
+
*
|
|
274
|
+
* `tMin`/`tMax` bound the part of the segment inside the box, which lets a
|
|
275
|
+
* descent narrow its probe to the altitude band the geometry actually occupies.
|
|
276
|
+
*/
|
|
277
|
+
export function obbIntersectsSegment(node, a, b) {
|
|
278
|
+
const miss = { hit: false, t: 0, tMin: 0, tMax: 0 };
|
|
279
|
+
if (!node.center || !node.extents || !node.rotation)
|
|
280
|
+
return miss;
|
|
281
|
+
const la = obbNormalizedOffset(node, a);
|
|
282
|
+
const lb = obbNormalizedOffset(node, b);
|
|
283
|
+
let tMin = 0;
|
|
284
|
+
let tMax = 1;
|
|
285
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
286
|
+
const start = la[axis];
|
|
287
|
+
const delta = lb[axis] - start;
|
|
288
|
+
if (Math.abs(delta) < 1e-12) {
|
|
289
|
+
if (Math.abs(start) > 1)
|
|
290
|
+
return miss;
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
const t1 = (-1 - start) / delta;
|
|
294
|
+
const t2 = (1 - start) / delta;
|
|
295
|
+
tMin = Math.max(tMin, Math.min(t1, t2));
|
|
296
|
+
tMax = Math.min(tMax, Math.max(t1, t2));
|
|
297
|
+
if (tMin > tMax)
|
|
298
|
+
return miss;
|
|
299
|
+
}
|
|
300
|
+
return { hit: true, t: (tMin + tMax) / 2, tMin, tMax };
|
|
301
|
+
}
|
|
302
|
+
export function nodeDataUrl(params, base = ROCKTREE_BASE) {
|
|
303
|
+
const texture = params.textureFormat ?? 1;
|
|
304
|
+
const imagery = params.imageryEpoch !== undefined ? `!3u${params.imageryEpoch}` : '';
|
|
305
|
+
return `${base}/NodeData/pb=!1m2!1s${params.path}!2u${params.epoch}!2e${texture}${imagery}!4b0`;
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Positions are three byte planes of running deltas (x plane, then y, then z),
|
|
309
|
+
* each wrapping at 256 — the renderer expands them straight into the
|
|
310
|
+
* mesh-space cube the node matrix maps onto the globe.
|
|
311
|
+
*/
|
|
312
|
+
function decodeVertices(packed) {
|
|
313
|
+
const count = Math.floor(packed.length / 3);
|
|
314
|
+
const out = [];
|
|
315
|
+
let x = 0;
|
|
316
|
+
let y = 0;
|
|
317
|
+
let z = 0;
|
|
318
|
+
for (let i = 0; i < count; i++) {
|
|
319
|
+
x = (x + packed[i]) & 0xff;
|
|
320
|
+
y = (y + packed[count + i]) & 0xff;
|
|
321
|
+
z = (z + packed[2 * count + i]) & 0xff;
|
|
322
|
+
out.push([x, y, z]);
|
|
323
|
+
}
|
|
324
|
+
return out;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Indices are a triangle strip stored as "distance back from the running high
|
|
328
|
+
* water mark": a zero delta pushes a fresh vertex, anything else reuses one.
|
|
329
|
+
*/
|
|
330
|
+
function decodeIndices(packed) {
|
|
331
|
+
let [count, offset] = readVarint(packed, 0);
|
|
332
|
+
const strip = [];
|
|
333
|
+
let zeros = 0;
|
|
334
|
+
for (let i = 0; i < count; i++) {
|
|
335
|
+
const [delta, next] = readVarint(packed, offset);
|
|
336
|
+
offset = next;
|
|
337
|
+
strip.push(zeros - delta);
|
|
338
|
+
if (delta === 0)
|
|
339
|
+
zeros++;
|
|
340
|
+
}
|
|
341
|
+
return strip;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Texture coordinates are two byte-pair planes of running deltas taken modulo
|
|
345
|
+
* a per-mesh wrap value carried in the first four bytes.
|
|
346
|
+
*/
|
|
347
|
+
function decodeTexCoords(packed, count) {
|
|
348
|
+
if (packed.length < 4 + count * 4)
|
|
349
|
+
return null;
|
|
350
|
+
const dv = viewOf(packed);
|
|
351
|
+
const uMod = 1 + dv.getUint16(0, true);
|
|
352
|
+
const vMod = 1 + dv.getUint16(2, true);
|
|
353
|
+
const data = packed.subarray(4);
|
|
354
|
+
const out = [];
|
|
355
|
+
let u = 0;
|
|
356
|
+
let v = 0;
|
|
357
|
+
for (let i = 0; i < count; i++) {
|
|
358
|
+
u = (u + data[i] + (data[i + 2 * count] << 8)) % uMod;
|
|
359
|
+
v = (v + data[i + count] + (data[i + 3 * count] << 8)) % vMod;
|
|
360
|
+
out.push([(u + 0.5) / uMod, (v + 0.5) / vMod]);
|
|
361
|
+
}
|
|
362
|
+
return out;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Decode a NodeData payload.
|
|
366
|
+
*
|
|
367
|
+
* Field layout: 1 globe-from-mesh matrix (16 doubles), 2 repeated Mesh,
|
|
368
|
+
* 3 repeated copyright id. Mesh: 1 vertices, 3 indices, 6 texture,
|
|
369
|
+
* 7 texture coordinates.
|
|
370
|
+
*/
|
|
371
|
+
export function parseNodeData(bytes) {
|
|
372
|
+
const top = readFields(bytes);
|
|
373
|
+
const matrixBytes = bin(top, 1);
|
|
374
|
+
const matrix = [];
|
|
375
|
+
if (matrixBytes && matrixBytes.length >= 128) {
|
|
376
|
+
const dv = viewOf(matrixBytes);
|
|
377
|
+
for (let i = 0; i < 16; i++)
|
|
378
|
+
matrix.push(dv.getFloat64(i * 8, true));
|
|
379
|
+
}
|
|
380
|
+
const apply = (v) => {
|
|
381
|
+
if (matrix.length !== 16)
|
|
382
|
+
return [v[0], v[1], v[2]];
|
|
383
|
+
return [
|
|
384
|
+
matrix[0] * v[0] + matrix[4] * v[1] + matrix[8] * v[2] + matrix[12],
|
|
385
|
+
matrix[1] * v[0] + matrix[5] * v[1] + matrix[9] * v[2] + matrix[13],
|
|
386
|
+
matrix[2] * v[0] + matrix[6] * v[1] + matrix[10] * v[2] + matrix[14],
|
|
387
|
+
];
|
|
388
|
+
};
|
|
389
|
+
const meshes = allBin(top, 2).map((meshBytes) => {
|
|
390
|
+
const mf = readFields(meshBytes);
|
|
391
|
+
const vertexBytes = bin(mf, 1);
|
|
392
|
+
const local = vertexBytes ? decodeVertices(vertexBytes) : [];
|
|
393
|
+
const indexBytes = bin(mf, 3);
|
|
394
|
+
const uvBytes = bin(mf, 7);
|
|
395
|
+
const textureBytes = bin(mf, 6);
|
|
396
|
+
let texture = null;
|
|
397
|
+
if (textureBytes) {
|
|
398
|
+
const tf = readFields(textureBytes);
|
|
399
|
+
const data = bin(tf, 1);
|
|
400
|
+
if (data) {
|
|
401
|
+
texture = {
|
|
402
|
+
data,
|
|
403
|
+
format: num(tf, 2) ?? 0,
|
|
404
|
+
width: num(tf, 3) ?? 0,
|
|
405
|
+
height: num(tf, 4) ?? 0,
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
positions: local.map(apply),
|
|
411
|
+
strip: indexBytes ? decodeIndices(indexBytes) : [],
|
|
412
|
+
uvs: uvBytes ? decodeTexCoords(uvBytes, local.length) : null,
|
|
413
|
+
texture,
|
|
414
|
+
};
|
|
415
|
+
});
|
|
416
|
+
const copyrightIds = top.filter((f) => f[0] === 3 && typeof f[1] === 'number').map((f) => f[1]);
|
|
417
|
+
return { matrixGlobeFromMesh: matrix, meshes, copyrightIds };
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Pixel dimensions from a JPEG's SOF marker.
|
|
421
|
+
*
|
|
422
|
+
* Node textures sometimes omit a dimension on the wire, and the image itself
|
|
423
|
+
* is the authority — a square 512 texture that reports only its height would
|
|
424
|
+
* otherwise be read as 256 wide.
|
|
425
|
+
*/
|
|
426
|
+
export function readJpegSize(bytes) {
|
|
427
|
+
if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8)
|
|
428
|
+
return undefined;
|
|
429
|
+
let i = 2;
|
|
430
|
+
while (i + 9 < bytes.length) {
|
|
431
|
+
if (bytes[i] !== 0xff) {
|
|
432
|
+
i++;
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
435
|
+
const marker = bytes[i + 1];
|
|
436
|
+
// Standalone markers carry no length; everything else does.
|
|
437
|
+
if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {
|
|
438
|
+
i += 2;
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
const length = (bytes[i + 2] << 8) | bytes[i + 3];
|
|
442
|
+
// SOF0-SOF15, excluding the DHT/JPG/DAC markers interleaved in that range.
|
|
443
|
+
if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {
|
|
444
|
+
return {
|
|
445
|
+
height: (bytes[i + 5] << 8) | bytes[i + 6],
|
|
446
|
+
width: (bytes[i + 7] << 8) | bytes[i + 8],
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
if (length < 2)
|
|
450
|
+
return undefined;
|
|
451
|
+
i += 2 + length;
|
|
452
|
+
}
|
|
453
|
+
return undefined;
|
|
454
|
+
}
|
|
455
|
+
/** Expand a triangle strip into independent triangles, dropping degenerates. */
|
|
456
|
+
export function stripToTriangles(strip) {
|
|
457
|
+
const tris = [];
|
|
458
|
+
for (let i = 0; i + 2 < strip.length; i++) {
|
|
459
|
+
const a = strip[i];
|
|
460
|
+
const b = strip[i + 1];
|
|
461
|
+
const c = strip[i + 2];
|
|
462
|
+
if (a === b || b === c || a === c)
|
|
463
|
+
continue;
|
|
464
|
+
tris.push(i % 2 === 0 ? [a, b, c] : [a, c, b]);
|
|
465
|
+
}
|
|
466
|
+
return tris;
|
|
467
|
+
}
|
|
468
|
+
//# sourceMappingURL=earth-rocktree.js.map
|