Google 地图创建带有地理位置的标记
Google maps create marker with geolocations
我正在尝试使用 React 创建带有标记的 google 地图,它适用于地址而不是 lat/lng 值。如您所见,该组件在挂载时创建一个脚本标记,并通过 google.maps... 函数初始化地图和标记。如果我用 lat/lng 创建一个标记,它工作正常,但我想按地址搜索。所以这是我的代码,你能找到错误吗?
我没有使用任何包,也想坚持下去。 (没有包裹!)
另一个问题是我必须以什么格式写这些地址。街道、邮政编码、城市?
Stack overflow 需要更多文本,很抱歉重复了一遍。
export interface ProjectsListMapProps {
}
export default class ProjectsListMap extends React.Component<ProjectsListMapProps> {
constructor(props: ProjectsListMapProps) {
super(props);
this.renderMap = this.renderMap.bind(this);
this.mapContainer = this.mapContainer.bind(this);
this.codeAddress = this.codeAddress.bind(this);
}
componentDidMount() {
if (!document.querySelectorAll(`[src="${'https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY'}"]`).length) {
document.body.appendChild(Object.assign(
document.createElement('script'), {
type: 'text/javascript',
src: 'https://maps.googleapis.com/maps/api/js',
onload: () => this.renderMap()
}
));
}
}
renderMap() {
const coords = { lat: 41.375885, lng: 2.177813 };
const el = document.getElementById('map');
if (el) {
const map = new google.maps.Map(el, {
zoom: 16,
center: {
lat: coords.lat,
lng: coords.lng
}
});
const geocoder = new google.maps.Geocoder();
this.codeAddress(geocoder, map);
return map;
}
else {
return null;
}
}
codeAddress(geocoder: any, map: any) {
geocoder.geocode({'address': 'Budapest'}, function(results: any, status: any) {
console.log(results);
if (status === 'OK') {
map.setCenter(results[0].geometry.location);
const marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
return marker;
}
else {
return null;
}
});
}
render() {
return(
<div className="card map-holder">
<div id="map" />
</div>
);
}
}
我的日志 returns 结果是一个空数组。
看起来您的代码使用的是 Google 地图 JavaScript 地理编码服务,而不是地理定位。
经检查,地理编码服务似乎现在工作正常,但您仍在代码中对地址值进行硬编码。为了进一步帮助您,我调整了您的代码并为您的地址添加了文本输入字段。这里是 sample code.
var map;
class BookSlider extends React.Component {
constructor(props) {
super(props);
this.renderMap = this.renderMap.bind(this);
this.handleInputChange = this.handleInputChange.bind(this);
this.handleClick = this.handleClick.bind(this);
this.state = {
input: ""
};
}
componentDidMount() {
// ADD API KEY HERE
if (
!document.querySelectorAll(
`[src="${"https://maps.googleapis.com/maps/api/js?key=API_KEY"}"]`
).length
) {
document.body.appendChild(
Object.assign(document.createElement("script"), {
type: "text/javascript",
// ADD API KEY HERE
src:
"https://maps.googleapis.com/maps/api/js?key=API_KEY",
onload: () => this.renderMap()
})
);
}
}
renderMap() {
const coords = { lat: 41.375885, lng: 2.177813 };
const el = document.getElementById("map");
if (el) {
map = new google.maps.Map(el, {
zoom: 16,
center: {
lat: coords.lat,
lng: coords.lng
}
});
return map;
} else {
return null;
}
}
handleInputChange(event) {
const target = event.target;
const value = target.type === "checkbox" ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value
});
}
handleClick(event) {
const geocoder = new google.maps.Geocoder();
this.codeAddress(geocoder);
event.preventDefault();
}
// THIS CRASHES if you comment it out //
codeAddress(geocoder) {
var address = this.state.input;
geocoder.geocode({ address: address }, function(results, status) {
console.log(results);
if (status === "OK") {
map.setCenter(results[0].geometry.location);
const marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
return marker;
} else {
return null;
}
});
}
render() {
return (
<section className="partial-book-slider">
<h1>ADD YOUR API KEY TO MAKE IT WORKIN</h1>
<input
id="input"
name="input"
value={this.state.input}
onChange={this.handleInputChange}
/>
<button id="submit" onClick={this.handleClick}>
{" "}
Search
</button>
<div className="card map-holder">
<div id="map" />
</div>
</section>
);
}
}
/*
* Render the above component into the div#app
*/
React.render(<BookSlider />, document.getElementById("app"));
我正在尝试使用 React 创建带有标记的 google 地图,它适用于地址而不是 lat/lng 值。如您所见,该组件在挂载时创建一个脚本标记,并通过 google.maps... 函数初始化地图和标记。如果我用 lat/lng 创建一个标记,它工作正常,但我想按地址搜索。所以这是我的代码,你能找到错误吗? 我没有使用任何包,也想坚持下去。 (没有包裹!) 另一个问题是我必须以什么格式写这些地址。街道、邮政编码、城市?
Stack overflow 需要更多文本,很抱歉重复了一遍。
export interface ProjectsListMapProps {
}
export default class ProjectsListMap extends React.Component<ProjectsListMapProps> {
constructor(props: ProjectsListMapProps) {
super(props);
this.renderMap = this.renderMap.bind(this);
this.mapContainer = this.mapContainer.bind(this);
this.codeAddress = this.codeAddress.bind(this);
}
componentDidMount() {
if (!document.querySelectorAll(`[src="${'https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY'}"]`).length) {
document.body.appendChild(Object.assign(
document.createElement('script'), {
type: 'text/javascript',
src: 'https://maps.googleapis.com/maps/api/js',
onload: () => this.renderMap()
}
));
}
}
renderMap() {
const coords = { lat: 41.375885, lng: 2.177813 };
const el = document.getElementById('map');
if (el) {
const map = new google.maps.Map(el, {
zoom: 16,
center: {
lat: coords.lat,
lng: coords.lng
}
});
const geocoder = new google.maps.Geocoder();
this.codeAddress(geocoder, map);
return map;
}
else {
return null;
}
}
codeAddress(geocoder: any, map: any) {
geocoder.geocode({'address': 'Budapest'}, function(results: any, status: any) {
console.log(results);
if (status === 'OK') {
map.setCenter(results[0].geometry.location);
const marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
return marker;
}
else {
return null;
}
});
}
render() {
return(
<div className="card map-holder">
<div id="map" />
</div>
);
}
}
我的日志 returns 结果是一个空数组。
看起来您的代码使用的是 Google 地图 JavaScript 地理编码服务,而不是地理定位。
经检查,地理编码服务似乎现在工作正常,但您仍在代码中对地址值进行硬编码。为了进一步帮助您,我调整了您的代码并为您的地址添加了文本输入字段。这里是 sample code.
var map;
class BookSlider extends React.Component {
constructor(props) {
super(props);
this.renderMap = this.renderMap.bind(this);
this.handleInputChange = this.handleInputChange.bind(this);
this.handleClick = this.handleClick.bind(this);
this.state = {
input: ""
};
}
componentDidMount() {
// ADD API KEY HERE
if (
!document.querySelectorAll(
`[src="${"https://maps.googleapis.com/maps/api/js?key=API_KEY"}"]`
).length
) {
document.body.appendChild(
Object.assign(document.createElement("script"), {
type: "text/javascript",
// ADD API KEY HERE
src:
"https://maps.googleapis.com/maps/api/js?key=API_KEY",
onload: () => this.renderMap()
})
);
}
}
renderMap() {
const coords = { lat: 41.375885, lng: 2.177813 };
const el = document.getElementById("map");
if (el) {
map = new google.maps.Map(el, {
zoom: 16,
center: {
lat: coords.lat,
lng: coords.lng
}
});
return map;
} else {
return null;
}
}
handleInputChange(event) {
const target = event.target;
const value = target.type === "checkbox" ? target.checked : target.value;
const name = target.name;
this.setState({
[name]: value
});
}
handleClick(event) {
const geocoder = new google.maps.Geocoder();
this.codeAddress(geocoder);
event.preventDefault();
}
// THIS CRASHES if you comment it out //
codeAddress(geocoder) {
var address = this.state.input;
geocoder.geocode({ address: address }, function(results, status) {
console.log(results);
if (status === "OK") {
map.setCenter(results[0].geometry.location);
const marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
return marker;
} else {
return null;
}
});
}
render() {
return (
<section className="partial-book-slider">
<h1>ADD YOUR API KEY TO MAKE IT WORKIN</h1>
<input
id="input"
name="input"
value={this.state.input}
onChange={this.handleInputChange}
/>
<button id="submit" onClick={this.handleClick}>
{" "}
Search
</button>
<div className="card map-holder">
<div id="map" />
</div>
</section>
);
}
}
/*
* Render the above component into the div#app
*/
React.render(<BookSlider />, document.getElementById("app"));